Files
motovaultpro/backend/src/features/platform/models/requests.ts
2025-12-15 18:19:55 -06:00

113 lines
3.2 KiB
TypeScript

/**
* @ai-summary Request DTOs for platform feature
* @ai-context Validation and type definitions for API requests
*/
import { z } from 'zod';
/**
* VIN validation schema
*/
export const vinDecodeRequestSchema = z.object({
vin: z.string()
.length(17, 'VIN must be exactly 17 characters')
.regex(/^[A-HJ-NPR-Z0-9]{17}$/, 'VIN contains invalid characters (cannot contain I, O, Q)')
.transform(vin => vin.toUpperCase())
});
export type VINDecodeRequest = z.infer<typeof vinDecodeRequestSchema>;
/**
* Year query parameter validation
*/
export const yearQuerySchema = z.object({
year: z.coerce.number()
.int('Year must be an integer')
.min(1950, 'Year must be at least 1950')
.max(2100, 'Year must be at most 2100')
});
export type YearQuery = z.infer<typeof yearQuerySchema>;
/**
* Makes query parameters validation
*/
export const makesQuerySchema = yearQuerySchema;
export type MakesQuery = z.infer<typeof makesQuerySchema>;
/**
* Models query parameters validation
*/
export const modelsQuerySchema = z.object({
year: z.coerce.number()
.int('Year must be an integer')
.min(1950, 'Year must be at least 1950')
.max(2100, 'Year must be at most 2100'),
make: z.string()
.min(1, 'Make is required')
.max(100, 'Make must be less than 100 characters')
});
export type ModelsQuery = z.infer<typeof modelsQuerySchema>;
/**
* Trims query parameters validation
*/
export const trimsQuerySchema = z.object({
year: z.coerce.number()
.int('Year must be an integer')
.min(1950, 'Year must be at least 1950')
.max(2100, 'Year must be at most 2100'),
make: z.string()
.min(1, 'Make is required')
.max(100, 'Make must be less than 100 characters'),
model: z.string()
.min(1, 'Model is required')
.max(100, 'Model must be less than 100 characters')
});
export type TrimsQuery = z.infer<typeof trimsQuerySchema>;
/**
* Engines query parameters validation
*/
export const enginesQuerySchema = z.object({
year: z.coerce.number()
.int('Year must be an integer')
.min(1950, 'Year must be at least 1950')
.max(2100, 'Year must be at most 2100'),
make: z.string()
.min(1, 'Make is required')
.max(100, 'Make must be less than 100 characters'),
model: z.string()
.min(1, 'Model is required')
.max(100, 'Model must be less than 100 characters'),
trim: z.string()
.min(1, 'Trim is required')
.max(100, 'Trim must be less than 100 characters')
});
export type EnginesQuery = z.infer<typeof enginesQuerySchema>;
/**
* Transmissions query parameters validation
*/
export const transmissionsQuerySchema = z.object({
year: z.coerce.number()
.int('Year must be an integer')
.min(1950, 'Year must be at least 1950')
.max(2100, 'Year must be at most 2100'),
make: z.string()
.min(1, 'Make is required')
.max(100, 'Make must be less than 100 characters'),
model: z.string()
.min(1, 'Model is required')
.max(100, 'Model must be less than 100 characters'),
trim: z.string()
.min(1, 'Trim is required')
.max(100, 'Trim must be less than 100 characters'),
engine: z.string().optional()
});
export type TransmissionsQuery = z.infer<typeof transmissionsQuerySchema>;