feature/bitacora-correccion-filtro-tenant

This commit is contained in:
2026-05-06 12:12:09 -06:00
parent 86a3d703ba
commit 8c8cd0e247
4 changed files with 166 additions and 63 deletions

View File

@@ -136,8 +136,13 @@ def get_core_db(request: Request = None) -> Generator[Session, None, None]:
FastAPI inyecta ``Request`` automáticamente; los llamadores existentes que
escriben ``db: Session = Depends(get_core_db)`` siguen funcionando sin
cambios porque ``Request`` se resuelve en la capa de dependencia.
Replica el mismo ``(tenant_id, company_id)`` en ContextVars para código que
comparte la transacción sin la misma instancia de sesión (p. ej. listeners).
"""
tenant_id, company_id = _extract_rls_context(request)
token_t = rls_tenant_var.set(tenant_id)
token_c = rls_company_var.set(company_id)
db = CoreSessionLocal()
db.info[RLS_TENANT_KEY] = tenant_id
db.info[RLS_COMPANY_KEY] = company_id
@@ -145,18 +150,26 @@ def get_core_db(request: Request = None) -> Generator[Session, None, None]:
yield db
finally:
db.close()
rls_tenant_var.reset(token_t)
rls_company_var.reset(token_c)
async def get_async_core_db(request: Request = None) -> AsyncGenerator[AsyncSession, None]:
"""Dependency async para obtener sesión con contexto RLS."""
tenant_id, company_id = _extract_rls_context(request)
async with AsyncCoreSessionLocal() as session:
session.info[RLS_TENANT_KEY] = tenant_id
session.info[RLS_COMPANY_KEY] = company_id
try:
yield session
finally:
await session.close()
token_t = rls_tenant_var.set(tenant_id)
token_c = rls_company_var.set(company_id)
try:
async with AsyncCoreSessionLocal() as session:
session.info[RLS_TENANT_KEY] = tenant_id
session.info[RLS_COMPANY_KEY] = company_id
try:
yield session
finally:
await session.close()
finally:
rls_tenant_var.reset(token_t)
rls_company_var.reset(token_c)
@contextmanager