From ae19170da8200126384e875b6add8f353c39051a Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 14 Apr 2026 12:53:13 -0400 Subject: [PATCH] feat: expand public interest schema with name split, address, berth Co-Authored-By: Claude Sonnet 4.6 --- src/lib/validators/interests.ts | 44 ++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/lib/validators/interests.ts b/src/lib/validators/interests.ts index baf8985..3215575 100644 --- a/src/lib/validators/interests.ts +++ b/src/lib/validators/interests.ts @@ -64,20 +64,40 @@ export const generateRecommendationsSchema = z.object({ // ─── Public Interest ────────────────────────────────────────────────────────── -export const publicInterestSchema = z.object({ - fullName: z.string().min(1).max(200), - email: z.string().email(), - phone: z.string().optional(), - companyName: z.string().optional(), - yachtName: z.string().optional(), - yachtLengthFt: z.coerce.number().positive().optional(), - yachtWidthFt: z.coerce.number().positive().optional(), - yachtDraftFt: z.coerce.number().positive().optional(), - preferredBerthSize: z.string().optional(), - source: z.literal('website').default('website'), - notes: z.string().max(2000).optional(), +const addressSchema = z.object({ + street: z.string().max(500).optional(), + city: z.string().max(200).optional(), + stateProvince: z.string().max(200).optional(), + postalCode: z.string().max(50).optional(), + country: z.string().max(100).optional(), }); +export const publicInterestSchema = z + .object({ + // New: first/last split + firstName: z.string().min(1).max(100).optional(), + lastName: z.string().min(1).max(100).optional(), + // Backward compat + fullName: z.string().min(1).max(200).optional(), + email: z.string().email(), + phone: z.string().min(1), + preferredContactMethod: z.enum(['email', 'phone', 'sms']).optional(), + mooringNumber: z.string().max(50).optional(), + companyName: z.string().optional(), + yachtName: z.string().optional(), + yachtLengthFt: z.coerce.number().positive().optional(), + yachtWidthFt: z.coerce.number().positive().optional(), + yachtDraftFt: z.coerce.number().positive().optional(), + preferredBerthSize: z.string().optional(), + source: z.literal('website').default('website'), + notes: z.string().max(2000).optional(), + address: addressSchema.optional(), + }) + .refine((data) => data.fullName || (data.firstName && data.lastName), { + message: 'Either fullName or both firstName and lastName are required', + path: ['fullName'], + }); + // ─── Reorder Waiting List ───────────────────────────────────────────────────── export const reorderWaitingListSchema = z.object({