feat: Add scheduler for daily user credits recharge

This commit is contained in:
JSC
2025-08-11 00:30:29 +02:00
parent bdeb00d562
commit d1bf2fe0a4
8 changed files with 698 additions and 109 deletions

63
app/services/scheduler.py Normal file
View File

@@ -0,0 +1,63 @@
"""Scheduler service for periodic tasks."""
from collections.abc import Callable
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from sqlmodel.ext.asyncio.session import AsyncSession
from app.core.logging import get_logger
from app.services.credit import CreditService
logger = get_logger(__name__)
class SchedulerService:
"""Service for managing scheduled tasks."""
def __init__(self, db_session_factory: Callable[[], AsyncSession]) -> None:
"""Initialize the scheduler service.
Args:
db_session_factory: Factory function to create database sessions
"""
self.db_session_factory = db_session_factory
self.scheduler = AsyncIOScheduler()
self.credit_service = CreditService(db_session_factory)
async def start(self) -> None:
"""Start the scheduler and register all tasks."""
logger.info("Starting scheduler service...")
# Add daily credit recharge job (runs at midnight UTC)
self.scheduler.add_job(
self._daily_credit_recharge,
"cron",
hour=0,
minute=0,
id="daily_credit_recharge",
name="Daily Credit Recharge",
replace_existing=True,
)
self.scheduler.start()
logger.info("Scheduler service started successfully")
async def stop(self) -> None:
"""Stop the scheduler."""
logger.info("Stopping scheduler service...")
self.scheduler.shutdown()
logger.info("Scheduler service stopped")
async def _daily_credit_recharge(self) -> None:
"""Execute daily credit recharge for all users."""
logger.info("Starting daily credit recharge task...")
try:
stats = await self.credit_service.recharge_all_users_credits()
logger.info(
"Daily credit recharge completed successfully: %s",
stats,
)
except Exception:
logger.exception("Daily credit recharge task failed")