mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-11 17:27:31 +02:00
Add `saveInvoiceVerificationCache` to storage interfaces, implement it in `DatabaseStorage` and `MemStorage`, adjust user type in `AuthRequest` to `any`, and initialize group/supplier counters in `MemStorage`. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 7c468936-2a88-4686-ac0a-84921a45222d Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/7c468936-2a88-4686-ac0a-84921a45222d/ce6DSX9
113 lines
3.2 KiB
TypeScript
113 lines
3.2 KiB
TypeScript
// Middleware de permissions hardcodées
|
|
// Remplace l'ancien système flexible basé sur la base de données
|
|
|
|
import type { Request, Response, NextFunction } from 'express';
|
|
import { hasPermission, hasModuleAccess } from '@shared/permissions';
|
|
import type { Permission, Module } from '@shared/permissions';
|
|
|
|
// Interface pour les requêtes authentifiées
|
|
interface AuthRequest extends Request {
|
|
user: any;
|
|
}
|
|
|
|
// Middleware pour vérifier l'accès à un module
|
|
export function requireModuleAccess(module: Module) {
|
|
return (req: AuthRequest, res: Response, next: NextFunction) => {
|
|
const userRole = req.user?.role;
|
|
|
|
if (!userRole) {
|
|
return res.status(401).json({ message: "Utilisateur non authentifié" });
|
|
}
|
|
|
|
if (!hasModuleAccess(userRole, module)) {
|
|
return res.status(403).json({
|
|
message: `Accès refusé au module ${module}`,
|
|
required: "Permission d'accès au module",
|
|
userRole
|
|
});
|
|
}
|
|
|
|
next();
|
|
};
|
|
}
|
|
|
|
// Middleware pour vérifier une permission spécifique
|
|
export function requirePermission(module: Module, action: Permission) {
|
|
return (req: AuthRequest, res: Response, next: NextFunction) => {
|
|
const userRole = req.user?.role;
|
|
|
|
if (!userRole) {
|
|
return res.status(401).json({ message: "Utilisateur non authentifié" });
|
|
}
|
|
|
|
if (!hasPermission(userRole, module, action)) {
|
|
return res.status(403).json({
|
|
message: `Permission refusée: ${action} sur ${module}`,
|
|
required: `${action} permission on ${module}`,
|
|
userRole
|
|
});
|
|
}
|
|
|
|
next();
|
|
};
|
|
}
|
|
|
|
// Middleware combiné: accès module + permission
|
|
export function requireModulePermission(module: Module, action: Permission) {
|
|
return (req: AuthRequest, res: Response, next: NextFunction) => {
|
|
const userRole = req.user?.role;
|
|
|
|
if (!userRole) {
|
|
return res.status(401).json({ message: "Utilisateur non authentifié" });
|
|
}
|
|
|
|
// Vérifier l'accès au module ET la permission
|
|
if (!hasModuleAccess(userRole, module) || !hasPermission(userRole, module, action)) {
|
|
return res.status(403).json({
|
|
message: `Accès refusé: ${action} sur module ${module}`,
|
|
required: `${action} permission on ${module} module`,
|
|
userRole
|
|
});
|
|
}
|
|
|
|
next();
|
|
};
|
|
}
|
|
|
|
// Helper: vérifie si l'utilisateur est admin
|
|
export function requireAdmin(req: AuthRequest, res: Response, next: NextFunction) {
|
|
const userRole = req.user?.role;
|
|
|
|
if (!userRole) {
|
|
return res.status(401).json({ message: "Utilisateur non authentifié" });
|
|
}
|
|
|
|
if (userRole !== 'admin') {
|
|
return res.status(403).json({
|
|
message: "Accès réservé aux administrateurs",
|
|
required: "admin role",
|
|
userRole
|
|
});
|
|
}
|
|
|
|
next();
|
|
}
|
|
|
|
// Helper: vérifie si l'utilisateur est admin ou directeur
|
|
export function requireAdminOrDirecteur(req: AuthRequest, res: Response, next: NextFunction) {
|
|
const userRole = req.user?.role;
|
|
|
|
if (!userRole) {
|
|
return res.status(401).json({ message: "Utilisateur non authentifié" });
|
|
}
|
|
|
|
if (!['admin', 'directeur'].includes(userRole)) {
|
|
return res.status(403).json({
|
|
message: "Accès réservé aux administrateurs et directeurs",
|
|
required: "admin or directeur role",
|
|
userRole
|
|
});
|
|
}
|
|
|
|
next();
|
|
} |