41 lines
1.5 KiB
TypeScript
41 lines
1.5 KiB
TypeScript
import { z } from 'zod'
|
|
import { textField, optionalTextField, emailField, optionalUpperField, optionalPhoneField } from '../../lib/zodValidation'
|
|
|
|
export const paginationSchema = z.object({
|
|
page: z.coerce.number().int().min(1).max(10000).default(1),
|
|
pageSize: z.coerce.number().int().min(1).max(100).default(20),
|
|
})
|
|
|
|
export const customerSchema = z.object({
|
|
firstName: textField('name'),
|
|
lastName: textField('name'),
|
|
email: emailField(),
|
|
phone: optionalPhoneField(),
|
|
driverLicense: optionalUpperField('driverLicenseNumber'),
|
|
dateOfBirth: z.string().datetime().optional(),
|
|
nationality: optionalTextField('nationality'),
|
|
address: z.record(z.unknown()).optional(),
|
|
notes: z.string().max(2000).trim().optional(),
|
|
licenseExpiry: z.string().datetime().optional(),
|
|
licenseIssuedAt: z.string().datetime().optional(),
|
|
licenseCountry: optionalTextField('country'),
|
|
licenseNumber: optionalUpperField('driverLicenseNumber'),
|
|
licenseCategory: optionalUpperField('licenseCategory'),
|
|
})
|
|
|
|
export const listQuerySchema = paginationSchema.extend({
|
|
q: z.string().max(100).optional(),
|
|
flagged: z.enum(['true', 'false']).optional(),
|
|
})
|
|
|
|
export const approveLicenseSchema = z.object({
|
|
decision: z.enum(['APPROVE', 'DENY']),
|
|
note: z.string().optional(),
|
|
})
|
|
|
|
export const flagSchema = z.object({
|
|
reason: z.string().optional(),
|
|
})
|
|
|
|
export const idParamSchema = z.object({ id: z.string() })
|