admin_nyelvi_javítas

This commit is contained in:
Roo
2026-07-25 10:22:03 +00:00
parent 33c4d793db
commit c9118bf52f
29 changed files with 4474 additions and 943 deletions

View File

@@ -4,8 +4,13 @@ Aszinkron ütemező (APScheduler) a napi karbantartási feladatokhoz.
Integrálva a FastAPI lifespan eseményébe, így az alkalmazás indításakor elindul,
és leálláskor megáll.
Biztonsági Jitter: A napi futás 00:15-kor indul, de jitter=900 (15 perc) paraméterrel
véletlenszerűen 0:15 és 0:30 között fog lefutni.
Feladatok:
1. daily_financial_maintenance (00:15 UTC) — Voucher/Withdrawal/User downgrade
2. subscription_monitor (01:00 UTC) — UserSubscription & OrganizationSubscription lejárat
3. inactivity_monitor (02:00 UTC) — 180 napos inaktivitás detektálás
Biztonsági Jitter: Minden napi feladat jitter=900 (15 perc) paraméterrel rendelkezik,
így véletlenszerűen eltolódnak a megadott időponthoz képest.
"""
import asyncio
@@ -190,7 +195,7 @@ def setup_scheduler() -> None:
"""Beállítja a scheduler-t a napi feladatokkal."""
scheduler = get_scheduler()
# Napi futás 00:15-kor, jitter=900 (15 perc véletlenszerű eltolás)
# ── 1. Napi pénzügyi karbantartás 00:15-kor ──
scheduler.add_job(
daily_financial_maintenance,
trigger=CronTrigger(hour=0, minute=15, jitter=900),
@@ -199,7 +204,85 @@ def setup_scheduler() -> None:
replace_existing=True
)
logger.info("Scheduler jobs registered")
# ── 2. Subscription Monitor 01:00-kor ──
# Kezeli a lejárt UserSubscription és OrganizationSubscription rekordokat.
from app.workers.system.subscription_monitor_worker import run_full_monitor as run_sub_monitor
async def subscription_monitor_job():
logger.info("Scheduler: Starting subscription monitor job...")
async with AsyncSessionLocal() as db:
try:
stats = await run_sub_monitor()
total = (
stats["user_subscriptions"]["processed"]
+ stats["org_subscriptions"]["processed"]
)
# Naplózás ProcessLog-ba
process_log = ProcessLog(
process_name="Subscription-Monitor",
items_processed=total,
items_failed=len(stats["user_subscriptions"]["errors"]) + len(stats["org_subscriptions"]["errors"]),
end_time=datetime.utcnow(),
details={
"status": "COMPLETED",
"user_processed": stats["user_subscriptions"]["processed"],
"org_processed": stats["org_subscriptions"]["processed"],
"user_downgraded": len(stats["user_subscriptions"]["downgraded"]),
"org_downgraded": len(stats["org_subscriptions"]["downgraded"]),
}
)
db.add(process_log)
await db.commit()
logger.info(f"Scheduler: Subscription monitor completed ({total} processed)")
except Exception as e:
logger.error(f"Scheduler: Subscription monitor failed: {e}", exc_info=True)
await db.rollback()
scheduler.add_job(
subscription_monitor_job,
trigger=CronTrigger(hour=1, minute=0, jitter=900),
id="subscription_monitor",
name="Subscription Monitor",
replace_existing=True
)
# ── 3. Inactivity Monitor 02:00-kor ──
# Detektálja a 180+ napja inaktív usereket.
from app.workers.system.inactivity_monitor_worker import run_full_monitor as run_inactivity_monitor
async def inactivity_monitor_job():
logger.info("Scheduler: Starting inactivity monitor job...")
async with AsyncSessionLocal() as db:
try:
stats = await run_inactivity_monitor()
# Naplózás ProcessLog-ba
process_log = ProcessLog(
process_name="Inactivity-Monitor",
items_processed=stats["processed"],
items_failed=len(stats["errors"]),
end_time=datetime.utcnow(),
details={
"status": "COMPLETED",
"processed": stats["processed"],
"suspended": len(stats["suspended"]),
}
)
db.add(process_log)
await db.commit()
logger.info(f"Scheduler: Inactivity monitor completed ({stats['processed']} processed)")
except Exception as e:
logger.error(f"Scheduler: Inactivity monitor failed: {e}", exc_info=True)
await db.rollback()
scheduler.add_job(
inactivity_monitor_job,
trigger=CronTrigger(hour=2, minute=0, jitter=900),
id="inactivity_monitor",
name="Inactivity Monitor",
replace_existing=True
)
logger.info("Scheduler jobs registered: daily_financial, subscription_monitor, inactivity_monitor")
@asynccontextmanager