import { NextRequest, NextResponse } from 'next/server'; import { prisma } from '@/lib/prisma'; import { getCurrentUser } from '@/lib/auth'; // GET - Récupérer un rôle avec ses permissions export async function GET( request: NextRequest, { params }: { params: { id: string } } ) { try { const user = await getCurrentUser(); if (!user) { return NextResponse.json({ error: 'Non autorisé' }, { status: 401 }); } const role = await prisma.role.findUnique({ where: { id: params.id }, include: { permissions: { include: { permission: true, }, }, _count: { select: { users: true, }, }, }, }); if (!role) { return NextResponse.json( { error: 'Rôle non trouvé' }, { status: 404 } ); } return NextResponse.json(role); } catch (error) { console.error('Erreur lors de la récupération du rôle:', error); return NextResponse.json( { error: 'Erreur serveur' }, { status: 500 } ); } } // PUT - Modifier un rôle export async function PUT( request: NextRequest, { params }: { params: { id: string } } ) { try { const user = await getCurrentUser(); if (!user) { return NextResponse.json({ error: 'Non autorisé' }, { status: 401 }); } const body = await request.json(); const { name, description, permissionIds } = body; const role = await prisma.role.findUnique({ where: { id: params.id }, }); if (!role) { return NextResponse.json( { error: 'Rôle non trouvé' }, { status: 404 } ); } // Vérifier si le nouveau nom existe déjà (si changé) if (name && name !== role.name) { const existing = await prisma.role.findUnique({ where: { name }, }); if (existing) { return NextResponse.json( { error: 'Ce nom de rôle existe déjà' }, { status: 400 } ); } } // Mettre à jour le rôle const updatedRole = await prisma.role.update({ where: { id: params.id }, data: { name: name || role.name, description: description !== undefined ? description : role.description, }, include: { permissions: { include: { permission: true, }, }, _count: { select: { users: true, }, }, }, }); // Mettre à jour les permissions si fournies if (permissionIds !== undefined) { // Supprimer toutes les permissions actuelles await prisma.rolePermission.deleteMany({ where: { roleId: params.id }, }); // Ajouter les nouvelles permissions if (permissionIds.length > 0) { await prisma.rolePermission.createMany({ data: permissionIds.map((permissionId: string) => ({ roleId: params.id, permissionId, })), }); } // Récupérer le rôle mis à jour avec les nouvelles permissions const roleWithPermissions = await prisma.role.findUnique({ where: { id: params.id }, include: { permissions: { include: { permission: true, }, }, _count: { select: { users: true, }, }, }, }); return NextResponse.json(roleWithPermissions); } return NextResponse.json(updatedRole); } catch (error) { console.error('Erreur lors de la modification du rôle:', error); return NextResponse.json( { error: 'Erreur serveur' }, { status: 500 } ); } } // DELETE - Supprimer un rôle export async function DELETE( request: NextRequest, { params }: { params: { id: string } } ) { try { const user = await getCurrentUser(); if (!user) { return NextResponse.json({ error: 'Non autorisé' }, { status: 401 }); } const role = await prisma.role.findUnique({ where: { id: params.id }, include: { _count: { select: { users: true, }, }, }, }); if (!role) { return NextResponse.json( { error: 'Rôle non trouvé' }, { status: 404 } ); } // Vérifier si le rôle est utilisé if (role._count.users > 0) { return NextResponse.json( { error: 'Ce rôle est attribué à des utilisateurs. Veuillez d\'abord retirer le rôle de ces utilisateurs.' }, { status: 400 } ); } await prisma.role.delete({ where: { id: params.id }, }); return NextResponse.json({ success: true }); } catch (error) { console.error('Erreur lors de la suppression du rôle:', error); return NextResponse.json( { error: 'Erreur serveur' }, { status: 500 } ); } }