Relates to #223
## Scope
Replace NHTSA client usage in the vehicles controller and service with the OCR proxy, and update cache logic.
### Changes
- Replace `NHTSAClient` with `OcrClient` in `vehicles.controller.ts`
- Move VIN validation (regex) into controller (was in NHTSAClient)
- Move cache logic (getCached/saveToCache) from NHTSAClient into vehicles service or controller
- Refactor `mapNHTSAResponse()` to `mapVinDecodeResponse()` - takes Gemini response, does dropdown matching
- Update `vin_cache` raw_data to store Gemini response format
- Add migration `007_truncate_vin_cache.sql` to clear stale NHTSA-format cache entries
- Update error messages from NHTSA references to OCR service references
### Acceptance Criteria
- [ ] `POST /api/vehicles/decode-vin` routes through OCR service
- [ ] VIN cache works with Gemini response format
- [ ] Dropdown matching (year/make/model/trim/engine/transmission) preserved
- [ ] Tier gating unchanged (Pro/Enterprise)
- [ ] Error handling for OCR service failures
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Relates to #223
Scope
Replace NHTSA client usage in the vehicles controller and service with the OCR proxy, and update cache logic.
Changes
NHTSAClientwithOcrClientinvehicles.controller.tsmapNHTSAResponse()tomapVinDecodeResponse()- takes Gemini response, does dropdown matchingvin_cacheraw_data to store Gemini response format007_truncate_vin_cache.sqlto clear stale NHTSA-format cache entriesAcceptance Criteria
POST /api/vehicles/decode-vinroutes through OCR service