# /opt/docker/dev/service_finder/backend/app/workers/brand_seeder.py import asyncio import httpx import logging from sqlalchemy import text from app.db.session import AsyncSessionLocal # Logolás beállítása a Sentinel monitorozáshoz logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(name)s: %(message)s') logger = logging.getLogger("Smart-Seeder-v1.0.2") async def seed_with_priority(): """ Feltölti a catalog_discovery táblát az RDW alapján. Logika: Csak azokat a márkákat keressük, amikből legalább 10 db fut az utakon, hogy ne szemeteljük tele a katalógust egyedi barkács-járművekkel. """ # RDW SoQL lekérdezés: Márka (merk), Típus (voertuigsoort) és Darabszám (total) # A szerveroldali csoportosítás és szűrés (having total >= 10) miatt villámgyors. RDW_URL = ( "https://opendata.rdw.nl/resource/m9d7-ebf2.json?" "$select=merk,voertuigsoort,count(*)%20as%20total" "&$group=merk,voertuigsoort" "&$having=total%20>=%2010" ) logger.info("📥 Adatok lekérése az RDW-től prioritásos besoroláshoz...") async with httpx.AsyncClient(timeout=120) as client: try: resp = await client.get(RDW_URL) if resp.status_code != 200: logger.error(f"❌ RDW API hiba: {resp.status_code}") return raw_data = resp.json() logger.info(f"📊 {len(raw_data)} potenciális márka-kategória páros érkezett.") async with AsyncSessionLocal() as db: for entry in raw_data: make = str(entry.get("merk", "")).upper().strip() v_kind = entry.get("voertuigsoort", "") if not make: continue # --- PRIORITÁS LOGIKA (Master Book 2.0 szerint) --- # 1. Személyautó (Personenauto) -> 'pending' (Azonnal feldolgozandó) # 2. Motor (Motorfiets) -> 'queued_motor' # 3. Minden más (Teher, Busz, Mezőgazdasági) -> 'queued_heavy' if "Personenauto" in v_kind: status = 'pending' v_class = 'car' elif "Motorfiets" in v_kind: status = 'queued_motor' v_class = 'motorcycle' else: status = 'queued_heavy' v_class = 'truck' # UPSERT Logika: Ha már létezik, de még 'pending', akkor frissítjük a státuszt, # de nem írjuk felül a már feldolgozott (processed) rekordokat. query = text(""" INSERT INTO data.catalog_discovery (make, model, vehicle_class, source, status) VALUES (:make, 'ALL_VARIANTS', :v_class, 'smart_seeder_v1_0_2', :status) ON CONFLICT (make, model, vehicle_class) DO UPDATE SET status = CASE WHEN data.catalog_discovery.status = 'pending' THEN EXCLUDED.status ELSE data.catalog_discovery.status END WHERE data.catalog_discovery.make = EXCLUDED.make; """) await db.execute(query, { "make": make, "v_class": v_class, "status": status }) await db.commit() logger.info("✅ Discovery lista sikeresen feltöltve és prioritizálva.") except Exception as e: logger.error(f"❌ Kritikus hiba a seeder futása közben: {e}") if __name__ == "__main__": asyncio.run(seed_with_priority())