import { Request, Response, NextFunction } from "express"; import jwt from "jsonwebtoken"; const JWT_SECRET = process.env.JWT_SECRET || "your-jwt-secret-key"; export interface AuthRequest extends Request { user?: { id: string; type: 'user' | 'seller' | 'admin'; username: string; }; } export const authenticateToken = async (req: AuthRequest, res: Response, next: NextFunction) => { const authHeader = req.headers.authorization; const token = authHeader && authHeader.split(' ')[1]; if (!token) { return res.status(401).json({ message: 'Access token required' }); } try { const payload = jwt.verify(token, JWT_SECRET) as any; req.user = payload; next(); } catch (error) { return res.status(403).json({ message: 'Invalid or expired token' }); } }; export const requireRole = (roles: Array<'user' | 'seller' | 'admin'>) => { return (req: AuthRequest, res: Response, next: NextFunction) => { if (!req.user || !roles.includes(req.user.type)) { return res.status(403).json({ message: 'Insufficient permissions' }); } next(); }; }; export const optionalAuth = async (req: AuthRequest, res: Response, next: NextFunction) => { const authHeader = req.headers.authorization; const token = authHeader && authHeader.split(' ')[1]; if (token) { try { const payload = jwt.verify(token, JWT_SECRET) as any; req.user = payload; } catch (error) { // Token invalid, but continue without user } } next(); }; export const generateToken = (user: { id: string; type: 'user' | 'seller' | 'admin'; username: string }) => { return jwt.sign(user, JWT_SECRET, { expiresIn: '24h' }); };