# /opt/docker/dev/service_finder/backend/app/seed_system.py import asyncio import logging import uuid from sqlalchemy import select from app.database import AsyncSessionLocal from app.models.identity import User, Person, UserRole from app.models.system import SystemParameter, PointRule, LevelConfig, SubscriptionTier, UserStats from app.core.security import get_password_hash from app.core.config import settings # Logolás beállítása a Sentinel monitorozáshoz logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] Sentinel-Seed: %(message)s') logger = logging.getLogger("System-Seeder") async def seed_data(): """ Rendszer alapadatok inicializálása: Admin, Gamification szabályok és Előfizetési szintek. """ async with AsyncSessionLocal() as db: logger.info("🚀 Rendszer-alapozás indítása (MB2.0 Standard)...") admin_email = settings.INITIAL_ADMIN_EMAIL admin_password = settings.INITIAL_ADMIN_PASSWORD if not admin_email or not admin_password: logger.error("❌ HIBA: Admin hitelesítési adatok hiányoznak a környezeti változókból!") return # 1. LOGIKA: Superadmin létrehozása (Identity + Person link) stmt = select(User).where(User.email == admin_email) admin_exists = (await db.execute(stmt)).scalar_one_or_none() if not admin_exists: # Személy létrehozása new_person = Person( first_name="Rendszer", last_name="Adminisztrátor", id_uuid=uuid.uuid4(), is_active=True ) db.add(new_person) await db.flush() # Felhasználó létrehozása new_admin = User( email=admin_email, hashed_password=get_password_hash(admin_password), role=UserRole.superadmin, is_active=True, person_id=new_person.id, reputation_score=100 # Az admin hírneve alapértelmezetten magas ) db.add(new_admin) await db.flush() # Statisztikai rekord létrehozása a Gamificationhöz db.add(UserStats(user_id=new_admin.id, total_xp=0, current_level=1)) logger.info(f"✅ Superadmin létrehozva: {admin_email}") # 2. LOGIKA: Rendszerparaméterek (Sentinel Config) params = [ ("ASSET_REVIEW_CRITERIA", ["Kényelem", "Fogyasztás", "Megbízhatóság", "Szervizigény"], "Értékelési szempontok"), ("SECURITY_MAX_RECORDS_PER_HOUR", "50", "Biztonsági limit óránkénti feltöltésre") ] for key, val, desc in params: stmt_p = select(SystemParameter).where(SystemParameter.key == key) if not (await db.execute(stmt_p)).scalar_one_or_none(): db.add(SystemParameter(key=key, value=val, description=desc)) # 3. LOGIKA: Gamification Pontszabályok rules = [ ("ASSET_REGISTER", 100, "Új jármű felvétele"), ("ASSET_REVIEW", 75, "Jármű értékelése"), ("COST_RECORD", 50, "Költség rögzítése (tankolás/szerviz)"), ("OCR_UPLOAD", 120, "Dokumentum sikeres OCR feldolgozása") ] for key, pts, desc in rules: stmt_r = select(PointRule).where(PointRule.action_key == key) if not (await db.execute(stmt_r)).scalar_one_or_none(): db.add(PointRule(action_key=key, points=pts, description=desc)) # 4. LOGIKA: Gamification Rangok (Levels) stmt_l = select(LevelConfig) if not (await db.execute(stmt_l)).first(): db.add_all([ LevelConfig(level_number=1, min_points=0, rank_name="Kezdő Sofőr"), LevelConfig(level_number=2, min_points=1000, rank_name="Tapasztalt Vezető"), LevelConfig(level_number=3, min_points=5000, rank_name="Flotta Mester"), LevelConfig(level_number=4, min_points=15000, rank_name="Sentinel Legenda") ]) # 5. LOGIKA: Előfizetési Csomagok (Subscription Tiers) stmt_t = select(SubscriptionTier) if not (await db.execute(stmt_t)).first(): db.add_all([ SubscriptionTier(name="FREE", rules={"max_assets": 1, "ai_ocr": False, "reports": False}), SubscriptionTier(name="PREMIUM", rules={"max_assets": 10, "ai_ocr": True, "reports": True}), SubscriptionTier(name="FLEET", rules={"max_assets": 500, "ai_ocr": True, "reports": True, "api_access": True}) ]) await db.commit() logger.info("✨ A Sentinel ökoszisztéma alapjai sikeresen rögzítve!") if __name__ == "__main__": asyncio.run(seed_data())