import asyncio import httpx import logging import os from sqlalchemy import text from app.db.session import SessionLocal logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s]: %(message)s') logger = logging.getLogger("Robot-0-Strategist") class Robot0Strategist: RDW_API = "https://opendata.rdw.nl/resource/m9d7-ebf2.json" RDW_TOKEN = os.getenv("RDW_APP_TOKEN") HEADERS = {"X-App-Token": RDW_TOKEN} if RDW_TOKEN else {} # Holland típusok leképezése a mi kategóriáinkra a kért sorrendben CATEGORIES = [ {"name": "car", "rdw_types": ["'Personenauto'"]}, {"name": "motorcycle", "rdw_types": ["'Motorfiets'"]}, {"name": "truck", "rdw_types": ["'Bedrijfswagen'", "'Vrachtwagen'", "'Opleggertrekker'"]}, {"name": "other", "rdw_types": ["NOT IN ('Personenauto', 'Motorfiets', 'Bedrijfswagen', 'Vrachtwagen', 'Opleggertrekker')"]} ] async def get_popular_makes(self, vehicle_class, rdw_types): """Lekéri az adott kategória legnépszerűbb márkáit az RDW-től.""" # SQL-szerű szűrés az API-n keresztül type_filter = " OR ".join([f"voertuigsoort = {t}" for t in rdw_types]) if "NOT IN" in rdw_types[0]: # Speciális kezelés az 'egyéb' kategóriához type_filter = f"voertuigsoort {rdw_types[0]}" params = { "$select": "merk, count(*)", "$where": type_filter, "$group": "merk", "$order": "count DESC", "$limit": 500 # Kategóriánként az 500 legfontosabb márka bőven elég } async with httpx.AsyncClient(timeout=30) as client: try: resp = await client.get(self.RDW_API, params=params, headers=self.HEADERS) if resp.status_code == 200: return resp.json() return [] except Exception as e: logger.error(f"❌ Hiba a {vehicle_class} lekérdezésekor: {e}") return [] async def run(self): logger.info("🚀 Robot 0 (Strategist) INDUL - Piaci alapú sorrend felállítása...") async with SessionLocal() as db: # 1. Töröljük a jelenlegi várólistát, hogy tiszta lappal induljunk (opcionális) # await db.execute(text("DELETE FROM data.catalog_discovery WHERE status = 'pending'")) for category in self.CATEGORIES: v_class = category["name"] logger.info(f"📊 {v_class.upper()} kategória elemzése...") makes = await self.get_popular_makes(v_class, category["rdw_types"]) added_count = 0 for item in makes: make_name = item.get("merk") if not make_name: continue # Beillesztés a Discovery táblába # A prioritást az ID-k sorrendje fogja adni, amit Robot 1 követ await db.execute(text(""" INSERT INTO data.catalog_discovery (make, model, vehicle_class, status, source) VALUES (:make, 'ALL_MODELS', :class, 'pending', 'ROBOT-0-POPULARITY') ON CONFLICT (make, model, vehicle_class) DO UPDATE SET status = 'pending' WHERE catalog_discovery.status != 'processed' """), {"make": make_name.upper(), "class": v_class}) added_count += 1 await db.commit() logger.info(f"✅ {v_class.upper()}: {added_count} márka sorba állítva a népszerűség alapján.") logger.info("🏁 Robot 0 végzett. A Discovery tábla készen áll a Robot 1 (Hunter) számára!") if __name__ == "__main__": asyncio.run(Robot0Strategist().run())