Files
motovaultpro/docs/VEHICLES-API.md
Eric Gullickson 3053b62fa5
All checks were successful
Deploy to Staging / Build Images (push) Successful in 2m19s
Deploy to Staging / Deploy to Staging (push) Successful in 27s
Deploy to Staging / Verify Staging (push) Successful in 5s
Deploy to Staging / Notify Staging Ready (push) Successful in 5s
Deploy to Staging / Notify Staging Failure (push) Has been skipped
Mirror Base Images / Mirror Base Images (push) Successful in 29s
chore: Update Documentation
2026-01-03 15:10:19 -06:00

435 lines
9.6 KiB
Markdown

# Vehicles API Reference
Complete API documentation for the vehicles feature in MotoVaultPro.
## Overview
The Vehicles API provides endpoints for managing user vehicles, including CRUD operations, image management, and hierarchical dropdown data for vehicle selection forms.
**Authentication**: All endpoints require JWT authentication via `Authorization: Bearer <token>` header.
## Base URL
```
https://motovaultpro.com/api
```
## Vehicle CRUD Operations
### List User Vehicles
Returns all vehicles for the authenticated user.
```
GET /api/vehicles
```
**Response** (200):
```json
[
{
"id": "uuid",
"userId": "auth0|123456",
"vin": "1HGBH41JXMN109186",
"make": "Honda",
"model": "Civic",
"year": 2021,
"engine": "2.0L 4-Cylinder",
"transmission": "CVT Automatic",
"trimLevel": "EX",
"driveType": "FWD",
"fuelType": "Gasoline",
"nickname": "My Honda",
"color": "Blue",
"licensePlate": "ABC123",
"odometerReading": 15000,
"isActive": true,
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-01-01T00:00:00.000Z",
"imageUrl": "/api/vehicles/{id}/image"
}
]
```
### Get Single Vehicle
```
GET /api/vehicles/:id
```
**Parameters**:
- `id` (path): Vehicle UUID
**Response** (200): Single vehicle object (same structure as list item)
**Errors**:
- `404`: Vehicle not found or not owned by user
### Create Vehicle
```
POST /api/vehicles
```
**Request Body**:
```json
{
"vin": "1HGBH41JXMN109186",
"year": 2021,
"make": "Honda",
"model": "Civic",
"engine": "2.0L 4-Cylinder",
"transmission": "CVT Automatic",
"trimLevel": "EX",
"driveType": "FWD",
"fuelType": "Gasoline",
"nickname": "My Honda",
"color": "Blue",
"licensePlate": "ABC123",
"odometerReading": 15000
}
```
**Required**: Either `vin` OR `licensePlate` must be provided (not both required).
**Response** (201): Created vehicle object
### Update Vehicle
```
PUT /api/vehicles/:id
```
**Parameters**:
- `id` (path): Vehicle UUID
**Request Body**: Same fields as create (all optional, only provided fields are updated)
**Response** (200): Updated vehicle object
### Delete Vehicle
Soft-deletes a vehicle (sets `deleted_at` timestamp).
```
DELETE /api/vehicles/:id
```
**Parameters**:
- `id` (path): Vehicle UUID
**Response** (204): No content
## Vehicle Images
### Upload Image
Upload or replace the vehicle's image.
```
POST /api/vehicles/:id/image
Content-Type: multipart/form-data
```
**Parameters**:
- `id` (path): Vehicle UUID
**Form Data**:
- `image`: Image file (JPEG, PNG, WebP; max 5MB)
**Response** (200):
```json
{
"success": true,
"imageUrl": "/api/vehicles/{id}/image"
}
```
### Download Image
```
GET /api/vehicles/:id/image
```
**Parameters**:
- `id` (path): Vehicle UUID
**Response**: Image binary with appropriate `Content-Type` header
**Errors**:
- `404`: No image exists for vehicle
### Delete Image
```
DELETE /api/vehicles/:id/image
```
**Parameters**:
- `id` (path): Vehicle UUID
**Response** (204): No content
## Dropdown Cascade API
Hierarchical endpoints for vehicle selection dropdowns. Each level filters based on previous selections.
### Get Years
Returns available model years in descending order.
```
GET /api/vehicles/dropdown/years
```
**Response** (200):
```json
{
"years": [2025, 2024, 2023, 2022, ...]
}
```
### Get Makes
Returns makes available for a specific year.
```
GET /api/vehicles/dropdown/makes?year={year}
```
**Query Parameters**:
- `year` (required): Model year (e.g., 2024)
**Response** (200):
```json
{
"makes": ["Acura", "Audi", "BMW", "Chevrolet", "Ford", ...]
}
```
### Get Models
Returns models available for a specific year and make.
```
GET /api/vehicles/dropdown/models?year={year}&make={make}
```
**Query Parameters**:
- `year` (required): Model year
- `make` (required): Make name (e.g., "Ford")
**Response** (200):
```json
{
"models": ["Bronco", "Edge", "Explorer", "F-150", "Mustang", ...]
}
```
### Get Trims
Returns trims available for a specific year, make, and model.
```
GET /api/vehicles/dropdown/trims?year={year}&make={make}&model={model}
```
**Query Parameters**:
- `year` (required): Model year
- `make` (required): Make name
- `model` (required): Model name (e.g., "F-150")
**Response** (200):
```json
{
"trims": ["XL", "XLT", "Lariat", "King Ranch", "Platinum", ...]
}
```
### Get Engines
Returns engines available for a specific year, make, model, and trim.
```
GET /api/vehicles/dropdown/engines?year={year}&make={make}&model={model}&trim={trim}
```
**Query Parameters**:
- `year` (required): Model year
- `make` (required): Make name
- `model` (required): Model name
- `trim` (required): Trim level (e.g., "XLT")
**Response** (200):
```json
{
"engines": [
"3.3L V6 Ti-VCT",
"2.7L V6 EcoBoost",
"5.0L V8 Ti-VCT",
"3.5L V6 EcoBoost"
]
}
```
### Get Transmissions
Returns transmissions available for a specific year, make, model, and trim.
```
GET /api/vehicles/dropdown/transmissions?year={year}&make={make}&model={model}&trim={trim}
```
**Query Parameters**:
- `year` (required): Model year
- `make` (required): Make name
- `model` (required): Model name
- `trim` (required): Trim level
**Response** (200):
```json
{
"transmissions": [
"10-Speed Automatic",
"6-Speed Automatic"
]
}
```
### Get Pair-Safe Options
Returns valid engine/transmission combinations, ensuring only compatible pairs are shown.
```
GET /api/vehicles/dropdown/options?year={year}&make={make}&model={model}&trim={trim}[&engine={engine}][&transmission={transmission}]
```
**Query Parameters**:
- `year` (required): Model year
- `make` (required): Make name
- `model` (required): Model name
- `trim` (required): Trim level
- `engine` (optional): If provided, returns only transmissions compatible with this engine
- `transmission` (optional): If provided, returns only engines compatible with this transmission
**Response** (200):
```json
{
"engines": ["3.3L V6 Ti-VCT", "2.7L V6 EcoBoost"],
"transmissions": ["10-Speed Automatic"]
}
```
## Platform API
Direct platform endpoints for vehicle data lookups (alternative to dropdown cascade).
```
GET /api/platform/years
GET /api/platform/makes?year={year}
GET /api/platform/models?year={year}&make={make}
GET /api/platform/trims?year={year}&make={make}&model={model}
GET /api/platform/engines?year={year}&make={make}&model={model}&trim={trim}
GET /api/platform/transmissions?year={year}&make={make}&model={model}&trim={trim}
```
Same functionality as dropdown cascade API but with `/api/platform/` prefix.
## Error Responses
All endpoints return standard error responses:
```json
{
"error": "Error message",
"statusCode": 400
}
```
**Common Status Codes**:
- `400`: Bad request (validation error)
- `401`: Unauthorized (missing or invalid JWT)
- `404`: Resource not found
- `500`: Internal server error
## Data Model
### Vehicle Fields
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| id | UUID | Auto | Primary key |
| userId | string | Auto | Auth0 user ID (from JWT) |
| vin | string | No* | Vehicle Identification Number (17 chars) |
| make | string | No | Manufacturer (e.g., "Ford") |
| model | string | No | Model name (e.g., "F-150") |
| year | integer | No | Model year |
| engine | string | No | Engine specification |
| transmission | string | No | Transmission type |
| trimLevel | string | No | Trim level (e.g., "XLT") |
| driveType | string | No | Drive type (e.g., "4WD", "FWD") |
| fuelType | string | No | Fuel type (e.g., "Gasoline", "Diesel") |
| nickname | string | No | User-defined name |
| color | string | No | Vehicle color |
| licensePlate | string | No* | License plate number |
| odometerReading | integer | No | Current odometer (default: 0) |
| isActive | boolean | Auto | Active status (default: true) |
| createdAt | datetime | Auto | Creation timestamp |
| updatedAt | datetime | Auto | Last update timestamp |
| imageUrl | string | Auto | URL to vehicle image (if uploaded) |
*Either `vin` OR `licensePlate` should be provided for vehicle identification.
### VIN Validation
When a VIN is provided:
- Must be exactly 17 characters
- Cannot contain letters I, O, or Q
- Check digit validation is performed
## Database Schema
### Platform Tables
Vehicle lookup data is stored in three denormalized tables optimized for dropdown cascade queries:
- **engines**: Engine specifications (name, displacement, horsepower, fuel_type, etc.)
- **transmissions**: Transmission types (type, speeds, drive_type)
- **vehicle_options**: Denormalized year/make/model/trim combinations with engine/transmission references
See `docs/DATABASE-SCHEMA.md` for complete table definitions.
### Migration Location
Platform migrations: `backend/src/features/platform/migrations/001_create_vehicle_lookup_schema.sql`
## Caching
- **Dropdown data**: Cached in Redis for 6 hours (key: `dropdown:{dataType}:{params}`)
- **User vehicle lists**: Cached for 5 minutes (key: `vehicles:user:{userId}`)
- Cache is invalidated on vehicle create/update/delete operations
## Frontend Integration
### Form Cascade Order
The vehicle form uses cascading dropdowns in this order:
1. Year (loads makes)
2. Make (loads models)
3. Model (loads trims)
4. Trim (loads engines and transmissions)
5. Engine and Transmission (pair-safe filtering via `/dropdown/options`)
### Files
- Form component: `frontend/src/features/vehicles/components/VehicleForm.tsx`
- Types: `frontend/src/features/vehicles/types/vehicles.types.ts`
- API hooks: `frontend/src/features/vehicles/hooks/`
## Related Documentation
- Feature README: `backend/src/features/vehicles/README.md`
- Platform README: `backend/src/features/platform/README.md`
- Database Schema: `docs/DATABASE-SCHEMA.md`
- Architecture: `docs/ARCHITECTURE-OVERVIEW.md`