restifyx.js
Version:
Advanced API endpoint handler system with automatic documentation
124 lines • 5.13 kB
JavaScript
;
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