"""Async DB engine, session factory, declarative base, UTC helper.""" from __future__ import annotations from datetime import datetime, timezone from typing import AsyncIterator from sqlalchemy.ext.asyncio import ( AsyncSession, async_sessionmaker, create_async_engine, ) from sqlalchemy.orm import DeclarativeBase from app.config import get_settings class Base(DeclarativeBase): pass _engine = None _session_factory: async_sessionmaker[AsyncSession] | None = None def utcnow() -> datetime: """All timestamps in Cassandra are tz-aware UTC by convention.""" return datetime.now(timezone.utc) def get_engine(): global _engine if _engine is None: s = get_settings() _engine = create_async_engine( s.DATABASE_URL, pool_pre_ping=True, pool_recycle=3600, future=True, ) return _engine def get_session_factory() -> async_sessionmaker[AsyncSession]: global _session_factory if _session_factory is None: _session_factory = async_sessionmaker( get_engine(), expire_on_commit=False, class_=AsyncSession ) return _session_factory async def get_session() -> AsyncIterator[AsyncSession]: """FastAPI dependency yielding an async session.""" async with get_session_factory()() as session: yield session