""" Tenant API - ATOMIC operations Handles basic CRUD operations for tenants """ import structlog from fastapi import APIRouter, Depends, HTTPException, status, Path from typing import Dict, Any from uuid import UUID from app.schemas.tenants import TenantResponse, TenantUpdate from app.services.tenant_service import EnhancedTenantService from shared.auth.decorators import get_current_user_dep from shared.routing.route_builder import RouteBuilder from shared.database.base import create_database_manager from shared.monitoring.metrics import track_endpoint_metrics logger = structlog.get_logger() router = APIRouter() route_builder = RouteBuilder("tenants") # Dependency injection for enhanced tenant service def get_enhanced_tenant_service(): try: from app.core.config import settings database_manager = create_database_manager(settings.DATABASE_URL, "tenant-service") return EnhancedTenantService(database_manager) except Exception as e: logger.error("Failed to create enhanced tenant service", error=str(e)) raise HTTPException(status_code=500, detail="Service initialization failed") @router.get(route_builder.build_base_route("{tenant_id}", include_tenant_prefix=False), response_model=TenantResponse) @track_endpoint_metrics("tenant_get") async def get_tenant( tenant_id: UUID = Path(..., description="Tenant ID"), current_user: Dict[str, Any] = Depends(get_current_user_dep), tenant_service: EnhancedTenantService = Depends(get_enhanced_tenant_service) ): """Get tenant by ID - ATOMIC operation""" tenant = await tenant_service.get_tenant_by_id(str(tenant_id)) if not tenant: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Tenant not found" ) return tenant @router.put(route_builder.build_base_route("{tenant_id}", include_tenant_prefix=False), response_model=TenantResponse) async def update_tenant( update_data: TenantUpdate, tenant_id: UUID = Path(..., description="Tenant ID"), current_user: Dict[str, Any] = Depends(get_current_user_dep), tenant_service: EnhancedTenantService = Depends(get_enhanced_tenant_service) ): """Update tenant information - ATOMIC operation""" try: result = await tenant_service.update_tenant( str(tenant_id), update_data, current_user["user_id"] ) return result except HTTPException: raise except Exception as e: logger.error("Tenant update failed", tenant_id=str(tenant_id), user_id=current_user["user_id"], error=str(e)) raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail="Tenant update failed" )