@expressots/core
Version:
Expressots - modern, fast, lightweight nodejs web framework (@core)
53 lines (52 loc) • 2.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ValidateDTO = ValidateDTO;
require("reflect-metadata");
const status_code_1 = require("../../error/status-code");
const package_resolver_1 = require("./package-resolver");
const logger_provider_1 = require("../logger/logger.provider");
/**
* Validate the DTO using class-validator and class-transformer.
* @param type - The type of the DTO to validate.
* @returns A RequestHandler function.
* @throws An exception if the DTO is invalid.
* @public API
*/
function ValidateDTO(type) {
return async (req, res, next) => {
const logger = new logger_provider_1.Logger();
const classValidator = await (0, package_resolver_1.packageResolver)("class-validator");
const classTransformer = await (0, package_resolver_1.packageResolver)("class-transformer");
if (!classValidator || !classTransformer) {
return next();
}
try {
const errors = await classValidator.validate(classTransformer.plainToClass(type, req.body));
if (errors.length > 0) {
const DTO = errors.reduce((acc, error) => {
if (error.constraints) {
const propertyName = error.property;
if (!acc.some((e) => e.property === propertyName)) {
acc.push({ property: propertyName, messages: [] });
}
const target = acc.find((e) => e.property === propertyName);
target.messages.push(...Object.values(error.constraints));
}
return acc;
}, []);
res.status(status_code_1.StatusCode.BadRequest).json({
errorCode: status_code_1.StatusCode.BadRequest,
errorMessage: "Bad Request",
DTO,
});
}
else {
next();
}
}
catch (error) {
logger.error(`An exception occurred while validating the DTO: ${error}`, "validate-dto-provider");
next(error);
}
};
}