73 lines
1.8 KiB
TypeScript
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();
|
|
};
|