mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-21 10:47:04 +02:00
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
import { ClassConstructor, plainToInstance } from 'class-transformer';
|
|||
|
|
import { validate, ValidationError } from 'class-validator';
|
||
|
|
import { NextFunction, Request, RequestHandler, Response } from 'express';
|
||
|
|
|
||
|
|
export function mapClass(cls: ClassConstructor<object>): RequestHandler {
|
||
|
|
return async (req: Request, res: Response, next: NextFunction) => {
|
||
|
|
// Map to class
|
||
|
|
let obj: object = plainToInstance(cls, req.body);
|
||
|
|
|
||
|
|
// Validate class
|
||
|
|
let errors = await validate(obj, {
|
||
|
|
skipMissingProperties: true,
|
||
|
|
whitelist: true,
|
||
|
|
forbidNonWhitelisted: false,
|
||
|
|
forbidUnknownValues: true,
|
||
|
|
});
|
||
|
|
if (errors.length > 0) {
|
||
|
|
res.status(400).send({ error: true, errors: formatValidationErrors(errors) });
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Set validated class to locals
|
||
|
|
res.locals.input = obj;
|
||
|
|
next();
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
interface ValidationErrorLog {
|
||
|
|
property: string;
|
||
|
|
constraints?: { [type: string]: string };
|
||
|
|
children?: ValidationErrorLog[];
|
||
|
|
}
|
||
|
|
|
||
|
|
function formatValidationErrors(errors: ValidationError[]): ValidationErrorLog[] {
|
||
|
|
return errors.map(error => ({
|
||
|
|
property: error.property,
|
||
|
|
constraints: error.constraints,
|
||
|
|
children: error.children?.length > 0 ? formatValidationErrors(error.children) : undefined,
|
||
|
|
}));
|
||
|
|
}
|