Merge branch 'development' into feature/api-sittar-actualizacion

This commit is contained in:
2026-05-08 14:39:24 -06:00
6 changed files with 43 additions and 17 deletions

View File

@@ -154,12 +154,13 @@ def get_core_db(request: Request = None) -> Generator[Session, None, None]:
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).
No se escriben las ContextVars de RLS aquí: las dependencias síncronas con
``yield`` se ejecutan vía ``contextmanager_in_threadpool`` (hilo worker) y
mezclar ``ContextVar.set`` / ``reset`` entre ese hilo y el bucle asyncio
provoca ``ValueError: ... was created in a different Context``. El aislamiento
RLS se aplica con ``session.info`` (véase ``after_begin`` y audit 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
@@ -167,14 +168,15 @@ def get_core_db(request: Request = None) -> Generator[Session, None, None]:
yield db
finally:
db.close()
reset_rls_context_tokens(token_t, 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)
token_t = rls_tenant_var.set(tenant_id)
token_c = rls_company_var.set(company_id)
prev_tenant = rls_tenant_var.get()
prev_company = rls_company_var.get()
rls_tenant_var.set(tenant_id)
rls_company_var.set(company_id)
try:
async with AsyncCoreSessionLocal() as session:
session.info[RLS_TENANT_KEY] = tenant_id
@@ -184,7 +186,8 @@ async def get_async_core_db(request: Request = None) -> AsyncGenerator[AsyncSess
finally:
await session.close()
finally:
reset_rls_context_tokens(token_t, token_c)
rls_tenant_var.set(prev_tenant)
rls_company_var.set(prev_company)
@contextmanager

View File

@@ -178,12 +178,12 @@ class LicenseValidationMiddleware(BaseHTTPMiddleware):
}
)
except Exception as e:
logger.error(f"Hub verify-license request failed: {str(e)}")
logger.exception("Hub verify-license request failed: %s", e)
return JSONResponse(
status_code=500,
content={
"error": "VALIDATION_ERROR",
"message": "Error interno al validar licencia con el Hub.",
"message": "Error interno al contactar el servicio de licencias.",
"status_code": 500,
}
)