// JWT Authentication Middleware import type { FastifyRequest, FastifyReply } from "fastify"; import type { JwtPayload } from "../types/index.js"; /** * Verify JWT token and attach user to request. */ export async function authenticate(request: FastifyRequest, reply: FastifyReply): Promise { try { await request.jwtVerify(); } catch (err) { reply.status(401).send({ error: "Unauthorized", message: "Invalid or expired token", statusCode: 401 }); } } /** Helper to get typed user from request (after authenticate). */ export function getUser(request: FastifyRequest): JwtPayload { return request.user as unknown as JwtPayload; } /** * Require admin role. * Must be used after authenticate. */ export async function requireAdmin(request: FastifyRequest, reply: FastifyReply): Promise { const user = request.user as unknown as JwtPayload | undefined; if (!user || user.role !== "admin") { reply.status(403).send({ error: "Forbidden", message: "Admin access required", statusCode: 403 }); } } /** * Optional auth: attach user if token present, but don't fail if missing. */ export async function optionalAuth(request: FastifyRequest): Promise { try { await request.jwtVerify(); } catch { // No token or invalid — continue without user } }