Files
2026-03-19 18:06:44 +01:00

88 lines
2.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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)