Initial commit: Robot ökoszisztéma v2.0 - Stabilizált jármű és szerviz robotok

This commit is contained in:
Kincses
2026-03-04 02:03:03 +01:00
commit 250f4f4b8f
7942 changed files with 449625 additions and 0 deletions

View File

@@ -0,0 +1,157 @@
# /opt/docker/dev/service_finder/backend/app/tests_internal/diagnostics/diagnose_system.py
"""
🛰️ SENTINEL SYSTEM DIAGNOSTICS - MB2.0 (2026)
---------------------------------------------
CÉL: A rendszer mélyszintű integritásának és működőképességének auditálása.
FŐBB TESZTEK:
1. Adatbázis Kapcsolat: PostgreSQL aszinkron elérés ellenőrzése.
2. Séma Integritás: Kritikus Master Data táblák és mezők meglétének vizsgálata.
3. Rendszer Paraméterek: A Sentinel központi konfigurációs táblájának ellenőrzése.
4. i18n Motor: Nyelvi gyorsítótár (Cache) és fordítási mechanizmus tesztje.
5. Robot Pipeline: Staging (Hunter) és Gold (Catalog) rekordok számlálása.
FUTTATÁS:
docker compose exec api python -m app.tests_internal.diagnostics.diagnose_system
"""
import asyncio
import sys
import logging
from datetime import datetime
from sqlalchemy import text, select, func
# 🛠️ KRITIKUS IMPORT KÖRNYEZET ELLENŐRZÉSE
try:
from app.core.config import settings
# Megjegyzés: A projekt struktúrájától függően AsyncSessionLocal az app.database-ben van
from app.database import AsyncSessionLocal
from app.services.translation_service import translation_service
from app.models.system import SystemParameter
from app.models.identity import User
from app.models.organization import Organization
from app.models.asset import AssetCatalog
from app.models.vehicle_definitions import VehicleModelDefinition
except ImportError as e:
print(f"\n❌ [KRITIKUS HIBA] Az importálás nem sikerült: {e}")
print("💡 Javaslat: Ellenőrizd a PYTHONPATH-t és a __init__.py fájlok meglétét!")
sys.exit(1)
# SQL logolás némítása a tiszta kimenet érdekében
logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING)
async def diagnose():
start_time = datetime.now()
print("\n" + ""*70)
print(f"🛰️ SENTINEL SYSTEM DIAGNOSTICS - MB2.0 | {start_time.strftime('%Y-%m-%d %H:%M:%S')}")
print(""*70 + "\n")
async with AsyncSessionLocal() as session:
# --- 1. CSATLAKOZÁS ÉS ADATBÁZIS PING ---
print("1⃣ Kapcsolódási teszt...")
try:
await session.execute(text("SELECT 1"))
print(" [✅ OK] PostgreSQL aszinkron kapcsolat aktív.")
except Exception as e:
print(f" [❌ HIBA] Nem sikerült kapcsolódni az adatbázishoz: {e}")
return
# --- 2. SÉMA INTEGRITÁS (Master Data Audit) ---
print("\n2⃣ Séma integritás ellenőrzése (Kritikus mezők)...")
# Tábla neve (sémával) | Elvárt oszlopok listája
tables_to_check = [
("identity.users", ["preferred_language", "scope_id", "is_active"]),
("data.organizations", ["org_type", "folder_slug", "is_active"]),
("data.assets", ["owner_org_id", "catalog_id", "vin"]),
# "asset_catalog" helyett "vehicle_catalog"
("data.vehicle_catalog", ["make", "model", "factory_data"]),
("data.vehicle_model_definitions", ["status", "raw_search_context"])
]
for table, columns in tables_to_check:
try:
schema_name, table_name = table.split('.')
query = text(f"""
SELECT column_name FROM information_schema.columns
WHERE table_schema = '{schema_name}' AND table_name = '{table_name}';
""")
res = await session.execute(query)
existing_cols = [row[0] for row in res.fetchall()]
if not existing_cols:
print(f" [❌ HIBA] A tábla NEM létezik: {table}")
continue
missing = [c for c in columns if c not in existing_cols]
if not missing:
print(f" [✅ OK] {table:35} (Minden mező rendben)")
else:
print(f" [⚠️ HIÁNY] {table:35} | Hiányzó mezők: {', '.join(missing)}")
except Exception as e:
print(f" [❌ HIBA] Hiba a(z) {table} ellenőrzésekor: {e}")
# --- 3. RENDSZER PARAMÉTEREK (Sentinel Config) ---
print("\n3⃣ System Parameters (Sentinel Config) ellenőrzése...")
try:
res = await session.execute(select(SystemParameter))
params = res.scalars().all()
if params:
print(f" [✅ OK] Talált paraméterek: {len(params)} db")
# Kritikus kulcsok, amiknek illik lenniük
critical_keys = ["SECURITY_MAX_RECORDS_PER_HOUR", "VEHICLE_LIMIT"]
existing_keys = [p.key for p in params]
for ck in critical_keys:
status = "✔️" if ck in existing_keys else "❌ (Hiányzik)"
print(f" {status} {ck}")
else:
print(" [⚠️ FIGYELEM] A system_parameters tábla üres! Futtasd a seedert.")
except Exception as e:
print(f" [❌ HIBA] SystemParameter lekérdezési hiba: {e}")
# --- 4. i18n ÉS CACHE MOTOR ---
print("\n4⃣ Nyelvi motor és i18n Cache ellenőrzése...")
try:
# Gyorsítótár frissítése az adatbázisból
await translation_service.load_cache(session)
test_key = "COMMON.SAVE"
test_val = translation_service.get_text(test_key, "hu")
# Ha a visszakapott érték nem egyezik a kulccsal, akkor van fordítás
if test_val and test_val != f"[{test_key}]":
print(f" [✅ OK] Fordítás sikeres (HU): '{test_key}' -> '{test_val}'")
else:
print(f" [❌ HIBA] Fordítás nem működik. Nincs betöltött adat vagy hibás a cache.")
except Exception as e:
print(f" [❌ HIBA] Nyelvi motor hiba: {e}")
# --- 5. ROBOT ELŐKÉSZÜLETEK (Pipeline MDM) ---
print("\n5⃣ Robot Pipeline (MDM Staging) állapot...")
try:
# Hunter robot eredményei (nyers adatok)
res_hunter = await session.execute(
select(func.count(VehicleModelDefinition.id)).where(VehicleModelDefinition.status == 'unverified')
)
unverified_count = res_hunter.scalar() or 0
# Catalog robot eredményei (tisztított adatok)
res_gold = await session.execute(select(func.count(AssetCatalog.id)))
gold_count = res_gold.scalar() or 0
print(f" [📊 STAT] Feldolgozatlan rekordok (Staging): {unverified_count} db")
print(f" [📊 STAT] Validált arany rekordok (Catalog): {gold_count} db")
except Exception as e:
print(f" [❌ HIBA] Robot-statisztika hiba: {e}")
duration = (datetime.now() - start_time).total_seconds()
print("\n" + ""*70)
print(f"🏁 DIAGNOSZTIKA BEFEJEZŐDÖTT | Időtartam: {duration:.2f} mp")
print(""*70 + "\n")
if __name__ == "__main__":
try:
asyncio.run(diagnose())
except KeyboardInterrupt:
print("\n🛑 Diagnosztika megszakítva a felhasználó által.")
sys.exit(0)