import { Request, Response, NextFunction } from 'express'; import jwt from 'jsonwebtoken'; import { prisma } from '../index'; export interface AuthenticatedRequest extends Request { user?: { userId: number; username: string; }; } export const authenticateToken = async ( req: AuthenticatedRequest, res: Response, next: NextFunction ) => { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN if (!token) { return res.status(401).json({ success: false, message: 'Access token required', }); } try { const jwtSecret = process.env['JWT_SECRET']; if (!jwtSecret) { return res.status(500).json({ success: false, message: 'Server configuration error', }); } const decoded = jwt.verify(token, jwtSecret) as any; // Verify user still exists const user = await prisma.adminUser.findUnique({ where: { id: decoded.userId }, }); if (!user) { return res.status(401).json({ success: false, message: 'Invalid token - user not found', }); } req.user = { userId: decoded.userId, username: decoded.username, }; next(); } catch (error) { return res.status(403).json({ success: false, message: 'Invalid or expired token', }); } };