89 lines
2.5 KiB
TypeScript
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);
|
||
|
|
}
|
||
|
|
}
|