import { Request, Response, NextFunction } from 'express'; import { ZodError } from 'zod'; import { logger } from '../utils/logger'; export interface AppError extends Error { statusCode?: number; code?: string; details?: unknown; } export function createError(message: string, statusCode: number, code: string): AppError { const err: AppError = new Error(message); err.statusCode = statusCode; err.code = code; return err; } export function errorHandler( err: AppError, _req: Request, res: Response, _next: NextFunction ): void { const timestamp = new Date().toISOString(); if (err instanceof ZodError) { res.status(400).json({ error: err.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join('; '), code: 'VALIDATION_ERROR', timestamp, }); return; } const statusCode = err.statusCode ?? 500; const code = err.code ?? 'INTERNAL_ERROR'; if (statusCode >= 500) { logger.error({ err }, 'Unhandled server error'); } res.status(statusCode).json({ error: statusCode >= 500 ? 'An internal error occurred.' : err.message, code, timestamp, }); }