Homepage Redesign

This commit is contained in:
Eric Gullickson
2025-11-03 14:06:54 -06:00
parent 54d97a98b5
commit eeb20543fa
71 changed files with 3925 additions and 1340 deletions

View File

@@ -0,0 +1,84 @@
/**
* @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_id: z.coerce.number()
.int('Make ID must be an integer')
.positive('Make ID must be positive')
});
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'),
model_id: z.coerce.number()
.int('Model ID must be an integer')
.positive('Model ID must be positive')
});
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'),
model_id: z.coerce.number()
.int('Model ID must be an integer')
.positive('Model ID must be positive'),
trim_id: z.coerce.number()
.int('Trim ID must be an integer')
.positive('Trim ID must be positive')
});
export type EnginesQuery = z.infer<typeof enginesQuerySchema>;