import { z } from 'zod' import type { Request, Response, NextFunction } from 'express' function getFirstIssueMessage(error: z.ZodError): string { const issue = error.issues[0] return issue?.message ?? 'Validation failed' } export function validateBody(schema: T) { return (req: Request, res: Response, next: NextFunction): void => { const result = schema.safeParse(req.body) if (!result.success) { res.status(400).json({ error: getFirstIssueMessage(result.error) }) return } req.body = result.data as z.infer next() } } export function validateQuery(schema: T) { return (req: Request, res: Response, next: NextFunction): void => { const result = schema.safeParse(req.query) if (!result.success) { res.status(400).json({ error: getFirstIssueMessage(result.error) }) return } ;(req as unknown as Record).parsedQuery = result.data next() } } export function validateParams(schema: T) { return (req: Request, res: Response, next: NextFunction): void => { const result = schema.safeParse(req.params) if (!result.success) { res.status(400).json({ error: getFirstIssueMessage(result.error) }) return } Object.assign(req.params, result.data) next() } }