Initial commit

Made-with: Cursor
This commit is contained in:
Dusan Vojacek
2026-03-20 13:27:37 +01:00
commit 8b4af663d8
77 changed files with 13337 additions and 0 deletions

48
backend/app/database.py Normal file
View File

@@ -0,0 +1,48 @@
"""asyncpg connection pool and DB access helpers."""
from collections.abc import AsyncIterator
from contextlib import asynccontextmanager
import asyncpg
from app.config import get_settings
_pool: asyncpg.Pool | None = None
async def init_db_pool() -> None:
"""Create global pool (call from FastAPI lifespan)."""
global _pool
if _pool is not None:
return
s = get_settings()
_pool = await asyncpg.create_pool(
host=s.db_host,
port=s.db_port,
user=s.db_user,
password=s.db_password,
database=s.db_name,
min_size=1,
max_size=10,
)
async def close_db_pool() -> None:
global _pool
if _pool is not None:
await _pool.close()
_pool = None
def get_pool() -> asyncpg.Pool:
if _pool is None:
raise RuntimeError("DB pool not initialized; call init_db_pool() first")
return _pool
@asynccontextmanager
async def get_db() -> AsyncIterator[asyncpg.Connection]:
"""Async context manager yielding a connection from the pool."""
pool = get_pool()
async with pool.acquire() as conn:
yield conn