kutt/server/handlers/helpers.ts
2022-11-29 20:27:45 +03:30

73 lines
1.8 KiB
TypeScript

import { Handler, ErrorRequestHandler } from "express";
import { validationResult } from "express-validator";
import signale from "signale";
import { CustomError } from "../utils";
import env from "../env";
import { logger } from "../config/winston";
export const ip: Handler = (req, res, next) => {
req.realIP =
(req.headers["x-real-ip"] as string) || req.connection.remoteAddress || "";
return next();
};
export const error: ErrorRequestHandler = (error, _req, res, _next) => {
logger.error(error);
if (env.isDev) {
signale.fatal(error);
}
if (error instanceof CustomError) {
return res.status(error.statusCode || 500).json({ error: error.message });
}
return res.status(500).json({ error: "An error occurred." });
};
export const verify = (req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
const message = errors.array()[0].msg;
throw new CustomError(message, 400);
}
return next();
};
export const query: Handler = (req, res, next) => {
const { admin } = req.user || {};
if (
typeof req.query.limit !== "undefined" &&
typeof req.query.limit !== "string"
) {
return res.status(400).json({ error: "limit query is not valid." });
}
if (
typeof req.query.skip !== "undefined" &&
typeof req.query.skip !== "string"
) {
return res.status(400).json({ error: "skip query is not valid." });
}
if (
typeof req.query.search !== "undefined" &&
typeof req.query.search !== "string"
) {
return res.status(400).json({ error: "search query is not valid." });
}
const limit = parseInt(req.query.limit) || 10;
const skip = parseInt(req.query.skip) || 0;
req.context = {
limit: limit > 50 ? 50 : limit,
skip,
all: admin ? req.query.all === "true" : false
};
next();
};