"""能力查询路由(CAP-01~CAP-02)。 统一采用模板 A(控制面端口路由):鉴权依赖 get_admin_user, 调用 use_cases.capability_query.,raiseOnControlFailure 转译失败, serialize_control_data 序列化响应。 路径设计:静态跨渠道查询先于动态路径声明,避免静态路径被动态参数捕获。 """ from __future__ import annotations from typing import Any from fastapi import APIRouter, Depends, Request from yuxi.channels.contract.dtos.channel import ChannelType from yuxi.storage.postgres.models_business import User from server.routers.channels import ( build_operator, get_channel_use_cases, raiseOnControlFailure, serialize_control_data, ) from server.utils.auth_middleware import get_admin_user capability_router = APIRouter(tags=["channels-capability"]) @capability_router.get("/capabilities", response_model=dict) async def list_capabilities( request: Request, use_cases=Depends(get_channel_use_cases), current_user: User = Depends(get_admin_user), ) -> dict[str, Any]: """列出所有渠道能力声明(CAP-01)。对应控制面操作 capability/list。 聚合 PluginRegistry 中所有插件的 manifest.capabilities,返回 渠道类型 → 能力声明的映射。无插件的渠道不出现在结果中。 """ operator = build_operator(current_user, request) result = await use_cases.capability_query.listCapabilities( operator=operator, ) raiseOnControlFailure(result) return {"success": True, "data": serialize_control_data(result.data)} @capability_router.get("/capabilities/{channel_type}", response_model=dict) async def get_capability( channel_type: ChannelType, request: Request, use_cases=Depends(get_channel_use_cases), current_user: User = Depends(get_admin_user), ) -> dict[str, Any]: """查询单渠道能力详情(CAP-02)。对应控制面操作 capability/get。 返回指定渠道类型的完整 ChannelCapabilities 声明。 渠道未绑定插件抛 NotFoundError。 """ operator = build_operator(current_user, request) result = await use_cases.capability_query.getCapability( channel_type=channel_type, operator=operator, ) raiseOnControlFailure(result) return {"success": True, "data": serialize_control_data(result.data)}