Homepage Redesign
This commit is contained in:
84
backend/src/features/platform/models/requests.ts
Normal file
84
backend/src/features/platform/models/requests.ts
Normal 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>;
|
||||
Reference in New Issue
Block a user