""" Tenants Controller The tenant registry's read API (core-api T-8 / workspace D-73): `GET /tenants/me` and `GET /tenants`. No write routes this round — provisioning is later (workspace T-195). """ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.ext.asyncio import AsyncSession from src.domains.auth.callers import Caller, require_caller from src.domains.tenants.schemas import TenantListResponse, TenantMeResponse, TenantSummary from src.domains.tenants.service import TenantError, get_tenants_service from src.shared.base import BaseController from src.shared.database import get_async_session from src.shared.logging import get_logger logger = get_logger(__name__) require_tenants_reader = require_caller("office", "user") require_tenants_lister = require_caller("office", "user", "tatlock", "scheduler") def _summary(tenant) -> TenantSummary: return TenantSummary( id=tenant.id, display_name=tenant.display_name, kind=tenant.kind, status=tenant.status ) class TenantsController(BaseController): """Controller for the tenant registry's read API.""" def __init__(self): super().__init__(prefix="/tenants", tags=["Tenants"]) def create_router(self) -> APIRouter: router = APIRouter(prefix=self.prefix, tags=self.tags) service = get_tenants_service() # ===================================================================== # me # ===================================================================== @router.get( "/me", response_model=TenantMeResponse, summary="The caller's own tenant and the consumers granted in it", ) async def get_me( caller: Caller = Depends(require_tenants_reader), session: AsyncSession = Depends(get_async_session), ): try: tenant, consumers, default_address = await service.get_me(session, caller) except TenantError as error: raise HTTPException( status_code=error.status_code, detail={"code": error.code} ) from error return TenantMeResponse( id=tenant.id, display_name=tenant.display_name, kind=tenant.kind, status=tenant.status, consumers=consumers, default_address=default_address, ) # ===================================================================== # list # ===================================================================== @router.get( "", response_model=TenantListResponse, summary="Every tenant (tatlock/scheduler) or the caller's own, as a list of one", ) async def list_tenants( caller: Caller = Depends(require_tenants_lister), session: AsyncSession = Depends(get_async_session), ): try: tenants = await service.list_tenants(session, caller) except TenantError as error: raise HTTPException( status_code=error.status_code, detail={"code": error.code} ) from error return TenantListResponse(tenants=[_summary(tenant) for tenant in tenants]) return router # Create controller instance tenants_controller = TenantsController()