'use strict'; const _ = require('lodash'); const httpStatus = require('http-status'); const Sequelize = require('sequelize'); //////////////////////////////////////////////////////////////////////////////// // PRIVATE FUNCTIONS //////////////////////////////////////////////////////////////////////////////// function buildErrorLog(err) { if (err instanceof Sequelize.ValidationError) { return { message: err.message, httpCode: httpStatus.UNPROCESSABLE_ENTITY, // <- datos no vĂ¡lidos code: (err.parent) ? err.parent.code : '', payload: err.fields, } } return buildErrorLogOriginal(err); } function buildErrorLogOriginal(err) { let errorLog; if (_.isUndefined(err)) { errorLog = 'Error not defined'; } else if (!_.isUndefined(err.message)) { errorLog = err.message; } else if (!_.isUndefined(err.stack)) { errorLog = err.stack; } else { errorLog = JSON.stringify(err); } return errorLog; } function buildErrorResponse(nameController, nameMethod, error) { const errorDescription = buildErrorLog(error); const jsonResultFailed = { statusCode: errorDescription.httpCode ? errorDescription.httpCode : httpStatus.INTERNAL_SERVER_ERROR, message: errorDescription.message ? errorDescription.message : 'Internal Server Error', code: errorDescription.code ? errorDescription.code : 'Undefined', description: `Internal Application Error in ${nameController}:${nameMethod}.`, payload: errorDescription } return jsonResultFailed; } function getTotalCount(result) { const toType = function (obj) { return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase() } switch (toType(result)) { case 'boolean': return 1; case 'object': return 1; case 'array': return result.length; case 'null': return 0; default: return 0; } } function setPaginationInfo(totalCount, res) { res.set({ 'X-Total-Count': totalCount, }); const params = extractParamsFromRequest(null, res); console.log('>>>>>>>>>>>>>>>>>>>>>>>>> params antes de setPaginationInfo'); console.log(params); if (params.paginate) { const page = (params.paginate && params.paginate.page) ? params.paginate.page : null, limit = (params.paginate && params.paginate.limit) ? params.paginate.limit : null, count = (limit) ? Math.ceil(totalCount / limit) : null; if (params.paginate.hasNextPages(count)) { const nextPage = params.paginate.href(); res.set('Link', nextPage + '; rel=next'); res.set('Pagination-Next-Page', true); } else { res.set('Pagination-Next-Page', false); } res.set({ 'Pagination-Count': count, 'Pagination-Page': page, 'Pagination-Limit': limit, }); } } //////////////////////////////////////////////////////////////////////////////// // PUBLIC FUNCTIONS //////////////////////////////////////////////////////////////////////////////// function extractParamsFromRequest(req, res, extraParams = {}) { const result = {}; result.route = (req && req.route) ? req.route.path : null; result.params = (req && req.params) ? req.params : null; result.query = (req && req.query) ? req.query : null; if (res && res.locals) { Object.keys(res.locals).forEach(key => { result[key] = res.locals[key] }) } return { ...result, ...extraParams } } function handleErrorResponse(controllerName, methodName, error, res) { console.error(error); const jsonResultFailed = buildErrorResponse(controllerName, methodName, error); res.status(jsonResultFailed.statusCode).send(jsonResultFailed); } function handleResultResponse(result, totalCount = null, params, res, statusCode = httpStatus.OK) { setPaginationInfo((totalCount) ? totalCount : getTotalCount(result), res); res.status(statusCode).send(result); } //////////////////////////////////////////////////////////////////////////////// // MODULE EXPORTS //////////////////////////////////////////////////////////////////////////////// module.exports = { extractParamsFromRequest, handleErrorResponse, handleResultResponse, // for testing buildErrorLog, buildErrorResponse };