from sqlalchemy import text from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from sqlalchemy.orm import DeclarativeBase from app.core.config import settings engine = create_async_engine( settings.database_url, echo=settings.app_env == "development", pool_pre_ping=True, pool_size=10, max_overflow=20, ) AsyncSessionLocal = async_sessionmaker( engine, class_=AsyncSession, expire_on_commit=False, ) class Base(DeclarativeBase): pass async def get_db() -> AsyncSession: async with AsyncSessionLocal() as session: try: # Default: RLS bypass active so that unauthenticated routes # (register, login, password-reset) and internal operations work. # get_current_user() will disable bypass and set app.company_id for # authenticated, non-SUPER_ADMIN requests. await session.execute(text("SET LOCAL app.bypass_rls = 'on'")) yield session await session.commit() except Exception: await session.rollback() raise finally: await session.close()