FactuGES_ERP/apps/server/src/common/presentation/express/validate-request-dto.ts

34 lines
1.0 KiB
TypeScript
Raw Normal View History

2025-02-01 21:48:13 +00:00
import { NextFunction, Request, Response } from "express";
import httpStatus from "http-status";
import { ZodSchema } from "zod";
import { ApiError } from "./api-error";
2025-04-01 17:05:17 +00:00
export const validateAndParseBody =
(schema: ZodSchema, options?: { sanitize?: boolean }) =>
(req: Request, res: Response, next: NextFunction) => {
2025-02-01 21:48:13 +00:00
const result = schema.safeParse(req.body);
if (!result.success) {
// Construye errores detallados
const validationErrors = result.error.errors.map((err) => ({
field: err.path.join("."),
message: err.message,
}));
throw new ApiError({
status: httpStatus.BAD_REQUEST, //400
title: "Validation Error",
detail: "Algunos campos no cumplen con los criterios de validación.",
type: "https://example.com/probs/validation-error",
instance: req.originalUrl,
errors: validationErrors,
});
}
// Si pasa la validación, opcionalmente reescribe req.body
2025-04-01 17:05:17 +00:00
if (options?.sanitize ?? true) {
req.body = result.data;
}
2025-02-01 21:48:13 +00:00
next();
};