app2-api/helpers/controller.helper.js

149 lines
4.2 KiB
JavaScript
Raw Normal View History

2022-02-23 18:27:58 +00:00
"use strict";
2022-02-23 18:27:58 +00:00
const _ = require("lodash");
const httpStatus = require("http-status");
const Sequelize = require("sequelize");
2019-04-24 21:01:54 +00:00
////////////////////////////////////////////////////////////////////////////////
// PRIVATE FUNCTIONS
////////////////////////////////////////////////////////////////////////////////
function buildErrorLog(err) {
2022-02-23 18:27:58 +00:00
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) {
2022-02-23 18:27:58 +00:00
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;
2019-04-24 21:01:54 +00:00
}
function buildErrorResponse(nameController, nameMethod, error) {
2022-02-23 18:27:58 +00:00
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;
2019-04-24 21:01:54 +00:00
}
2019-05-09 16:23:54 +00:00
function getTotalCount(result) {
2022-02-23 18:27:58 +00:00
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;
}
2019-05-09 16:23:54 +00:00
}
function setPaginationInfo(totalCount, res) {
2022-02-23 18:27:58 +00:00
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)) {
2019-05-09 16:23:54 +00:00
const nextPage = params.paginate.href();
2019-07-31 10:40:36 +00:00
res.set('Link-Next-Page', nextPage + '; rel=next');
2019-05-09 16:23:54 +00:00
res.set('Pagination-Next-Page', true);
} else {
res.set('Pagination-Next-Page', false);
2019-08-26 15:42:52 +00:00
}*/
2022-02-23 18:27:58 +00:00
res.set({
"Pagination-Count": count,
"Pagination-Page": page,
"Pagination-Limit": limit,
});
}
2019-05-09 16:23:54 +00:00
}
2019-04-24 21:01:54 +00:00
////////////////////////////////////////////////////////////////////////////////
// PUBLIC FUNCTIONS
////////////////////////////////////////////////////////////////////////////////
2019-05-23 09:40:50 +00:00
function extractParamsFromRequest(req, res, extraParams = {}) {
2022-02-23 18:27:58 +00:00
const result = {};
2019-05-09 16:23:54 +00:00
2022-02-23 18:27:58 +00:00
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;
2019-05-09 16:23:54 +00:00
2022-02-23 18:27:58 +00:00
if (res && res.locals) {
Object.keys(res.locals).forEach((key) => {
result[key] = res.locals[key];
});
}
2019-05-09 16:23:54 +00:00
2022-02-23 18:27:58 +00:00
return {
...result,
...extraParams,
};
2019-05-09 16:23:54 +00:00
}
2022-02-23 18:27:58 +00:00
function handleErrorResponse(controllerName, methodName, error, res) {
console.error(error);
const jsonResultFailed = buildErrorResponse(controllerName, methodName, error);
res.status(jsonResultFailed.statusCode).send(jsonResultFailed);
2019-04-24 21:01:54 +00:00
}
2019-05-09 16:23:54 +00:00
function handleResultResponse(result, totalCount = null, params, res, statusCode = httpStatus.OK) {
2022-02-23 18:27:58 +00:00
setPaginationInfo(totalCount ? totalCount : getTotalCount(result), res);
res.status(statusCode).send(typeof result == "number" ? result.toString() : result);
2019-05-09 16:23:54 +00:00
}
2019-04-24 21:01:54 +00:00
////////////////////////////////////////////////////////////////////////////////
// MODULE EXPORTS
////////////////////////////////////////////////////////////////////////////////
module.exports = {
2022-02-23 18:27:58 +00:00
extractParamsFromRequest,
handleErrorResponse,
handleResultResponse,
// for testing
buildErrorLog,
buildErrorResponse,
httpStatus,
};