import type { NextFunction, Request, Response } from 'express' import type { ApiResponse } from '../../shared/types.js' import { ERROR_CODES } from '../../shared/constants/errors.js' import { isAppError, isNodeError } from '../../shared/errors/index.js' import { logger } from '../utils/logger.js' export const errorHandler = (err: unknown, _req: Request, res: Response, _next: NextFunction) => { let statusCode: number = 500 let code: string = ERROR_CODES.INTERNAL_ERROR let message: string = 'Server internal error' let details: unknown = undefined if (isAppError(err)) { statusCode = err.statusCode code = err.code message = err.message details = err.details } else if (isNodeError(err)) { message = err.message if (process.env.NODE_ENV !== 'production') { details = { stack: err.stack, nodeErrorCode: err.code } } } else if (err instanceof Error) { message = err.message if (process.env.NODE_ENV !== 'production') { details = { stack: err.stack } } } logger.error(err) const response: ApiResponse = { success: false, error: { code, message, details: process.env.NODE_ENV === 'production' ? undefined : details, }, } res.status(statusCode).json(response) }