"""能力查询路由(CAP-01~CAP-03)。 统一采用模板 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/matrix", response_model=dict) async def list_capability_matrix( request: Request, use_cases=Depends(get_channel_use_cases), current_user: User = Depends(get_admin_user), ) -> dict[str, Any]: """列出所有渠道能力画像矩阵(CAP-03)。对应控制面操作 capability/matrix。 返回每个插件的完整 ``ChannelCapabilityProfile``,包含静态能力声明、 运行时可用性、插件元数据与配置 schema,供能力查询页渲染高密度矩阵。 """ operator = build_operator(current_user, request) result = await use_cases.capability_query.listCapabilityMatrix( 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)}