""" Router tenant – gestione organizzazioni (solo super_admin). Protezione doppia: 1. require_super_admin – JWT con ruolo super_admin 2. verify_admin_key – Header X-Admin-Key (se configurata in produzione) Endpoint: GET /api/v1/tenants → lista tenant con statistiche POST /api/v1/tenants → crea tenant + admin GET /api/v1/tenants/{id} → dettaglio tenant con statistiche PATCH /api/v1/tenants/{id} → modifica tenant (incluso is_active per sospensione) """ import uuid from typing import Annotated from fastapi import APIRouter, Depends from app.dependencies import DB, SuperAdminUser, verify_admin_key from app.schemas.tenant import TenantCreateRequest, TenantResponse, TenantUpdateRequest from app.services.tenant_service import TenantService router = APIRouter( prefix="/tenants", tags=["Tenant (super-admin)"], dependencies=[Depends(verify_admin_key)], # X-Admin-Key su tutti gli endpoint ) @router.get( "", response_model=list[TenantResponse], summary="Lista tutti i tenant con statistiche", ) async def list_tenants( _: SuperAdminUser, db: DB, ) -> list[TenantResponse]: service = TenantService(db) return await service.list_tenants_with_stats() @router.post( "", response_model=TenantResponse, status_code=201, summary="Crea nuovo tenant con admin iniziale", ) async def create_tenant( body: TenantCreateRequest, _: SuperAdminUser, db: DB, ) -> TenantResponse: service = TenantService(db) tenant, _ = await service.create_tenant(body) return TenantResponse.model_validate(tenant) @router.get( "/{tenant_id}", response_model=TenantResponse, summary="Dettaglio tenant con statistiche", ) async def get_tenant( tenant_id: uuid.UUID, _: SuperAdminUser, db: DB, ) -> TenantResponse: service = TenantService(db) return await service.get_tenant_with_stats(tenant_id) @router.patch( "/{tenant_id}", response_model=TenantResponse, summary="Modifica tenant (nome, piano, limiti, sospensione)", ) async def update_tenant( tenant_id: uuid.UUID, body: TenantUpdateRequest, _: SuperAdminUser, db: DB, ) -> TenantResponse: service = TenantService(db) tenant = await service.update_tenant(tenant_id, body) return TenantResponse.model_validate(tenant)