48 lines
1.5 KiB
Python
48 lines
1.5 KiB
Python
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.database.session import sessionmanager
|
|
from app.rbac.auth import current_active_user
|
|
from fastapi_users import models
|
|
from fastapi import Depends, HTTPException, status
|
|
from typing import AsyncIterator
|
|
|
|
|
|
async def get_tenant_schema(
|
|
user: models.UP = Depends(current_active_user), # Valida o token e obtém o usuário
|
|
) -> models.UP:
|
|
"""
|
|
Configura o schema do tenant no banco de dados e retorna apenas o usuário autenticado.
|
|
"""
|
|
|
|
if not user:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="Usuário não autenticado.",
|
|
)
|
|
|
|
# Obtém o UUID do inquilino (assumindo que está no atributo fk_inquilino_uuid)
|
|
tenant_uuid = user.fk_inquilino_uuid
|
|
|
|
if not tenant_uuid:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Inquilino não associado ao usuário.",
|
|
)
|
|
|
|
# Configura o schema do tenant usando `session_with_tenant`
|
|
async with sessionmanager.session_with_tenant(tenant_uuid) as session:
|
|
yield session
|
|
|
|
# Retorna o usuário autenticado para o verify_permissions
|
|
# return user
|
|
|
|
|
|
async def get_tenant_session(
|
|
tenant_schema: str = Depends(get_tenant_schema)
|
|
) -> AsyncIterator[AsyncSession]:
|
|
"""
|
|
Obtém uma sessão configurada para o schema do tenant.
|
|
"""
|
|
async with sessionmanager.session_with_tenant(tenant_schema) as session:
|
|
yield session
|