middlewares/error.middleware.js

/**
 * Error middleware.
 * It logs the error and sends an appropriate response to the client.
 * @module middleware/error
 * @requires module:utils/logErrors
 * @requires module:utils/resErrors
 * @requires module:config/logger
 */

const logger = require("../config/logger.config");
const { LogError, logErrors } = require("../utils/error.logs");
const { resErrors } = require("../utils/error.responses");


/**
 * Error middleware function.
 * 
 * This function handles errors that occur during the request-response cycle. It logs the error and sends an appropriate response to the client.
 * 
 * @function errorMiddleware
 * 
 * @param {Object} err - Error object. It may have a resCode and logCode properties.
 * @param {string} err.resCode - The response code for the error.
 * @param {string} err.logCode - The log code for the error.
 * @param {Object} req - The request object.
 * @param {Object} res - The response object.
 * 
 * @memberof module:middleware/error
 * 
 * @returns {void} - Returns nothing. It sends a response to the client.
 */

const errorMiddleware = (err, req, res, next) => {

    //If error involves a log (logCode)
    if(err.logCode){
        //We add the endpoint to the
        logErrors[err.logCode].endpoint = req.originalUrl;

        //Initialize log error
        logger.error(logErrors[err.logCode]);
    }

    let errorResponse;

    //If unexpected error (no resCode)
    if(!resErrors[err.resCode]){
        //Generate an unexpected error response
        errorResponse = resErrors.unexpected;

        //Generate a new custom LogError
        new LogError({
            message: 'Unexpected error',
            endpoint: req.originalUrl,
        }).add('unexpected');

        //Throwing unexpected log error
        logger.error(logErrors.unexpected);

    //If known error
    }else{
        //Set up the res error by resCode
        errorResponse = resErrors[err.resCode]
    }

    //Final error response
    res.status(errorResponse.status).json(errorResponse);

};

module.exports = errorMiddleware;