api-admim/app/multi_tenant/tenant_utils.py

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