""" Gamification Point Rules Seed Script ===================================== Cél: Dinamikus pontszabályok feltöltése a gamification.point_rules táblába. A pontértékek NINCSENEK beégetve a kódba, hanem az adatbázisból (point_rules tábla) olvassuk ki őket futásidőben. A Vezető Tervező utasítása szerint: - TILOS hardcoded pontszámokat használni a service rétegben! - Minden pontértéket a point_rules táblából kell lekérdezni action_key alapján. Használat: docker compose exec sf_api python3 /app/backend/app/scripts/seed_gamification_rules.py """ import asyncio import logging import sys from pathlib import Path # Projekt gyökér hozzáadása a Python path-hoz sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent)) from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from app.core.config import settings from app.models.gamification.gamification import PointRule logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") logger = logging.getLogger("Seed-Gamification-Rules") # A seed-elendő pontszabályok definíciói # FIGYELEM: Ezek a definíciók csak a seed script számára vannak itt. # A service rétegben a pontokat az adatbázisból (point_rules tábla) kell kiolvasni! SEED_RULES = [ { "action_key": "ADD_NEW_PROVIDER", "points": 500, "description": "Új szolgáltató rögzítése a rendszerbe", "is_active": True, }, { "action_key": "USE_UNVERIFIED_PROVIDER", "points": 200, "description": "Szervizesemény/költség rögzítése olyan szolgáltatónál, aminek még nincs 5 megerősítése", "is_active": True, }, { "action_key": "RATE_PROVIDER", "points": 250, "description": "Szolgáltató értékelése (tagekkel)", "is_active": True, }, { "action_key": "UPDATE_PROVIDER", "points": 100, "description": "Szolgáltató adatainak szerkesztése (kategóriák, címkék frissítése)", "is_active": True, }, ] async def seed_point_rules(): """ Feltölti a gamification.point_rules táblát a fenti szabályokkal, de csak azokat a rekordokat szúrja be, amelyek még nem léteznek (action_key alapján UPSERT helyett INSERT WHERE NOT EXISTS). """ # Adatbázis kapcsolat létrehozása engine = create_async_engine(settings.DATABASE_URL, echo=False) async_session = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) async with async_session() as db: try: inserted_count = 0 skipped_count = 0 for rule_data in SEED_RULES: # Ellenőrizzük, hogy létezik-e már ez a szabály stmt = select(PointRule).where( PointRule.action_key == rule_data["action_key"] ) result = await db.execute(stmt) existing = result.scalar_one_or_none() if existing: logger.info( f"⏭️ Szabály már létezik: {rule_data['action_key']} " f"(pont: {existing.points}, ID: {existing.id})" ) skipped_count += 1 continue # Új szabály beszúrása new_rule = PointRule( action_key=rule_data["action_key"], points=rule_data["points"], description=rule_data["description"], is_active=rule_data["is_active"], ) db.add(new_rule) await db.flush() logger.info( f"✅ Szabály létrehozva: {rule_data['action_key']} " f"(pont: {rule_data['points']}, ID: {new_rule.id})" ) inserted_count += 1 await db.commit() logger.info( f"\n📊 Összegzés: {inserted_count} új szabály beszúrva, " f"{skipped_count} már létezett." ) except Exception as e: await db.rollback() logger.error(f"❌ Hiba a seedelés során: {e}", exc_info=True) raise finally: await engine.dispose() if __name__ == "__main__": asyncio.run(seed_point_rules())