helpers.handler.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. const { validationResult } = require("express-validator");
  2. const signale = require("signale");
  3. const { logger } = require("../config/winston");
  4. const { CustomError, sanitize } = require("../utils");
  5. const query = require("../queries")
  6. const env = require("../env");
  7. // export const ip: Handler = (req, res, next) => {
  8. // req.realIP =
  9. // (req.headers["x-real-ip"] as string) || req.connection.remoteAddress || "";
  10. // return next();
  11. // };
  12. function isHTML(req, res, next) {
  13. const accepts = req.accepts(["json", "html"]);
  14. req.isHTML = accepts === "html";
  15. next();
  16. }
  17. function addNoLayoutLocals(req, res, next) {
  18. res.locals.layout = null;
  19. next();
  20. }
  21. function viewTemplate(template) {
  22. return function (req, res, next) {
  23. req.viewTemplate = template;
  24. next();
  25. }
  26. }
  27. function addConfigLocals(req, res, next) {
  28. res.locals.default_domain = env.DEFAULT_DOMAIN;
  29. res.locals.site_name = env.SITE_NAME;
  30. next();
  31. }
  32. async function addUserLocals(req, res, next) {
  33. const user = req.user;
  34. res.locals.user = user;
  35. res.locals.domains = user && (await query.domain.get({ user_id: user.id })).map(sanitize.domain);
  36. next();
  37. }
  38. function error(error, req, res, _next) {
  39. if (env.isDev) {
  40. signale.fatal(error);
  41. }
  42. const message = error instanceof CustomError ? error.message : "An error occurred.";
  43. const statusCode = error.statusCode ?? 500;
  44. if (req.isHTML && req.viewTemplate) {
  45. res.render(req.viewTemplate, { error: message });
  46. return;
  47. }
  48. return res.status(statusCode).json({ error: message });
  49. };
  50. function verify(req, res, next) {
  51. const result = validationResult(req);
  52. if (result.isEmpty()) return next();
  53. const errors = result.array();
  54. const error = errors[0].msg;
  55. res.locals.errors = {};
  56. errors.forEach(e => {
  57. if (res.locals.errors[e.param]) return;
  58. res.locals.errors[e.param] = e.msg;
  59. });
  60. throw new CustomError(error, 400);
  61. }
  62. function parseQuery(req, res, next) {
  63. const { admin } = req.user || {};
  64. if (
  65. typeof req.query.limit !== "undefined" &&
  66. typeof req.query.limit !== "string"
  67. ) {
  68. return res.status(400).json({ error: "limit query is not valid." });
  69. }
  70. if (
  71. typeof req.query.skip !== "undefined" &&
  72. typeof req.query.skip !== "string"
  73. ) {
  74. return res.status(400).json({ error: "skip query is not valid." });
  75. }
  76. if (
  77. typeof req.query.search !== "undefined" &&
  78. typeof req.query.search !== "string"
  79. ) {
  80. return res.status(400).json({ error: "search query is not valid." });
  81. }
  82. const limit = parseInt(req.query.limit) || 10;
  83. const skip = parseInt(req.query.skip) || 0;
  84. req.context = {
  85. limit: limit > 50 ? 50 : limit,
  86. skip,
  87. all: admin ? req.query.all === "true" || req.query.all === "on" : false
  88. };
  89. next();
  90. };
  91. module.exports = {
  92. addConfigLocals,
  93. addNoLayoutLocals,
  94. addUserLocals,
  95. error,
  96. isHTML,
  97. parseQuery,
  98. verify,
  99. viewTemplate,
  100. }