# /opt/docker/dev/service_finder/backend/app/services/dvla_service.py import httpx import logging from typing import Optional, Dict, Any from sqlalchemy.ext.asyncio import AsyncSession from app.services.config_service import config # 2.0 Dinamikus konfig from app.db.session import AsyncSessionLocal logger = logging.getLogger("DVLA-Service-2.2") class DVLAService: """ Sentinel Master DVLA Service 2.2. Felelős a brit járműadatok lekéréséért a hivatalos állami API-n keresztül. """ @classmethod async def get_vehicle_details(cls, db: AsyncSession, vrm: str) -> Optional[Dict[str, Any]]: """ VRM (Vehicle Registration Mark) lekérdezése dinamikus admin beállításokkal. """ try: # 1. ADMIN BEÁLLÍTÁSOK LEKÉRÉSE # Megnézzük, engedélyezve van-e a szolgáltatás is_enabled = await config.get_setting(db, "dvla_api_enabled", default=True) if not is_enabled: logger.info("DVLA lekérdezés kihagyva (Admin által letiltva).") return None api_url = await config.get_setting( db, "dvla_api_url", default="https://driver-vehicle-licensing.api.gov.uk/vehicle-enquiry/v1/vehicles" ) api_key = await config.get_setting(db, "dvla_api_key") if not api_key: logger.error("DVLA API kulcs hiányzik a system_parameters táblából!") return None # 2. HITELESÍTÉS ÉS LEKÉRDEZÉS headers = { "x-api-key": api_key, "Content-Type": "application/json" } # A DVLA szigorúan nagybetűs, szóköz nélküli rendszámot vár clean_vrm = vrm.replace(" ", "").upper().strip() payload = {"registrationNumber": clean_vrm} async with httpx.AsyncClient(timeout=15.0) as client: response = await client.post(api_url, json=payload, headers=headers) if response.status_code == 200: logger.info(f"✅ DVLA adat sikeresen lekérve: {clean_vrm}") return response.json() elif response.status_code == 404: logger.warning(f"⚠️ Jármű nem található a DVLA adatbázisában: {clean_vrm}") return None elif response.status_code == 429: logger.error("🚨 DVLA API hiba: Túl sok kérés (Rate Limit)!") return {"error": "rate_limited"} else: logger.error(f"❌ DVLA API hiba ({response.status_code}): {response.text}") return None except Exception as e: logger.error(f"⚠️ DVLAService Kritikus Hiba: {e}") return None