/**
* REST Input Validation Schemas (Zod)
* Validates request bodies for all REST handlers.
*/
import { z } from 'zod';
// ─── Cart Schemas ───
export const addToCartSchema = z.object({
variant_id: z.string().min(1, 'variant_id is required'),
quantity: z.number().int().positive('quantity must be a positive integer'),
});
// ─── Checkout Schemas ───
export const createCheckoutSchema = z.object({
currency: z.string().length(3, 'currency must be a 3-letter ISO code').optional(),
}).nullable().optional();
export const updateCheckoutSchema = z.object({
line_items: z.array(z.object({
id: z.string(),
product_id: z.string(),
variant_id: z.string(),
title: z.string(),
quantity: z.number().int().positive(),
unit_amount: z.number().int().nonnegative(),
total_amount: z.number().int().nonnegative(),
type: z.enum(['product', 'service', 'tax', 'discount', 'fee']),
image_url: z.string().optional(),
sku: z.string().optional(),
})).optional(),
buyer: z.object({
email: z.string().email('Invalid buyer email'),
first_name: z.string().optional(),
last_name: z.string().optional(),
phone: z.string().optional(),
}).optional(),
shipping_address: z.object({
line1: z.string().min(1),
line2: z.string().optional(),
city: z.string().min(1),
province: z.string().optional(),
postal_code: z.string().min(1),
country: z.string().length(2, 'country must be ISO 3166-1 alpha-2'),
}).optional(),
billing_address: z.object({
line1: z.string().min(1),
line2: z.string().optional(),
city: z.string().min(1),
province: z.string().optional(),
postal_code: z.string().min(1),
country: z.string().length(2, 'country must be ISO 3166-1 alpha-2'),
}).optional(),
payment_instruments: z.array(z.object({
handler_id: z.string(),
type: z.enum(['card', 'wallet', 'mandate']),
credential: z.object({ token: z.string() }).optional(),
display: z.object({ brand: z.string(), last_digits: z.string() }).optional(),
})).optional(),
currency: z.string().length(3).optional(),
continue_url: z.string().optional(),
});
export const completeCheckoutSchema = z.object({
intent_mandate: z.string({ required_error: 'intent_mandate is required' }).min(1, 'intent_mandate is required'),
cart_mandate: z.string({ required_error: 'cart_mandate is required' }).min(1, 'cart_mandate is required'),
payment_mandate: z.string({ required_error: 'payment_mandate is required' }).min(1, 'payment_mandate is required'),
});
// ─── Negotiate Schema ───
export const negotiateSchema = z.object({
cart_id: z.string().min(1, 'cart_id is required'),
agent_profile_url: z.string().url('agent_profile_url must be a valid URL'),
discount_code: z.string().optional(),
});