Source: Middlewares/CheckPermissions.js

import Jwt from 'jsonwebtoken';
import UsersServices from '../Services/UsersServices.js';
import RolesServices from '../Services/RolesServices.js';

/**
 * Middleware pour vérifier les permissions d'accès d'un utilisateur.
 * 
 * Ce middleware extrait le jeton d'autorisation de l'en-tête de la requête,
 * vérifie sa validité, récupère les informations de l'utilisateur associé,
 * et détermine si l'utilisateur a les permissions nécessaires pour accéder
 * à la ressource demandée.
 * 
 * @returns {Function} Middleware Express qui gère la vérification des permissions.
 * 
 * @throws {Error} Renvoie une réponse HTTP avec un code d'erreur approprié :
 * - 401 : Si le jeton est manquant ou invalide, ou si l'utilisateur n'est pas trouvé.
 * - 403 : Si l'utilisateur n'a pas les permissions nécessaires pour accéder à la ressource.
 */
const checkPermissions = () => {
    return async (req, res, next) => {
        const token = req.headers['authorization'];

        if (!token) {
            return res.status(401).json({ error: 'Token manquant' });
        }

        try {
            const decoded = Jwt.verify(token, process.env.JWT_SECRET);
            req.user = decoded;

            const user = await UsersServices.getUsers({ id: decoded.id });
            if (user.length === 0) {
                return res.status(401).json({ error: 'Utilisateur non trouvé' });
            }

            const userRole = user[0].role;
            const permissions = await RolesServices.getRolePermissions(userRole);

            if (permissions === 'all') {
                return next();
            }

            const pathPermissions = permissions[req.path];
            if (!pathPermissions || !pathPermissions[req.method]) {
                return res.status(403).json({ error: 'Accès interdit' });
            }

            next();
        } catch (error) {
            return res.status(401).json({ error: 'Token invalide' });
        }
    };
};

export default checkPermissions;