from fastapi import APIRouter, Depends from admin_app.api.dependencies import get_settings, require_admin_permission from admin_app.api.schemas import ( AdminToolContractsResponse, AdminToolDraftListResponse, AdminToolManagementActionResponse, AdminToolOverviewResponse, AdminToolPublicationListResponse, AdminToolReviewQueueResponse, ) from admin_app.core import AdminSettings, AuthenticatedStaffPrincipal from admin_app.services import ToolManagementService from shared.contracts import AdminPermission router = APIRouter(prefix="/tools", tags=["tools"]) def _build_service(settings: AdminSettings) -> ToolManagementService: return ToolManagementService(settings) @router.get( "/overview", response_model=AdminToolOverviewResponse, ) def tools_overview( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.MANAGE_TOOL_DRAFTS) ), ): service = _build_service(settings) payload = service.build_overview_payload() return AdminToolOverviewResponse( service="orquestrador-admin", mode=payload["mode"], metrics=payload["metrics"], workflow=payload["workflow"], actions=_build_actions(settings), next_steps=payload["next_steps"], ) @router.get( "/contracts", response_model=AdminToolContractsResponse, ) def tool_contracts( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.MANAGE_TOOL_DRAFTS) ), ): service = _build_service(settings) payload = service.build_contracts_payload() return AdminToolContractsResponse( service="orquestrador-admin", publication_source_service=payload["publication_source_service"], publication_target_service=payload["publication_target_service"], lifecycle_statuses=payload["lifecycle_statuses"], parameter_types=payload["parameter_types"], publication_fields=payload["publication_fields"], published_tool_fields=payload["published_tool_fields"], ) @router.get( "/drafts", response_model=AdminToolDraftListResponse, ) def tool_drafts( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.MANAGE_TOOL_DRAFTS) ), ): service = _build_service(settings) payload = service.build_drafts_payload() return AdminToolDraftListResponse( service="orquestrador-admin", storage_status=payload["storage_status"], message=payload["message"], drafts=payload["drafts"], supported_statuses=payload["supported_statuses"], ) @router.get( "/review-queue", response_model=AdminToolReviewQueueResponse, ) def tool_review_queue( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.REVIEW_TOOL_GENERATIONS) ), ): service = _build_service(settings) payload = service.build_review_queue_payload() return AdminToolReviewQueueResponse( service="orquestrador-admin", queue_mode=payload["queue_mode"], message=payload["message"], items=payload["items"], supported_statuses=payload["supported_statuses"], ) @router.get( "/publications", response_model=AdminToolPublicationListResponse, ) def tool_publications( settings: AdminSettings = Depends(get_settings), _: AuthenticatedStaffPrincipal = Depends( require_admin_permission(AdminPermission.PUBLISH_TOOLS) ), ): service = _build_service(settings) payload = service.build_publications_payload() return AdminToolPublicationListResponse( service="orquestrador-admin", source=payload["source"], target_service=payload["target_service"], publications=payload["publications"], ) def _build_actions(settings: AdminSettings) -> list[AdminToolManagementActionResponse]: return [ AdminToolManagementActionResponse( key="overview", label="Overview de tools", href=_build_prefixed_path(settings.admin_api_prefix, "/tools/overview"), required_permission=AdminPermission.MANAGE_TOOL_DRAFTS, description="Snapshot inicial da governanca de tools no admin.", ), AdminToolManagementActionResponse( key="contracts", label="Contratos compartilhados", href=_build_prefixed_path(settings.admin_api_prefix, "/tools/contracts"), required_permission=AdminPermission.MANAGE_TOOL_DRAFTS, description="Enumera lifecycle, tipos de parametro e campos de publicacao.", ), AdminToolManagementActionResponse( key="drafts", label="Fila de drafts", href=_build_prefixed_path(settings.admin_api_prefix, "/tools/drafts"), required_permission=AdminPermission.MANAGE_TOOL_DRAFTS, description="Base do cadastro de novas tools e estados vazios da fase atual.", ), AdminToolManagementActionResponse( key="review_queue", label="Fila de revisao", href=_build_prefixed_path(settings.admin_api_prefix, "/tools/review-queue"), required_permission=AdminPermission.REVIEW_TOOL_GENERATIONS, description="Superficie para validacao, revisao tecnica e aprovacao humana.", ), AdminToolManagementActionResponse( key="publications", label="Catalogo de publicacoes", href=_build_prefixed_path(settings.admin_api_prefix, "/tools/publications"), required_permission=AdminPermission.PUBLISH_TOOLS, description="Catalogo bootstrap de tools ativas voltadas ao runtime de produto.", ), ] def _build_prefixed_path(api_prefix: str, path: str) -> str: normalized_prefix = api_prefix.rstrip("/") normalized_path = path if path.startswith("/") else f"/{path}" if not normalized_prefix: return normalized_path if normalized_path == "/": return f"{normalized_prefix}/" return f"{normalized_prefix}{normalized_path}"