Initial commit: Robot ökoszisztéma v2.0 - Stabilizált jármű és szerviz robotok
This commit is contained in:
71
backend/app/services/dvla_service.py
Executable file
71
backend/app/services/dvla_service.py
Executable file
@@ -0,0 +1,71 @@
|
||||
# /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
|
||||
Reference in New Issue
Block a user