import type { RouteSchema } from './config.js' const BODY_METHODS = new Set(['POST', 'PUT', 'PATCH']) function issueMessages(error: { issues: { path: (string | number)[]; message: string }[] }): string[] { return error.issues.map((i) => (i.path.length ? `${i.path.join('.')} ${i.message}` : i.message)) } /** * Validates a request against a route's schema validators. * * Returns a 400 Response when validation fails, or null when the request is * valid and should proceed to payment enforcement. */ export async function validateRequest(req: Request, schema: RouteSchema): Promise { if (schema.body && BODY_METHODS.has(req.method.toUpperCase())) { let body: unknown try { body = await req.clone().json() } catch { return Response.json({ error: 'Request body must be valid JSON' }, { status: 400 }) } const result = schema.body.safeParse(body) if (!result.success) { return Response.json( { error: 'Request validation failed', validation_errors: issueMessages(result.error) }, { status: 400 }, ) } } if (schema.query) { const queryData: Record = {} for (const [k, v] of new URL(req.url).searchParams.entries()) queryData[k] = v const result = schema.query.safeParse(queryData) if (!result.success) { return Response.json( { error: 'Request validation failed', validation_errors: issueMessages(result.error) }, { status: 400 }, ) } } return null }