@xpresser/abolish
Version:
Using Abolish validator in Xpresserjs
64 lines (63 loc) • 2.38 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
const xpresser_1 = require("xpresser");
const plugin_config_1 = require("./plugin-config");
const RoutesGuard_1 = __importDefault(require("./RoutesGuard"));
const $ = (0, xpresser_1.getInstance)();
const ValidationRulesPath = plugin_config_1.pluginConfig.get("validationRules.file");
const OnErrorFunction = plugin_config_1.pluginConfig.get("validationRules.onError");
let ValidationRules = {};
/**
* Load Validation rules file before we boot server;
*/
if (plugin_config_1.pluginConfig.get("validationRules.enabled", false)) {
$.on.bootServer((next) => {
// Require Validation rules.
try {
ValidationRules = require($.path.resolve(ValidationRulesPath));
if (!ValidationRules || typeof ValidationRules !== "object")
return $.logErrorAndExit(`ValidationRules File must return an object!`);
// check if ValidationRules was exported as default
if (ValidationRules.default)
ValidationRules = ValidationRules.default;
if (ValidationRules instanceof RoutesGuard_1.default ||
typeof ValidationRules.compileRules === "function") {
ValidationRules = ValidationRules.compileRules();
}
}
catch (e) {
return $.logErrorAndExit(e.message);
}
next();
});
}
module.exports = async (http) => {
// Only for POST, PUT & PATCH REQUESTS
const method = http.req.method.toUpperCase();
if (!["POST", "PATCH", "PUT"].includes(method)) {
return http.next();
}
if (!ValidationRules[method])
return http.next();
let rules = ValidationRules[method][http.req.route?.path || http.req.path];
// Parse if function.
if (typeof rules === "function") {
rules = await rules(http);
}
// check if current path has validation rules
if (!rules) {
return http.next();
}
// Validate
const [err, validated] = await http.validateBodyAsync(rules);
// return Error if error
if (err) {
return OnErrorFunction(http, err);
}
// Save to state for later use.
http.state.set("validatedBody", validated);
// Continue request.
return http.next();
};