const { verifyToken } = require('../utils/jwt'); const User = require('../models/User'); /** * Authentication middleware * @param {Object} req - Express request object * @param {Object} res - Express response object * @param {Function} next - Express next function */ const authenticate = async (req, res, next) => { try { let token; // Get token from Authorization header if (req.headers.authorization && req.headers.authorization.startsWith('Bearer')) { token = req.headers.authorization.split(' ')[1]; } if (!token) { return res.status(401).json({ message: 'Authentication required. Please log in.' }); } // Verify token const decoded = verifyToken(token); // Find user by id const user = await User.findById(decoded.id); if (!user || !user.active) { return res.status(401).json({ message: 'The user no longer exists or is inactive.' }); } // Attach user to request object req.user = user; next(); } catch (error) { res.status(401).json({ message: 'Authentication failed. Invalid token.' }); } }; /** * Authorization middleware factory * @param {String[]} roles - Array of allowed roles * @returns {Function} Express middleware */ const authorize = (...roles) => { return (req, res, next) => { if (!req.user) { return res.status(401).json({ message: 'Authentication required.' }); } if (!roles.includes(req.user.role)) { return res.status(403).json({ message: 'You do not have permission to perform this action.' }); } next(); }; }; module.exports = { authenticate, authorize };