src/app/api/superadmin/categories/route.ts
Annotation non disponible
Lance npm run annotate (nécessite ANTHROPIC_API_KEY dans .env.local) pour générer une annotation française par Claude Haiku 4.5.
Concepts détectés — comprends la théorie
ORM Prisma
6 occurrencesCe fichier accède à la base de données via Prisma. Prisma est l'ORM utilisé côté backend pour les requêtes typées sur PostgreSQL.
Voir l'article général
Route API Next.js
6 occurrencesCe fichier est une route API Next.js (App Router). Voir le contrat API complet pour les conventions de réponse et d'auth.
Voir l'article général
4 exports
GETPOSTPUTDELETE
Code source· typescript
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma/client";
import { getSession } from "@/lib/auth/session";
async function checkAuth() {
const session = await getSession();
if (!session || session.role !== "SUPER_ADMIN") return false;
return true;
}
async function getCategories() {
return prisma.categorieWari.findMany({
where: { parentId: null },
include: {
enfants: { orderBy: { nom: "asc" } },
_count: { select: { tenantsWari: true } },
},
orderBy: { nom: "asc" },
});
}
export async function GET() {
if (!await checkAuth()) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
const cats = await getCategories();
return NextResponse.json({
categories: cats.map(c => ({
id: c.id, nom: c.nom, slug: c.slug, couleur: c.couleur, emoji: c.emoji,
nbVitrines: c._count.tenantsWari,
enfants: c.enfants.map(e => ({ id: e.id, nom: e.nom, slug: e.slug, couleur: e.couleur, emoji: e.emoji })),
}))
});
}
export async function POST(req: NextRequest) {
if (!await checkAuth()) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
const { nom, slug, emoji, couleur, parentId } = await req.json();
if (!nom || !slug) return NextResponse.json({ error: "Nom et slug requis" }, { status: 400 });
const exists = await prisma.categorieWari.findUnique({ where: { slug } });
if (exists) return NextResponse.json({ error: "Ce slug existe déjà" }, { status: 400 });
const cat = await prisma.categorieWari.create({
data: { nom, slug, emoji: emoji || null, couleur: couleur || null, parentId: parentId || null },
});
return NextResponse.json({ success: true, cat });
}
export async function PUT(req: NextRequest) {
if (!await checkAuth()) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
const { id, nom, slug, emoji, couleur } = await req.json();
if (!id || !nom || !slug) return NextResponse.json({ error: "Données manquantes" }, { status: 400 });
const cat = await prisma.categorieWari.update({
where: { id },
data: { nom, slug, emoji: emoji || null, couleur: couleur || null },
});
return NextResponse.json({ success: true, cat });
}
export async function DELETE(req: NextRequest) {
if (!await checkAuth()) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
const { id } = await req.json();
await prisma.categorieWari.delete({ where: { id } });
return NextResponse.json({ success: true });
}
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma/client";
import { getSession } from "@/lib/auth/session";
async function checkAuth() {
const session = await getSession();
if (!session || session.role !== "SUPER_ADMIN") return false;
return true;
}
async function getCategories() {
return prisma.categorieWari.findMany({
where: { parentId: null },
include: {
enfants: { orderBy: { nom: "asc" } },
_count: { select: { tenantsWari: true } },
},
orderBy: { nom: "asc" },
});
}
export async function GET() {
if (!await checkAuth()) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
const cats = await getCategories();
return NextResponse.json({
categories: cats.map(c => ({
id: c.id, nom: c.nom, slug: c.slug, couleur: c.couleur, emoji: c.emoji,
nbVitrines: c._count.tenantsWari,
enfants: c.enfants.map(e => ({ id: e.id, nom: e.nom, slug: e.slug, couleur: e.couleur, emoji: e.emoji })),
}))
});
}
export async function POST(req: NextRequest) {
if (!await checkAuth()) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
const { nom, slug, emoji, couleur, parentId } = await req.json();
if (!nom || !slug) return NextResponse.json({ error: "Nom et slug requis" }, { status: 400 });
const exists = await prisma.categorieWari.findUnique({ where: { slug } });
if (exists) return NextResponse.json({ error: "Ce slug existe déjà" }, { status: 400 });
const cat = await prisma.categorieWari.create({
data: { nom, slug, emoji: emoji || null, couleur: couleur || null, parentId: parentId || null },
});
return NextResponse.json({ success: true, cat });
}
export async function PUT(req: NextRequest) {
if (!await checkAuth()) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
const { id, nom, slug, emoji, couleur } = await req.json();
if (!id || !nom || !slug) return NextResponse.json({ error: "Données manquantes" }, { status: 400 });
const cat = await prisma.categorieWari.update({
where: { id },
data: { nom, slug, emoji: emoji || null, couleur: couleur || null },
});
return NextResponse.json({ success: true, cat });
}
export async function DELETE(req: NextRequest) {
if (!await checkAuth()) return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
const { id } = await req.json();
await prisma.categorieWari.delete({ where: { id } });
return NextResponse.json({ success: true });
}