Files
service-finder/backend/app/services/dvla_service.py

71 lines
2.8 KiB
Python
Executable File

# /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