"""Job definitions and enqueueing utilities using pgqueuer.""" import json import os import asyncpg from pgqueuer.queries import Queries # Job type constants JOB_RANDOM_NUMBER = "random_number" # SQLAlchemy uses postgresql+asyncpg://, but asyncpg needs postgresql:// _raw_url = os.getenv( "DATABASE_URL", "postgresql+asyncpg://postgres:postgres@localhost:5432/arbret" ) DATABASE_URL = _raw_url.replace("postgresql+asyncpg://", "postgresql://") # Connection pool for job enqueueing (lazy initialized) _pool: asyncpg.Pool | None = None async def get_job_pool() -> asyncpg.Pool: """Get or create the connection pool for job enqueueing.""" global _pool if _pool is None: _pool = await asyncpg.create_pool(DATABASE_URL, min_size=1, max_size=5) return _pool async def close_job_pool() -> None: """Close the connection pool. Call on app shutdown.""" global _pool if _pool is not None: await _pool.close() _pool = None async def enqueue_random_number_job(user_id: int) -> int: """ Enqueue a random number job for the given user. Args: user_id: The ID of the user who triggered the job. Returns: The job ID. Raises: Exception: If enqueueing fails. """ pool = await get_job_pool() async with pool.acquire() as conn: queries = Queries.from_asyncpg_connection(conn) payload = json.dumps({"user_id": user_id}).encode() job_ids = await queries.enqueue(JOB_RANDOM_NUMBER, payload) return job_ids[0]