const { UniqueConstraintError, BaseError, ValidationError } = require("sequelize"); const ApiError = require("../utils/handler/ApiError.handler"); const config = require("../config/config"); const httpStatus = require("http-status"); const logger = require("../config/logger"); const multer = require("multer"); const errorConverter = (err, req, res, next) => { let error = err; if (error instanceof multer.MulterError) { // Handle Multer errors error = new ApiError(httpStatus.BAD_REQUEST, error.message, error, true, err.stack); } else if (error instanceof ValidationError || error instanceof UniqueConstraintError) { // Handle Sequelize validation and unique constraint errors const messages = error.errors.map(e => e.message); error = new ApiError(httpStatus.BAD_REQUEST, messages.join(", "), messages, true, err.stack); } else if (!(error instanceof ApiError)) { // Handle other errors const statusCode = error.statusCode || error instanceof BaseError ? httpStatus.BAD_REQUEST : httpStatus.INTERNAL_SERVER_ERROR; const message = error.message || httpStatus[statusCode]; error = new ApiError(statusCode, message, error, false, err.stack); } next(error); }; // eslint-disable-next-line no-unused-vars const errorHandler = (err, req, res, next) => { let { statusCode, message } = err; if (config.env === 'production' && !err.isOperational) { statusCode = httpStatus.INTERNAL_SERVER_ERROR; message = httpStatus[httpStatus.INTERNAL_SERVER_ERROR]; } res.locals.errorMessage = err.message; const response = { code: statusCode, message, ...(config.env === 'development' && { stack: err.stack }), }; if (config.env === 'development') { logger.error(err); } res.status(statusCode).send(response); }; module.exports = { errorConverter, errorHandler, };