import { z } from "zod"; export const loginSchema = z.object({ password: z.string().min(1, "Password is required").max(200), }); type ValidationErrorDetail = { field: string; message: string; }; type ValidationErrorPayload = { message: string; details: ValidationErrorDetail[]; }; type ValidationSuccess = { success: true; data: TData; }; type ValidationFailure = { success: false; error: ValidationErrorPayload; }; export type ValidationResult = ValidationSuccess | ValidationFailure; // ──── Helper ──── /** * Parse and validate request body with a Zod schema. * Returns { success: true, data } or { success: false, error }. */ export function validateBody( schema: TSchema, body: unknown ): ValidationResult> { const result = schema.safeParse(body); if (result.success) { return { success: true, data: result.data }; } const issues = Array.isArray(result.error?.issues) ? result.error.issues : []; return { success: false, error: { message: "Invalid request", details: issues.map((e) => ({ field: e.path.join("."), message: e.message, })), }, }; } export function isValidationFailure( validation: ValidationResult ): validation is ValidationFailure { return validation.success === false; }