Files
MAD-Platform/lib/permissions.ts

89 lines
2.5 KiB
TypeScript

import { prisma } from './prisma';
import { AVAILABLE_PAGES } from './pages';
/**
* Vérifie si un utilisateur a accès à une page donnée
*/
export async function hasPageAccess(userId: string, pageRoute: string): Promise<boolean> {
try {
// La page Paramètres est toujours accessible à tous les utilisateurs
if (pageRoute === '/dashboard/parametres') {
return true;
}
const user = await prisma.user.findUnique({
where: { id: userId },
include: {
role: {
include: {
permissions: {
include: {
permission: true,
},
},
},
},
},
});
// Si l'utilisateur n'a pas de rôle, permettre l'accès à toutes les pages
// (pour permettre la transition et la configuration initiale)
if (!user || !user.role) {
return true;
}
// Vérifier si le rôle a la permission pour cette page
const hasPermission = user.role.permissions.some(
(rp) => rp.permission.name === pageRoute
);
return hasPermission;
} catch (error) {
console.error('Erreur lors de la vérification des permissions:', error);
// En cas d'erreur, permettre l'accès pour éviter de bloquer l'utilisateur
return true;
}
}
/**
* Récupère toutes les pages accessibles pour un utilisateur
*/
export async function getUserAccessiblePages(userId: string): Promise<string[]> {
try {
const user = await prisma.user.findUnique({
where: { id: userId },
include: {
role: {
include: {
permissions: {
include: {
permission: true,
},
},
},
},
},
});
// Si l'utilisateur n'a pas de rôle, retourner toutes les pages disponibles
// (pour permettre la transition et la configuration initiale)
if (!user || !user.role) {
return AVAILABLE_PAGES.map(page => page.route);
}
// La page Paramètres est toujours accessible
const pages: string[] = ['/dashboard/parametres'];
// Ajouter les pages accessibles via le rôle
const rolePages = user.role.permissions
.map((rp) => rp.permission.name)
.filter((route) => AVAILABLE_PAGES.some((page) => page.route === route));
return [...pages, ...rolePages];
} catch (error) {
console.error('Erreur lors de la récupération des pages accessibles:', error);
// En cas d'erreur, retourner toutes les pages pour éviter de bloquer l'utilisateur
return AVAILABLE_PAGES.map(page => page.route);
}
}