STABLE: Final schema sync, optimized gitignore

This commit is contained in:
Kincses
2026-02-26 08:19:25 +01:00
parent 893f39fa15
commit 505543330a
203 changed files with 11590 additions and 9542 deletions

View File

@@ -1,42 +1,84 @@
# /opt/docker/dev/service_finder/backend/app/workers/service_auditor.py
import asyncio
import logging
from app.db.session import SessionLocal
from app.models.organization import Organization
from app.models.service import ServiceProfile
from datetime import datetime, timezone
from sqlalchemy import select, and_
from app.db.session import AsyncSessionLocal
from app.models.organization import Organization, OrgType
from app.models.service import ServiceProfile
logger = logging.getLogger("Robot2-Auditor")
# Logolás beállítása a Sentinel rendszerhez
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s]: %(message)s')
logger = logging.getLogger("Robot-Service-Auditor")
class ServiceAuditor:
"""
Robot: Service Auditor.
Feladata a meglévő szerviz szolgáltatók adatainak validálása és a megszűnt helyek inaktiválása.
"""
@classmethod
async def audit_services(cls):
"""Időszakos ellenőrzés a megszűnt helyek kiszűrésére."""
async with SessionLocal() as db:
# Csak az aktív szervizeket nézzük
""" Időszakos ellenőrzés a megszűnt helyek kiszűrésére. """
async with AsyncSessionLocal() as db:
# 1. LOGIKA: Csak az aktív szerviz típusú szervezeteket keressük
stmt = select(Organization).where(
and_(Organization.org_type == "service", Organization.is_active == True)
and_(
Organization.org_type == OrgType.service,
Organization.is_active == True
)
)
result = await db.execute(stmt)
services = result.scalars().all()
logger.info(f"🕵️ Audit indítása {len(services)} szerviznél...")
for service in services:
# 1. Ellenőrzés külső forrásnál (API hívás helye)
# status = await check_external_status(service.full_name)
is_still_open = True # Itt jön az OSM/Google API válasza
if not is_still_open:
service.is_active = False # SOFT-DELETE
logger.info(f"⚠️ Szerviz inaktiválva (megszűnt): {service.full_name}")
# Rate limit védelem
await asyncio.sleep(2)
try:
# 2. LOGIKA: Ellenőrzés külső forrásnál (API hívás OSM/Google/Cégtár felé)
# Itt futhat le egy külső keresés a név és cím alapján.
# Példa: status = await external_api.is_still_operating(service.id)
is_still_open = True # Ez a szimulált API válasz
# 3. LOGIKA: MDM Frissítés
stmt_profile = select(ServiceProfile).where(ServiceProfile.organization_id == service.id)
profile_res = await db.execute(stmt_profile)
profile = profile_res.scalar_one_or_none()
if not is_still_open:
# Soft-delete: a szervezet inaktív lesz, a profil státusza bezárt
service.is_active = False
if profile:
profile.status = 'closed'
profile.last_audit_at = datetime.now(timezone.utc)
logger.info(f"⚠️ Szerviz inaktiválva (megszűnt): {service.full_name}")
else:
# Ha nyitva van, csak az audit dátumát frissítjük
if profile:
profile.last_audit_at = datetime.now(timezone.utc)
# 4. Rate limit védelem a külső API-k és a DB terhelés kímélése érdekében
await asyncio.sleep(1)
except Exception as e:
logger.error(f"❌ Hiba a(z) {service.full_name} auditálása közben: {str(e)}")
# A tranzakció lezárása
await db.commit()
logger.info("✅ Szerviz-audit folyamat befejeződött.")
@classmethod
async def run_periodic_audit(cls):
""" Folyamatos futtatás (Service mode). """
while True:
logger.info("🕵️ Negyedéves szerviz-audit indítása...")
await cls.audit_services()
# 90 naponta fusson le teljes körűen
await asyncio.sleep(90 * 86400)
try:
# Alapértelmezett futási ciklus (pl. 90 naponta)
await cls.audit_services()
logger.info("💤 Auditor robot pihenőre tér (90 nap).")
await asyncio.sleep(90 * 86400)
except Exception as e:
logger.error(f"🚨 Kritikus hiba az Auditor robotban: {e}")
await asyncio.sleep(3600) # Hiba esetén 1 óra múlva újrapróbálja
if __name__ == "__main__":
asyncio.run(ServiceAuditor.run_periodic_audit())