import type { ErrorRequestHandler, RequestHandler } from 'express'; import { ZodError } from 'zod'; export class AppError extends Error { public readonly statusCode: number; public readonly code: string; public readonly details?: unknown; constructor(statusCode: number, code: string, message: string, details?: unknown) { super(message); this.name = 'AppError'; this.statusCode = statusCode; this.code = code; this.details = details; } } export const notFoundHandler: RequestHandler = (req, _res, next) => { next(new AppError(404, 'ROUTE_NOT_FOUND', `No route found for ${req.method} ${req.originalUrl}`)); }; export const errorHandler: ErrorRequestHandler = (error, _req, res, _next) => { if (error instanceof ZodError) { res.status(400).json({ error: { code: 'VALIDATION_ERROR', message: 'Request validation failed.', details: error.flatten() } }); return; } if (error instanceof AppError) { res.status(error.statusCode).json({ error: { code: error.code, message: error.message, details: error.details } }); return; } const message = error instanceof Error ? error.message : 'Unknown server error'; res.status(500).json({ error: { code: 'INTERNAL_SERVER_ERROR', message: process.env.NODE_ENV === 'production' ? 'Unexpected server error.' : message } }); };