2026-07-06 20:50:03 +08:00
|
|
|
|
"""能力查询路由(CAP-01~CAP-03)。
|
2026-07-02 03:29:06 +08:00
|
|
|
|
|
|
|
|
|
|
统一采用模板 A(控制面端口路由):鉴权依赖 get_admin_user,
|
|
|
|
|
|
调用 use_cases.capability_query.<method>,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)}
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-07-06 20:50:03 +08:00
|
|
|
|
@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)}
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-07-02 03:29:06 +08:00
|
|
|
|
@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)}
|