import { Request, Response, NextFunction } from 'express'; import { firebaseService } from '../services/firebaseService'; declare global { namespace Express { interface Request { user?: { uid: string; role: string; email: string; name: string; }; } } } export const authenticate = async ( req: Request, res: Response, next: NextFunction ) => { try { const authHeader = req.headers.authorization; if (!authHeader?.startsWith('Bearer ')) { return res.status(401).json({ error: 'No token provided' }); } const token = authHeader.split('Bearer ')[1]; const decodedToken = await firebaseService.auth.verifyIdToken(token); const userRole = await firebaseService.getUserRole(decodedToken.uid); if (!userRole) { return res.status(403).json({ error: 'User not found' }); } req.user = { uid: decodedToken.uid, role: userRole.role, email: userRole.email, name: userRole.name, }; next(); } catch (error) { console.error('Auth error:', error); res.status(401).json({ error: 'Invalid token' }); } }; export const requireRole = (roles: string[]) => { return (req: Request, res: Response, next: NextFunction) => { if (!req.user) { return res.status(401).json({ error: 'Authentication required' }); } if (!roles.includes(req.user.role)) { return res.status(403).json({ error: 'Insufficient permissions' }); } next(); }; };