feat(yachts): add zod validators + tests

This commit is contained in:
Matt Ciaccio
2026-04-23 23:31:29 +02:00
parent 7a6e95c87a
commit 899e588a0c
2 changed files with 101 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
import { z } from 'zod';
import { baseListQuerySchema } from '@/lib/api/route-helpers';
export const ownerRefSchema = z.object({
type: z.enum(['client', 'company']),
id: z.string().min(1),
});
export const createYachtSchema = z.object({
name: z.string().min(1).max(200),
hullNumber: z.string().optional(),
registration: z.string().optional(),
flag: z.string().optional(),
yearBuilt: z.number().int().min(1800).max(2100).optional(),
builder: z.string().optional(),
model: z.string().optional(),
hullMaterial: z.string().optional(),
lengthFt: z.string().optional(),
widthFt: z.string().optional(),
draftFt: z.string().optional(),
lengthM: z.string().optional(),
widthM: z.string().optional(),
draftM: z.string().optional(),
owner: ownerRefSchema, // required; yacht must have an owner
status: z.enum(['active', 'retired', 'sold_away']).optional().default('active'),
notes: z.string().optional(),
tagIds: z.array(z.string()).optional().default([]),
});
export const updateYachtSchema = createYachtSchema.partial().omit({ owner: true });
// Owner changes go through /transfer, not PATCH.
export const transferOwnershipSchema = z.object({
newOwner: ownerRefSchema,
effectiveDate: z.coerce.date(),
transferReason: z
.enum(['sale', 'inheritance', 'gift', 'company_restructure', 'other'])
.optional(),
transferNotes: z.string().optional(),
});
export const listYachtsQuery = baseListQuerySchema.extend({
ownerType: z.enum(['client', 'company']).optional(),
ownerId: z.string().optional(),
status: z.enum(['active', 'retired', 'sold_away']).optional(),
search: z.string().optional(),
});
export type CreateYachtInput = z.infer<typeof createYachtSchema>;
export type UpdateYachtInput = z.infer<typeof updateYachtSchema>;
export type TransferOwnershipInput = z.infer<typeof transferOwnershipSchema>;
export type ListYachtsInput = z.infer<typeof listYachtsQuery>;