UNPKG

restifyx.js

Version:

Advanced API endpoint handler system with automatic documentation

124 lines 5.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateRequestAsync = exports.validateRequest = void 0; const ApiError_1 = require("../core/errors/ApiError"); /** * Validates the incoming request against the provided schema. * @param schema - The schema to validate against. It can contain properties for body, query, params, headers, and cookies. * @returns {void} * @throws {ApiError} If validation fails, an ApiError is thrown with details of the validation errors. */ const validateRequest = (schema) => { return (req, res, next) => { const errors = []; const validationOptions = schema.options || { abortEarly: false, stripUnknown: true }; if (schema.body) { const { error, value } = schema.body.validate(req.body, validationOptions); if (error) { errors.push(...error.details.map((detail) => `Body: ${detail.message}`)); } else if (value) { req.body = value; } } if (schema.query) { const { error, value } = schema.query.validate(req.query, validationOptions); if (error) { errors.push(...error.details.map((detail) => `Query: ${detail.message}`)); } else if (value) { req.query = value; } } if (schema.params) { const { error, value } = schema.params.validate(req.params, validationOptions); if (error) { errors.push(...error.details.map((detail) => `Params: ${detail.message}`)); } else if (value) { req.params = value; } } if (schema.headers) { const { error } = schema.headers.validate(req.headers, validationOptions); if (error) { errors.push(...error.details.map((detail) => `Headers: ${detail.message}`)); } } if (schema.cookies) { const { error } = schema.cookies.validate(req.cookies, validationOptions); if (error) { errors.push(...error.details.map((detail) => `Cookies: ${detail.message}`)); } } if (errors.length > 0) { throw ApiError_1.ApiError.validation("Validation error", errors); } next(); }; }; exports.validateRequest = validateRequest; const validateRequestAsync = (schema) => { return async (req, res, next) => { try { const errors = []; const validationOptions = schema.options || { abortEarly: false, stripUnknown: true }; const validationPromises = []; if (schema.body) { validationPromises.push(schema.body .validateAsync(req.body, validationOptions) .then((value) => { req.body = value; }) .catch((error) => { errors.push(...error.details.map((detail) => `Body: ${detail.message}`)); })); } if (schema.query) { validationPromises.push(schema.query .validateAsync(req.query, validationOptions) .then((value) => { req.query = value; }) .catch((error) => { errors.push(...error.details.map((detail) => `Query: ${detail.message}`)); })); } if (schema.params) { validationPromises.push(schema.params .validateAsync(req.params, validationOptions) .then((value) => { req.params = value; }) .catch((error) => { errors.push(...error.details.map((detail) => `Params: ${detail.message}`)); })); } if (schema.headers) { validationPromises.push(schema.headers.validateAsync(req.headers, validationOptions).catch((error) => { errors.push(...error.details.map((detail) => `Headers: ${detail.message}`)); })); } if (schema.cookies) { validationPromises.push(schema.cookies.validateAsync(req.cookies, validationOptions).catch((error) => { errors.push(...error.details.map((detail) => `Cookies: ${detail.message}`)); })); } await Promise.all(validationPromises); if (errors.length > 0) { throw ApiError_1.ApiError.validation("Validation error", errors); } next(); } catch (error) { if (error instanceof ApiError_1.ApiError) { next(error); } else { next(ApiError_1.ApiError.internal("Validation system error", error instanceof Error ? error.message : String(error))); } } }; }; exports.validateRequestAsync = validateRequestAsync; //# sourceMappingURL=validation.js.map