/** * Validation Middleware * * Validates request body, query, and params using Zod schemas */ import { Request, Response, NextFunction } from 'express'; import { ZodSchema, ZodError } from 'zod'; import { ValidationError } from '../types'; export interface ValidateOptions { body?: ZodSchema; query?: ZodSchema; params?: ZodSchema; } /** * Validate request against Zod schemas */ export const validate = (schemas: ValidateOptions) => { return async (req: Request, _res: Response, next: NextFunction): Promise => { try { if (schemas.body) { req.body = schemas.body.parse(req.body); } if (schemas.query) { req.query = schemas.query.parse(req.query); } if (schemas.params) { req.params = schemas.params.parse(req.params); } next(); } catch (error) { if (error instanceof ZodError) { const details = error.errors.reduce( (acc, err) => { const path = err.path.join('.'); acc[path] = err.message; return acc; }, {} as Record ); next(new ValidationError('Datos de entrada invalidos', details)); } else { next(error); } } }; }; /** * Validate only request body */ export const validateBody = (schema: ZodSchema) => validate({ body: schema }); /** * Validate only query parameters */ export const validateQuery = (schema: ZodSchema) => validate({ query: schema }); /** * Validate only path parameters */ export const validateParams = (schema: ZodSchema) => validate({ params: schema }); export default validate;