helpers.handler.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. const { validationResult } = require("express-validator");
  2. const signale = require("signale");
  3. const { logger } = require("../config/winston");
  4. const { CustomError } = require("../utils");
  5. const env = require("../env");
  6. function ip(req, res, next) {
  7. req.realIP = req.headers["x-real-ip"] || req.connection.remoteAddress || "";
  8. return next();
  9. };
  10. function error(error, req, res, _next) {
  11. if (env.isDev) {
  12. signale.fatal(error);
  13. }
  14. if (!env.isDev && !(error instanceof CustomError)) {
  15. logger.error(error.message);
  16. }
  17. const message = error instanceof CustomError ? error.message : "An error occurred.";
  18. const statusCode = error.statusCode ?? 500;
  19. if (req.isHTML && req.viewTemplate) {
  20. res.render(req.viewTemplate, { error: message });
  21. return;
  22. }
  23. if (req.isHTML) {
  24. res.render("error", {
  25. message: "An error occurred. Please try again later."
  26. });
  27. return;
  28. }
  29. return res.status(statusCode).json({ error: message });
  30. };
  31. function verify(req, res, next) {
  32. const result = validationResult(req);
  33. if (result.isEmpty()) return next();
  34. const errors = result.array();
  35. const error = errors[0].msg;
  36. res.locals.errors = {};
  37. errors.forEach(e => {
  38. if (res.locals.errors[e.param]) return;
  39. res.locals.errors[e.param] = e.msg;
  40. });
  41. throw new CustomError(error, 400);
  42. }
  43. function parseQuery(req, res, next) {
  44. const { admin } = req.user || {};
  45. if (
  46. typeof req.query.limit !== "undefined" &&
  47. typeof req.query.limit !== "string"
  48. ) {
  49. return res.status(400).json({ error: "limit query is not valid." });
  50. }
  51. if (
  52. typeof req.query.skip !== "undefined" &&
  53. typeof req.query.skip !== "string"
  54. ) {
  55. return res.status(400).json({ error: "skip query is not valid." });
  56. }
  57. if (
  58. typeof req.query.search !== "undefined" &&
  59. typeof req.query.search !== "string"
  60. ) {
  61. return res.status(400).json({ error: "search query is not valid." });
  62. }
  63. const limit = parseInt(req.query.limit) || 10;
  64. req.context = {
  65. limit: limit > 50 ? 50 : limit,
  66. skip: parseInt(req.query.skip) || 0,
  67. all: admin ? req.query.all === "true" || req.query.all === "on" : false
  68. };
  69. next();
  70. };
  71. module.exports = {
  72. error,
  73. ip,
  74. parseQuery,
  75. verify,
  76. }