/** * @ai-summary Platform-specific Redis caching service * @ai-context Caching layer for vehicle data and VIN decoding */ import { CacheService } from '../../../core/config/redis'; import { logger } from '../../../core/logging/logger'; export class PlatformCacheService { private cacheService: CacheService; private readonly prefix = 'platform:'; constructor(cacheService: CacheService) { this.cacheService = cacheService; } /** * Get cached years */ async getYears(): Promise { const key = this.prefix + 'years'; return await this.cacheService.get(key); } /** * Set cached years */ async setYears(years: number[], ttl: number = 6 * 3600): Promise { const key = this.prefix + 'years'; await this.cacheService.set(key, years, ttl); } /** * Get cached makes for year */ async getMakes(year: number): Promise { const key = this.prefix + 'vehicle-data:makes:' + year; return await this.cacheService.get(key); } /** * Set cached makes for year */ async setMakes(year: number, makes: string[], ttl: number = 6 * 3600): Promise { const key = this.prefix + 'vehicle-data:makes:' + year; await this.cacheService.set(key, makes, ttl); } /** * Get cached models for year and make */ async getModels(year: number, make: string): Promise { const key = this.prefix + 'vehicle-data:models:' + year + ':' + make; return await this.cacheService.get(key); } /** * Set cached models for year and make */ async setModels(year: number, make: string, models: string[], ttl: number = 6 * 3600): Promise { const key = this.prefix + 'vehicle-data:models:' + year + ':' + make; await this.cacheService.set(key, models, ttl); } /** * Get cached trims for year, make, and model */ async getTrims(year: number, make: string, model: string): Promise { const key = this.prefix + 'vehicle-data:trims:' + year + ':' + make + ':' + model; return await this.cacheService.get(key); } /** * Set cached trims for year, make, and model */ async setTrims(year: number, make: string, model: string, trims: string[], ttl: number = 6 * 3600): Promise { const key = this.prefix + 'vehicle-data:trims:' + year + ':' + make + ':' + model; await this.cacheService.set(key, trims, ttl); } /** * Get cached engines for year, make, model, and trim */ async getEngines(year: number, make: string, model: string, trim: string): Promise { const key = this.prefix + 'vehicle-data:engines:' + year + ':' + make + ':' + model + ':' + trim; return await this.cacheService.get(key); } /** * Set cached engines for year, make, model, and trim */ async setEngines(year: number, make: string, model: string, trim: string, engines: string[], ttl: number = 6 * 3600): Promise { const key = this.prefix + 'vehicle-data:engines:' + year + ':' + make + ':' + model + ':' + trim; await this.cacheService.set(key, engines, ttl); } /** * Get cached transmissions for year, make, model, and trim */ async getTransmissionsForTrim(year: number, make: string, model: string, trim: string): Promise { const key = this.prefix + 'vehicle-data:transmissions:' + year + ':' + make + ':' + model + ':' + trim; return await this.cacheService.get(key); } /** * Set cached transmissions for year, make, model, and trim */ async setTransmissionsForTrim(year: number, make: string, model: string, trim: string, transmissions: string[], ttl: number = 6 * 3600): Promise { const key = this.prefix + 'vehicle-data:transmissions:' + year + ':' + make + ':' + model + ':' + trim; await this.cacheService.set(key, transmissions, ttl); } async getTransmissionsForTrimAndEngine(year: number, make: string, model: string, trim: string, engine: string): Promise { const key = this.prefix + 'vehicle-data:transmissions:' + year + ':' + make + ':' + model + ':' + trim + ':engine:' + engine; return await this.cacheService.get(key); } async setTransmissionsForTrimAndEngine(year: number, make: string, model: string, trim: string, engine: string, transmissions: string[], ttl: number = 6 * 3600): Promise { const key = this.prefix + 'vehicle-data:transmissions:' + year + ':' + make + ':' + model + ':' + trim + ':engine:' + engine; await this.cacheService.set(key, transmissions, ttl); } async getEnginesForTrimAndTransmission(year: number, make: string, model: string, trim: string, transmission: string): Promise { const key = this.prefix + 'vehicle-data:engines:' + year + ':' + make + ':' + model + ':' + trim + ':transmission:' + transmission; return await this.cacheService.get(key); } async setEnginesForTrimAndTransmission(year: number, make: string, model: string, trim: string, transmission: string, engines: string[], ttl: number = 6 * 3600): Promise { const key = this.prefix + 'vehicle-data:engines:' + year + ':' + make + ':' + model + ':' + trim + ':transmission:' + transmission; await this.cacheService.set(key, engines, ttl); } /** * Get cached VIN decode result */ async getVINDecode(vin: string): Promise { const key = this.prefix + 'vin-decode:' + vin.toUpperCase(); return await this.cacheService.get(key); } /** * Set cached VIN decode result (7 days for successful decodes, 1 hour for failures) */ async setVINDecode(vin: string, result: any, success: boolean = true): Promise { const key = this.prefix + 'vin-decode:' + vin.toUpperCase(); const ttl = success ? 7 * 24 * 3600 : 3600; await this.cacheService.set(key, result, ttl); } /** * Invalidate all vehicle data cache (for admin operations) */ async invalidateVehicleData(): Promise { try { const yearsKey = this.prefix + 'years'; await Promise.all([ this.cacheService.del(yearsKey), this.cacheService.deletePattern(this.prefix + 'vehicle-data:*') ]); logger.debug('Vehicle data cache invalidated'); } catch (error) { logger.error('Vehicle data cache invalidation failed', { error }); } } }