helpers.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { Handler, ErrorRequestHandler } from "express";
  2. import { validationResult } from "express-validator";
  3. import * as Sentry from "@sentry/node";
  4. import signale from "signale";
  5. import { CustomError } from "../utils";
  6. import env from "../env";
  7. import { logger } from "../config/winston";
  8. export const ip: Handler = (req, res, next) => {
  9. req.realIP =
  10. (req.headers["x-real-ip"] as string) || req.connection.remoteAddress || "";
  11. return next();
  12. };
  13. export const error: ErrorRequestHandler = (error, req, res, next) => {
  14. logger.error(error);
  15. if (env.isDev) {
  16. signale.fatal(error);
  17. }
  18. if (error instanceof CustomError) {
  19. return res.status(error.statusCode || 500).json({ error: error.message });
  20. }
  21. if (env.SENTRY_PRIVATE_DSN) {
  22. Sentry.captureException(error);
  23. }
  24. return res.status(500).json({ error: "An error occurred." });
  25. };
  26. export const verify = (req, res, next) => {
  27. const errors = validationResult(req);
  28. if (!errors.isEmpty()) {
  29. const message = errors.array()[0].msg;
  30. throw new CustomError(message, 400);
  31. }
  32. return next();
  33. };
  34. export const query: Handler = (req, res, next) => {
  35. const { limit, skip, all } = req.query;
  36. const { admin } = req.user || {};
  37. req.query.limit = parseInt(limit) || 10;
  38. req.query.skip = parseInt(skip) || 0;
  39. if (req.query.limit > 50) {
  40. req.query.limit = 50;
  41. }
  42. req.query.all = admin ? all === "true" : false;
  43. next();
  44. };