From 4206c3a60fb1f9d8b88ddda52c6404298724b448 Mon Sep 17 00:00:00 2001 From: Kris <2893855659@qq.com> Date: Sat, 11 Jul 2026 21:43:50 +0800 Subject: [PATCH] =?UTF-8?q?refactor(api):=20=E7=BB=9F=E4=B8=80API=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=A0=BC=E5=BC=8F=E5=B9=B6=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本次提交对多个API文件进行了多项优化: 1. 合并单行多行的API函数调用,统一代码格式 2. 更新API端点计数注释,修正部分模块的端点数量 3. 补充函数参数注释与请求选项支持,新增部分API接口 4. 调整模块路径命名,移除废弃的API封装 5. 优化文档注释,补充参数说明与使用场景 --- web/src/apis/channels/account_api.js | 7 ++-- web/src/apis/channels/audit_api.js | 6 ++-- web/src/apis/channels/base.js | 2 +- web/src/apis/channels/capability_api.js | 13 ++++--- web/src/apis/channels/config_api.js | 5 ++- web/src/apis/channels/dashboard_api.js | 14 +++----- web/src/apis/channels/directory_api.js | 2 +- web/src/apis/channels/doctor_api.js | 8 ++--- web/src/apis/channels/outbox_api.js | 3 +- web/src/apis/channels/pairing_api.js | 2 +- web/src/apis/channels/plugin_api.js | 15 ++++---- web/src/apis/channels/route_binding_api.js | 3 +- web/src/apis/channels/webhook_api.js | 2 +- .../apis/external-systems/access_rule_api.js | 3 +- .../external-systems/adapter_asset_api.js | 3 +- .../external-systems/adapter_metadata_api.js | 2 +- web/src/apis/external-systems/alert_api.js | 3 +- .../apis/external-systems/audit_log_api.js | 36 +++++++++++++------ .../apis/external-systems/auth_plugin_api.js | 16 ++++----- .../apis/external-systems/dashboard_api.js | 6 +++- .../apis/external-systems/environment_api.js | 21 +++++++---- .../apis/external-systems/execution_api.js | 6 ++-- .../apis/external-systems/health_check_api.js | 8 +++-- .../external-systems/import_export_api.js | 3 +- .../integration_generator_api.js | 2 +- .../apis/external-systems/key_rotation_api.js | 9 ++--- web/src/apis/external-systems/metrics_api.js | 31 ++++++++-------- .../notification_channel_api.js | 5 ++- web/src/apis/external-systems/quota_api.js | 7 ++-- .../apis/external-systems/recycle_bin_api.js | 30 ++++++++++++---- web/src/apis/external-systems/system_api.js | 12 +++---- .../apis/external-systems/test_case_api.js | 3 +- web/src/apis/external-systems/token_api.js | 27 ++++++++------ web/src/apis/external-systems/tool_api.js | 22 ++++-------- .../vendor_integration_api.js | 6 ++-- web/src/apis/external-systems/webhook_api.js | 15 +++----- 36 files changed, 199 insertions(+), 159 deletions(-) diff --git a/web/src/apis/channels/account_api.js b/web/src/apis/channels/account_api.js index c081c670..91068249 100644 --- a/web/src/apis/channels/account_api.js +++ b/web/src/apis/channels/account_api.js @@ -46,9 +46,10 @@ export const disableAccountApi = (channelType, accountId) => /** 恢复降级账户(幂等:已 active 直接返回成功;DEGRADED → ACTIVE) */ export const recoverAccountApi = (channelType, accountId) => apiAdminPost(buildUrl(`/${channelType}/accounts/${accountId}/recover`)) -/** 查询账户运行时状态(状态机/熔断器/登录态/降级标记) */ -export const getAccountRuntimeStatusApi = (channelType, accountId) => - apiAdminGet(buildUrl(`/${channelType}/accounts/${accountId}/runtime-status`)) +/** 查询账户运行时状态(状态机/熔断器/登录态/降级标记) + * @param {Object} [options] - 请求选项(如 { signal } 用于取消请求) */ +export const getAccountRuntimeStatusApi = (channelType, accountId, options = {}) => + apiAdminGet(buildUrl(`/${channelType}/accounts/${accountId}/runtime-status`), options) // ===== 凭据与连通性 ===== /** 轮换渠道账户凭据 */ diff --git a/web/src/apis/channels/audit_api.js b/web/src/apis/channels/audit_api.js index e83bfdc5..be21da8b 100644 --- a/web/src/apis/channels/audit_api.js +++ b/web/src/apis/channels/audit_api.js @@ -6,8 +6,6 @@ * 关键对齐点: * - 普通端点后端用 get_admin_user,前端用 apiAdmin* 系列 * - 保留策略更新需超级管理员权限,前端用 apiSuperAdminPut - * - 静态路径(/audit/logs /audit/logs/stats /audit/operations /audit/export /audit/retention-policy) - * 先于动态路径(/audit/logs/{log_id})声明 * - GET /audit/export 返回 StreamingResponse 二进制文件流,admin 权限,responseType='blob',同步下载 * - GET 查询类端点含 query 参数(operation_type / operator / target_* / start_time / end_time / limit / offset) * 用 buildQueryString 拼接 @@ -22,11 +20,11 @@ const URL = buildUrl('/audit') /** 查询审计日志列表(支持操作类型/操作人/目标/时间范围过滤与分页) */ export const getAuditLogListApi = (params = {}) => apiAdminGet(`${URL}/logs${buildQueryString(params)}`) +/** 查询单条审计日志详情(AUD-07) */ +export const getAuditLogApi = (logId) => apiAdminGet(`${URL}/logs/${logId}`) /** 查询审计日志统计聚合(不含分页参数,对全量匹配数据聚合) */ export const getAuditLogStatsApi = (params = {}) => apiAdminGet(`${URL}/logs/stats${buildQueryString(params)}`) -/** 查询单条审计日志详情 */ -export const getAuditLogApi = (logId) => apiAdminGet(`${URL}/logs/${logId}`) /** 查询审计操作类型枚举 */ export const listAuditOperationsApi = () => apiAdminGet(`${URL}/operations`) diff --git a/web/src/apis/channels/base.js b/web/src/apis/channels/base.js index e453f19d..c4b99e16 100644 --- a/web/src/apis/channels/base.js +++ b/web/src/apis/channels/base.js @@ -40,7 +40,7 @@ export const MODULE_PATHS = { OUTBOX: '/outbox', PAIRING: '/pairings', PLUGIN: '/plugins', - REPORTS: '/reports', + ROUTE_BINDING: '/route-bindings', SESSION: '/sessions' } diff --git a/web/src/apis/channels/capability_api.js b/web/src/apis/channels/capability_api.js index 236cac71..a6ab835a 100644 --- a/web/src/apis/channels/capability_api.js +++ b/web/src/apis/channels/capability_api.js @@ -8,7 +8,7 @@ * - 静态路径 /capabilities 与 /capabilities/matrix 先于动态 /capabilities/{channel_type} 声明 */ import { apiAdminGet } from '../base' -import { buildUrl } from './base' +import { buildUrl, buildQueryString } from './base' const URL = buildUrl('/capabilities') @@ -16,8 +16,9 @@ const URL = buildUrl('/capabilities') /** * 列出所有渠道能力声明。 * - * 响应结构(对齐 CAP-01):{ capabilities: [{ channel_type, capabilities }, ...] } - * 前端需自行转换为 channel_type → capabilities 映射。 + * 响应结构(对齐 CAP-01):{ capabilities: [ChannelCapabilityProfile, ...] } + * 每个 ChannelCapabilityProfile 包含 channel_type、display_name、capabilities + * (ChannelCapabilities 布尔字段集)、runtime_availability、config_schema 等字段。 */ export const listCapabilitiesApi = () => apiAdminGet(URL) /** @@ -25,8 +26,12 @@ export const listCapabilitiesApi = () => apiAdminGet(URL) * * 响应结构:{ capabilities: [ChannelCapabilityProfile, ...] } * 包含静态能力声明、运行时可用性、插件元数据与配置 schema。 + * + * @param {Object} [params] - query 参数:status(available/unavailable)、capability(能力名) + * @param {Object} [options] - fetch 请求选项(如 signal 用于请求取消) */ -export const listCapabilityMatrixApi = () => apiAdminGet(`${URL}/matrix`) +export const listCapabilityMatrixApi = (params = {}, options = {}) => + apiAdminGet(`${URL}/matrix${buildQueryString(params)}`, options) /** 查询单渠道能力详情(渠道未绑定插件抛 NotFoundError) */ export const getCapabilityApi = (channelType) => apiAdminGet(`${URL}/${channelType}`) diff --git a/web/src/apis/channels/config_api.js b/web/src/apis/channels/config_api.js index e0bee1bc..3ab7c3ea 100644 --- a/web/src/apis/channels/config_api.js +++ b/web/src/apis/channels/config_api.js @@ -1,5 +1,5 @@ /** - * 配置管理域 API(8 端点) + * 配置管理域 API(9 端点) * 路径前缀:/config * * 对齐后端 Router:backend/server/routers/channels/config_router.py @@ -29,6 +29,9 @@ export const importConfigApi = (data) => apiSuperAdminPost(`${URL}/import`, data // ===== 批量更新 ===== /** 批量更新配置(CFG-BATCH-UPDATE) */ export const batchUpdateConfigApi = (data) => apiAdminPut(`${URL}/batch`, data) +/** 批量查询配置值(CFG-READ-MANY,keys 为 list[str],buildQueryString 以 repeated keys 拼接) */ +export const getConfigValuesApi = (params = {}) => + apiAdminGet(`${URL}/values${buildQueryString(params)}`) // ===== 单 key 读写、回滚与历史 ===== /** 查询配置值(CFG-READ-01) */ diff --git a/web/src/apis/channels/dashboard_api.js b/web/src/apis/channels/dashboard_api.js index e302a476..bea28542 100644 --- a/web/src/apis/channels/dashboard_api.js +++ b/web/src/apis/channels/dashboard_api.js @@ -1,5 +1,5 @@ /** - * Dashboard 聚合视图域 API(6 端点) + * Dashboard 聚合视图域 API * 路径前缀:/dashboard * * 对齐后端 Router:backend/server/routers/channels/dashboard_router.py @@ -7,6 +7,9 @@ * - 全部端点后端用 get_admin_user,前端用 apiAdminGet * - 路径不含 {channel_type} 段(聚合视图为跨渠道全局能力) * - GET 端点的 channel_type/start_time/end_time/window_seconds 为 query 参数,用 buildQueryString 拼接 + * + * 说明:DSB-01 overview 已聚合返回 accounts/messages/sessions/outbox 四类子域计数, + * 前端全部从 overview 派生,故不单独封装 DSB-02~04 子域端点。 */ import { apiAdminGet } from '../base' import { buildUrl, buildQueryString } from './base' @@ -17,15 +20,6 @@ const URL = buildUrl('/dashboard') /** 查询全局总览(DSB-01) */ export const getDashboardOverviewApi = (params = {}) => apiAdminGet(`${URL}/overview${buildQueryString(params)}`) -/** 查询账户总览(DSB-02) */ -export const getDashboardAccountsApi = (params = {}) => - apiAdminGet(`${URL}/accounts${buildQueryString(params)}`) -/** 查询消息总览(DSB-03) */ -export const getDashboardMessagesApi = (params = {}) => - apiAdminGet(`${URL}/messages${buildQueryString(params)}`) -/** 查询会话总览(DSB-04) */ -export const getDashboardSessionsApi = (params = {}) => - apiAdminGet(`${URL}/sessions${buildQueryString(params)}`) // ===== 投递、待办与实时 ===== /** 查询投递总览(DSB-DELIVERY) */ diff --git a/web/src/apis/channels/directory_api.js b/web/src/apis/channels/directory_api.js index d9a79868..fdb41ac3 100644 --- a/web/src/apis/channels/directory_api.js +++ b/web/src/apis/channels/directory_api.js @@ -1,5 +1,5 @@ /** - * 目录查询域 API(6 端点) + * 目录查询域 API(9 端点) * 路径前缀:/{channel_type}/{account_id}/directory * * 对齐后端 Router:backend/server/routers/channels/directory_router.py diff --git a/web/src/apis/channels/doctor_api.js b/web/src/apis/channels/doctor_api.js index 60537c97..52bc8326 100644 --- a/web/src/apis/channels/doctor_api.js +++ b/web/src/apis/channels/doctor_api.js @@ -1,5 +1,5 @@ /** - * 渠道诊断域 API(6 端点) + * 渠道诊断域 API(5 端点) * 路径前缀:/{channel_type}/{account_id}/doctor * * 对齐后端 Router:backend/server/routers/channels/doctor_router.py @@ -7,6 +7,9 @@ * - 全部端点后端用 get_admin_user,前端用 apiAdmin* 系列 * - 路径含 {channel_type} 与 {account_id} 两段 path 参数 * - 静态后缀(run-all)先于动态单段({check_id})声明,多段子资源({check_id}/run、{check_id}/repair、{check_id}/repair/preview)在后 + * + * 注:后端 GET /checks/{check_id}(单项元信息查询)存在,但前端检查项列表 + * 接口已返回完整元信息,无需单独拉取单项,故未封装。 */ import { apiAdminGet, apiAdminPost } from '../base' import { buildUrl } from './base' @@ -23,9 +26,6 @@ export const runAllDoctorChecksApi = (channelType, accountId) => apiAdminPost(doctorUrl(channelType, accountId, '/checks/run-all')) // ===== 单项检查 ===== -/** 查询单项检查项元信息(DOC-CHECK-02) */ -export const getDoctorCheckApi = (channelType, accountId, checkId) => - apiAdminGet(doctorUrl(channelType, accountId, `/checks/${checkId}`)) /** 运行单项诊断检查(DOC-CHECK-04) */ export const runDoctorCheckApi = (channelType, accountId, checkId) => apiAdminPost(doctorUrl(channelType, accountId, `/checks/${checkId}/run`)) diff --git a/web/src/apis/channels/outbox_api.js b/web/src/apis/channels/outbox_api.js index d6dde536..232fd834 100644 --- a/web/src/apis/channels/outbox_api.js +++ b/web/src/apis/channels/outbox_api.js @@ -33,7 +33,8 @@ export const getOutboxMessageApi = (outboxId) => apiAdminGet(`${URL}/messages/${ /** 查询死信队列(分页) */ export const listDeadLetterOutboxApi = (params = {}) => apiAdminGet(`${URL}/dead-letter${buildQueryString(params)}`) -/** 导出死信条目(json 记录数组 / csv 字符串,含 CSV injection 防护) */ +/** 导出死信条目(json 记录数组 / csv 字符串,含 CSV injection 防护) + * query 参数:format(json/csv,对应后端 export_format 的 alias)、export_limit(导出条目上限) */ export const exportDeadLetterApi = (params = {}) => apiAdminGet(`${URL}/dead-letter/export${buildQueryString(params)}`) /** 清除单条死信条目(逻辑删除,仅允许 dead 状态) */ diff --git a/web/src/apis/channels/pairing_api.js b/web/src/apis/channels/pairing_api.js index 4ea7f7fe..408b1c7e 100644 --- a/web/src/apis/channels/pairing_api.js +++ b/web/src/apis/channels/pairing_api.js @@ -1,5 +1,5 @@ /** - * 配对审批域 API(10 端点) + * 配对审批域 API(11 端点) * 路径前缀:/channels/pairings * * 对齐后端 Router:backend/server/routers/channels/pairing_router.py diff --git a/web/src/apis/channels/plugin_api.js b/web/src/apis/channels/plugin_api.js index ba6d0cf5..58595190 100644 --- a/web/src/apis/channels/plugin_api.js +++ b/web/src/apis/channels/plugin_api.js @@ -1,5 +1,5 @@ /** - * 插件管理 API(16 端点) + * 插件管理 API(15 端点) * 路径前缀:/plugins * * 对齐后端 Router:backend/server/routers/channels/plugin_router.py @@ -7,7 +7,6 @@ * - install / 文件级卸载需 superadmin,前端用 apiSuperAdmin* 系列 * - 其余端点(查询 / 生命周期 / 批量 / 配置)管理员鉴权,用 apiAdmin* 系列 * - 静态路径(/install /batch/start /batch/stop)先于动态路径 /{plugin_id} 声明,前端按功能分组 - * - list 端点支持 state 查询参数过滤生命周期状态 */ import { apiAdminGet, apiAdminPost, apiAdminPut } from '../base' import { apiSuperAdminPost, apiSuperAdminDelete } from '../base' @@ -16,14 +15,14 @@ import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.PLUGIN) // ===== 查询 ===== -/** 列出全部插件(支持按生命周期状态过滤) */ -export const getPluginListApi = (params = {}) => apiAdminGet(`${URL}${buildQueryString(params)}`) -/** 列出插件目录(含 capabilities,供卡片视图展示) */ -export const getPluginCatalogApi = () => apiAdminGet(`${URL}/catalog`) +/** 列出插件目录(含 capabilities,供卡片视图展示,支持按生命周期状态过滤) */ +export const getPluginCatalogApi = (params = {}) => + apiAdminGet(`${URL}/catalog${buildQueryString(params)}`) /** 查询插件详情(manifest / 生命周期状态 / 绑定渠道类型) */ export const getPluginDetailApi = (pluginId) => apiAdminGet(`${URL}/${pluginId}`) -/** 查询插件配置(config / schema / requires_restart / updated_at) */ -export const getPluginConfigApi = (pluginId) => apiAdminGet(`${URL}/${pluginId}/config`) +/** 查询插件配置(config / schema / requires_restart / updated_at,account_id 用于读取 ACCOUNT 作用域配置值) */ +export const getPluginConfigApi = (pluginId, params = {}) => + apiAdminGet(`${URL}/${pluginId}/config${buildQueryString(params)}`) // ===== 安装与卸载(需超级管理员,对齐 API 文档 §2.4)===== /** 安装插件(source_type: path / url / registry;url / registry 后端返回 501) */ diff --git a/web/src/apis/channels/route_binding_api.js b/web/src/apis/channels/route_binding_api.js index 739f1c97..d2731685 100644 --- a/web/src/apis/channels/route_binding_api.js +++ b/web/src/apis/channels/route_binding_api.js @@ -28,7 +28,6 @@ export const resolveRouteBindingApi = (data) => apiAdminPost(`${URL}/resolve`, d /** 创建路由绑定规则(match_value 与 match_source 的组合约束由后端校验) */ export const createRouteBindingApi = (data) => apiAdminPost(URL, data) /** 更新路由绑定规则(binding_id 由路径提供,body 字段全部可选,仅传入字段被更新) */ -export const updateRouteBindingApi = (bindingId, data) => - apiAdminPut(`${URL}/${bindingId}`, data) +export const updateRouteBindingApi = (bindingId, data) => apiAdminPut(`${URL}/${bindingId}`, data) /** 删除路由绑定规则 */ export const deleteRouteBindingApi = (bindingId) => apiAdminDelete(`${URL}/${bindingId}`) diff --git a/web/src/apis/channels/webhook_api.js b/web/src/apis/channels/webhook_api.js index 64a19db9..8c8615e9 100644 --- a/web/src/apis/channels/webhook_api.js +++ b/web/src/apis/channels/webhook_api.js @@ -20,6 +20,6 @@ export const verifyWebhookSignatureApi = (channelType, data, options = {}) => apiPost(buildUrl(`/${channelType}/webhook/signature/verify`), data, options, false) // ===== Webhook 测试(控制面,需管理员) ===== -/** 测试 Webhook 投递(经控制面管道,isinstance 检查 WebhookTestable 能力) */ +/** 测试 Webhook 投递(经控制面管道,isinstance 检查 WebhookTestAdapter 能力) */ export const testWebhookApi = (channelType, data) => apiAdminPost(buildUrl(`/${channelType}/webhook/test`), data) diff --git a/web/src/apis/external-systems/access_rule_api.js b/web/src/apis/external-systems/access_rule_api.js index 1ff8d12f..539c1e3b 100644 --- a/web/src/apis/external-systems/access_rule_api.js +++ b/web/src/apis/external-systems/access_rule_api.js @@ -16,8 +16,7 @@ const URL = buildUrl(MODULE_PATHS.ACCESS_RULE) // ===== 列表与详情 ===== /** 分页列出工具访问控制规则 */ -export const getAccessRuleListApi = (params = {}) => - apiGet(`${URL}${buildQueryString(params)}`) +export const getAccessRuleListApi = (params = {}) => apiGet(`${URL}${buildQueryString(params)}`) /** 获取访问规则详情 */ export const getAccessRuleDetailApi = (id) => apiGet(`${URL}/${id}`) /** 查询访问规则的附加条件 */ diff --git a/web/src/apis/external-systems/adapter_asset_api.js b/web/src/apis/external-systems/adapter_asset_api.js index c046c31c..8bbe87ba 100644 --- a/web/src/apis/external-systems/adapter_asset_api.js +++ b/web/src/apis/external-systems/adapter_asset_api.js @@ -25,8 +25,7 @@ export const deleteAssetApi = (id) => apiAdminDelete(`${URL}/${id}`) // ===== 统计与查询 ===== export const getAssetStatsApi = () => apiGet(`${URL}/stats`) -export const getAssetByChecksumApi = (checksum) => - apiGet(`${URL}/by-checksum/${checksum}`) +export const getAssetByChecksumApi = (checksum) => apiGet(`${URL}/by-checksum/${checksum}`) // ===== 批量操作 ===== export const batchUploadAssetsApi = (data) => apiAdminPost(`${URL}/batch-upload`, data) diff --git a/web/src/apis/external-systems/adapter_metadata_api.js b/web/src/apis/external-systems/adapter_metadata_api.js index 24c36e81..b0b250f2 100644 --- a/web/src/apis/external-systems/adapter_metadata_api.js +++ b/web/src/apis/external-systems/adapter_metadata_api.js @@ -13,7 +13,6 @@ export const getAdapterOverviewApi = () => apiGet(`${URL}/overview`) // ===== 详情与子接口 ===== export const getAdapterDetailApi = (type) => apiGet(`${URL}/${type}`) -export const getAdapterCapabilitiesApi = (type) => apiGet(`${URL}/${type}/capabilities`) export const getAdapterConfigSchemaApi = (type) => apiGet(`${URL}/${type}/config-schema`) export const getAdapterAuthPluginsApi = (type) => apiGet(`${URL}/${type}/auth-plugins`) export const getAdapterSourceTypesApi = (type) => apiGet(`${URL}/${type}/source-types`) @@ -27,3 +26,4 @@ export const validateAdapterConfigApi = (type, config) => export const getAdapterStatsApi = (type, params = {}) => apiGet(`${URL}/${type}/stats${buildQueryString(params)}`) export const getAdapterHealthApi = (type) => apiGet(`${URL}/${type}/health`) +export const getAdapterHealthBatchApi = () => apiGet(`${URL}/health-batch`) diff --git a/web/src/apis/external-systems/alert_api.js b/web/src/apis/external-systems/alert_api.js index ba198113..234d0939 100644 --- a/web/src/apis/external-systems/alert_api.js +++ b/web/src/apis/external-systems/alert_api.js @@ -39,7 +39,6 @@ export const resolveAlertApi = (id, data) => apiAdminPost(`${URL}/${id}/resolve` // ===== 批量操作 ===== /** 批量确认告警(acknowledged_by 由后端从当前管理员填充) */ -export const batchAcknowledgeAlertsApi = (data) => - apiAdminPost(`${URL}/batch-acknowledge`, data) +export const batchAcknowledgeAlertsApi = (data) => apiAdminPost(`${URL}/batch-acknowledge`, data) /** 批量恢复告警(user 由后端从当前管理员填充) */ export const batchResolveAlertsApi = (data) => apiAdminPost(`${URL}/batch-resolve`, data) diff --git a/web/src/apis/external-systems/audit_log_api.js b/web/src/apis/external-systems/audit_log_api.js index 3cd3e2ee..6108aeba 100644 --- a/web/src/apis/external-systems/audit_log_api.js +++ b/web/src/apis/external-systems/audit_log_api.js @@ -1,6 +1,10 @@ /** * 06-审计日志 API(8 端点) * 路径前缀:/audit-logs + * + * 所有函数支持 opts 转发(signal/silent),与 system_api/environment_api 对齐: + * - signal:联动 AbortController,供 composable 在组件卸载或竞态切换时取消请求 + * - silent:调用方自管理错误提示时设 true,抑制 apiRequest 内的全局 message.error toast */ import { apiGet, apiAdminGet } from '../base' import { buildUrl, buildQueryString, MODULE_PATHS } from './base' @@ -8,21 +12,33 @@ import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.AUDIT_LOG) // ===== 列表与详情 ===== -export const getAuditLogListApi = (params = {}) => apiGet(`${URL}${buildQueryString(params)}`) -export const getAuditLogDetailApi = (id) => apiGet(`${URL}/${id}`) +export const getAuditLogListApi = (params = {}, opts = {}) => + apiGet(`${URL}${buildQueryString(params)}`, { signal: opts.signal, silent: opts.silent }) +export const getAuditLogDetailApi = (id, opts = {}) => + apiGet(`${URL}/${id}`, { signal: opts.signal, silent: opts.silent }) // ===== 统计 ===== -export const getAuditLogStatsApi = (params = {}) => apiGet(`${URL}/stats${buildQueryString(params)}`) +export const getAuditLogStatsApi = (params = {}, opts = {}) => + apiGet(`${URL}/stats${buildQueryString(params)}`, { signal: opts.signal, silent: opts.silent }) // ===== 配置变更 ===== -export const getConfigChangesApi = (params = {}) => - apiGet(`${URL}/config-changes${buildQueryString(params)}`) +export const getConfigChangesApi = (params = {}, opts = {}) => + apiGet(`${URL}/config-changes${buildQueryString(params)}`, { + signal: opts.signal, + silent: opts.silent + }) // ===== 元数据查询 ===== -export const getAuditLogActionTypesApi = () => apiGet(`${URL}/action-types`) -export const getAuditLogEventTypesApi = () => apiGet(`${URL}/event-types`) -export const getAuditLogOperatorsApi = () => apiGet(`${URL}/operators`) +export const getAuditLogActionTypesApi = (opts = {}) => + apiGet(`${URL}/action-types`, { signal: opts.signal, silent: opts.silent }) +export const getAuditLogEventTypesApi = (opts = {}) => + apiGet(`${URL}/event-types`, { signal: opts.signal, silent: opts.silent }) +export const getAuditLogOperatorsApi = (opts = {}) => + apiGet(`${URL}/operators`, { signal: opts.signal, silent: opts.silent }) // ===== 导出(StreamingResponse,admin 权限,blob 下载) ===== -export const exportAuditLogsApi = (params = {}) => - apiAdminGet(`${URL}/export${buildQueryString(params)}`, {}, 'blob') +export const exportAuditLogsApi = (params = {}, opts = {}) => + apiAdminGet(`${URL}/export${buildQueryString(params)}`, { + signal: opts.signal, + silent: opts.silent + }, 'blob') diff --git a/web/src/apis/external-systems/auth_plugin_api.js b/web/src/apis/external-systems/auth_plugin_api.js index 7e046fac..6a036dea 100644 --- a/web/src/apis/external-systems/auth_plugin_api.js +++ b/web/src/apis/external-systems/auth_plugin_api.js @@ -1,22 +1,20 @@ /** - * 21-认证插件 API(6 端点) + * 21-认证插件 API(5 端点) * 路径前缀:/auth-plugins * * 端点清单: - * 1. GET /auth-plugins 查询所有认证插件(扁平列表) - * 2. GET /auth-plugins/overview 查询认证插件分组总览(框架级 + 按适配器分组) - * 3. GET /auth-plugins/token-strategies 查询已注册的 Token 刷新策略清单 - * 4. GET /auth-plugins/{auth_type} 查询指定认证插件详情(Query: adapter_type?) - * 5. GET /auth-plugins/{auth_type}/config-schema 获取认证配置的 JSON Schema(Query: adapter_type?) - * 6. POST /auth-plugins/{auth_type}/validate 校验认证配置是否有效(Query: adapter_type?,Body: {auth_config}) + * 1. GET /auth-plugins/overview 查询认证插件分组总览(框架级 + 按适配器分组) + * 2. GET /auth-plugins/token-strategies 查询已注册的 Token 刷新策略清单 + * 3. GET /auth-plugins/{auth_type} 查询指定认证插件详情(Query: adapter_type?) + * 4. GET /auth-plugins/{auth_type}/config-schema 获取认证配置的 JSON Schema(Query: adapter_type?) + * 5. POST /auth-plugins/{auth_type}/validate 校验认证配置是否有效(Query: adapter_type?,Body: {auth_config}) */ import { apiGet, apiAdminPost } from '../base' import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.AUTH_PLUGIN) -// ===== 列表与总览 ===== -export const getAuthPluginListApi = () => apiGet(URL) +// ===== 总览 ===== export const getAuthPluginOverviewApi = () => apiGet(`${URL}/overview`) // ===== Token 刷新策略 ===== diff --git a/web/src/apis/external-systems/dashboard_api.js b/web/src/apis/external-systems/dashboard_api.js index 596ecac8..da0fe2a9 100644 --- a/web/src/apis/external-systems/dashboard_api.js +++ b/web/src/apis/external-systems/dashboard_api.js @@ -1,5 +1,5 @@ /** - * 20-监控仪表板 API(7 端点) + * 20-监控仪表板 API(8 端点) * 路径前缀:/dashboard * * 对齐后端 Router:backend/server/routers/external_systems/dashboard_router.py @@ -38,3 +38,7 @@ export const getDashboardHealthApi = (options = {}) => apiGet(`${URL}/health`, o // ===== 最近活动 ===== export const getDashboardActivitiesApi = (params = {}, options = {}) => apiGet(`${URL}/activities${buildQueryString(params)}`, options) + +// ===== 待办统计 ===== +export const getDashboardTodosApi = (params = {}, options = {}) => + apiGet(`${URL}/todos${buildQueryString(params)}`, options) diff --git a/web/src/apis/external-systems/environment_api.js b/web/src/apis/external-systems/environment_api.js index f1ece8d1..83893cd3 100644 --- a/web/src/apis/external-systems/environment_api.js +++ b/web/src/apis/external-systems/environment_api.js @@ -1,5 +1,5 @@ /** - * 03-环境管理 API(19 端点) + * 03-环境管理 API(20 端点) * 路径前缀:/environments * * 对齐 backend/server/routers/external_systems/environment_router.py: @@ -9,14 +9,22 @@ * - export 返回 StreamingResponse,需用 blob 接收;后端统一要求管理员权限(include_secrets 会泄露明文密钥) * - 查询类端点后端用 get_required_user(普通用户可访问),写操作及 export 用 get_admin_user */ -import { apiGet, apiAdminGet, apiAdminPost, apiAdminPut, apiAdminDelete, apiAdminPatch } from '../base' +import { + apiGet, + apiPost, + apiAdminGet, + apiAdminPost, + apiAdminPut, + apiAdminDelete, + apiAdminPatch +} from '../base' import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.ENVIRONMENT) // ===== 列表与详情 ===== -export const getEnvironmentListApi = (params = {}) => - apiGet(`${URL}${buildQueryString(params)}`) +export const getEnvironmentListApi = (params = {}, opts = {}) => + apiGet(`${URL}${buildQueryString(params)}`, { signal: opts.signal, silent: opts.silent }) export const createEnvironmentApi = (data) => apiAdminPost(URL, data) export const getEnvironmentDetailApi = (id, systemId) => apiGet(`${URL}/${id}${buildQueryString({ system_id: systemId })}`) @@ -26,8 +34,7 @@ export const deleteEnvironmentApi = (id, systemId) => apiAdminDelete(`${URL}/${id}${buildQueryString({ system_id: systemId })}`) // ===== 查询与统计 ===== -export const diffEnvironmentsApi = (params = {}) => - apiGet(`${URL}/diff${buildQueryString(params)}`) +export const diffEnvironmentsApi = (params = {}) => apiGet(`${URL}/diff${buildQueryString(params)}`) export const getActiveEnvironmentsApi = (params = {}) => apiGet(`${URL}/active${buildQueryString(params)}`) export const getEnvironmentByKeyApi = (params = {}) => @@ -42,6 +49,8 @@ export const batchTestConnectivityApi = (data) => apiAdminPost(`${URL}/batch-test-connectivity`, data) export const batchCloneEnvironmentsApi = (data) => apiAdminPost(`${URL}/batch-clone`, data) export const batchEnabledEnvironmentsApi = (data) => apiAdminPost(`${URL}/batch-enabled`, data) +// 批量查询健康状态(只读查询,后端用 get_required_user,普通用户可访问) +export const batchEnvironmentHealthApi = (data) => apiPost(`${URL}/batch-health`, data) // ===== 默认与启用状态 ===== // 后端 set_default_environment 不接受请求体,仅靠 system_id query 定位 diff --git a/web/src/apis/external-systems/execution_api.js b/web/src/apis/external-systems/execution_api.js index 85e764c0..5e53636e 100644 --- a/web/src/apis/external-systems/execution_api.js +++ b/web/src/apis/external-systems/execution_api.js @@ -25,7 +25,8 @@ export const getExecutionContextApi = (id) => apiGet(`${URL}/${id}/context`) export const retryExecutionApi = (id) => apiAdminPost(`${URL}/${id}/retry`) // ===== 统计 ===== -export const getExecutionStatsApi = (params = {}) => apiGet(`${URL}/stats${buildQueryString(params)}`) +export const getExecutionStatsApi = (params = {}) => + apiGet(`${URL}/stats${buildQueryString(params)}`) export const getExecutionGroupedStatsApi = (params = {}) => apiGet(`${URL}/stats/grouped${buildQueryString(params)}`) export const getExecutionErrorAnalysisApi = (params = {}) => @@ -34,7 +35,8 @@ export const getExecutionTrendApi = (params = {}) => apiGet(`${URL}/stats/trend${buildQueryString(params)}`) // ===== 慢执行 & 按 Trace 查询 ===== -export const getSlowExecutionsApi = (params = {}) => apiGet(`${URL}/slow${buildQueryString(params)}`) +export const getSlowExecutionsApi = (params = {}) => + apiGet(`${URL}/slow${buildQueryString(params)}`) export const getExecutionsByTraceApi = (traceId, params = {}) => apiGet(`${URL}/by-trace/${traceId}${buildQueryString(params)}`) diff --git a/web/src/apis/external-systems/health_check_api.js b/web/src/apis/external-systems/health_check_api.js index 851ae16f..22817149 100644 --- a/web/src/apis/external-systems/health_check_api.js +++ b/web/src/apis/external-systems/health_check_api.js @@ -1,8 +1,8 @@ /** - * 13-健康检查 API(7 端点) + * 13-健康检查 API(8 端点) * 路径前缀:/health-checks */ -import { apiGet, apiAdminDelete } from '../base' +import { apiGet, apiAdminDelete, apiAdminPost } from '../base' import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.HEALTH_CHECK) @@ -34,3 +34,7 @@ export const getHealthCheckBySystemApi = (systemId, params = {}) => // ===== 按系统查询最新检查记录 ===== export const getLatestHealthCheckBySystemApi = (systemId, params = {}) => apiGet(`${URL}/by-system/${systemId}/latest${buildQueryString(params)}`) + +// ===== 触发系统级健康检查(管理员) ===== +export const triggerSystemHealthCheckApi = (systemId, body = {}) => + apiAdminPost(`${URL}/systems/${systemId}`, body) diff --git a/web/src/apis/external-systems/import_export_api.js b/web/src/apis/external-systems/import_export_api.js index e402ef11..db4dac69 100644 --- a/web/src/apis/external-systems/import_export_api.js +++ b/web/src/apis/external-systems/import_export_api.js @@ -26,8 +26,7 @@ export const exportToolApi = (params = {}) => export const bulkExportToolsApi = (data) => apiAdminPost(`${URL}/tools/bulk-export`, data) // ===== 工具包导入导出 ===== -export const exportToolPackageApi = (data) => - apiAdminPost(`${URL}/tool-package/export`, data) +export const exportToolPackageApi = (data) => apiAdminPost(`${URL}/tool-package/export`, data) export const previewToolPackageImportApi = (data) => apiAdminPost(`${URL}/tool-package/preview`, data) export const confirmToolPackageImportApi = (data) => diff --git a/web/src/apis/external-systems/integration_generator_api.js b/web/src/apis/external-systems/integration_generator_api.js index f8e414c3..998459e4 100644 --- a/web/src/apis/external-systems/integration_generator_api.js +++ b/web/src/apis/external-systems/integration_generator_api.js @@ -18,7 +18,7 @@ * - discover/preview/generate 共用 IntegrationToolFlowRequest Schema: * { system_id: int(必填), source_type?: str, env_key?: str, discovery_options?: dict } * - persist 使用 PersistIntegrationToolsRequest Schema: - * { system_id: int(必填), tools: list[ExternalToolItemRequest](min 1) } + * { system_id: int(必填), tools: list[ExternalToolItemRequest](min 1, max 100), source_type?: str } * - 后端响应均为 dict(JSON),无 StreamingResponse,无需 'blob' */ import { apiGet, apiAdminPost } from '../base' diff --git a/web/src/apis/external-systems/key_rotation_api.js b/web/src/apis/external-systems/key_rotation_api.js index af5032c5..623b1750 100644 --- a/web/src/apis/external-systems/key_rotation_api.js +++ b/web/src/apis/external-systems/key_rotation_api.js @@ -17,8 +17,7 @@ const URL = buildUrl(MODULE_PATHS.KEY_ROTATION) // ===== 列表与查询 ===== /** 分页列出密钥轮换策略 */ -export const getKeyRotationListApi = (params = {}) => - apiGet(`${URL}${buildQueryString(params)}`) +export const getKeyRotationListApi = (params = {}) => apiGet(`${URL}${buildQueryString(params)}`) /** 查询策略统计聚合 */ export const getKeyRotationStatsApi = (params = {}) => apiGet(`${URL}/stats${buildQueryString(params)}`) @@ -34,8 +33,7 @@ export const getExpiringKeyRotationsApi = (params = {}) => /** 获取密钥轮换策略详情 */ export const getKeyRotationDetailApi = (id) => apiGet(`${URL}/${id}`) /** 查询通知配置 */ -export const getKeyRotationNotifyConfigApi = (id) => - apiGet(`${URL}/${id}/notify-config`) +export const getKeyRotationNotifyConfigApi = (id) => apiGet(`${URL}/${id}/notify-config`) // ===== 增删改 ===== /** 创建密钥轮换策略 */ @@ -55,6 +53,9 @@ export const precheckKeyRotationApi = (id) => apiPost(`${URL}/${id}/precheck`) export const executeKeyRotationApi = (id, data) => apiAdminPost(`${URL}/${id}/execute`, data) /** 重置策略状态 */ export const resetKeyRotationApi = (id, data) => apiAdminPost(`${URL}/${id}/reset`, data) +/** 切换策略状态(active <-> disabled) */ +export const toggleKeyRotationStatusApi = (id, data) => + apiAdminPost(`${URL}/${id}/toggle-status`, data) // ===== 批量操作 ===== /** 批量克隆密钥轮换策略 */ diff --git a/web/src/apis/external-systems/metrics_api.js b/web/src/apis/external-systems/metrics_api.js index e2ddf74c..623a9a1c 100644 --- a/web/src/apis/external-systems/metrics_api.js +++ b/web/src/apis/external-systems/metrics_api.js @@ -1,6 +1,9 @@ /** * 14-指标查询 API(8 端点) * 路径前缀:/metrics + * + * 对齐 system_api.js / dashboard_api.js:所有查询类 GET 端点透传 opts.signal, + * 支持 composable 通过 AbortController 取消请求。 */ import { apiGet, apiAdminDelete } from '../base' import { buildUrl, buildQueryString, MODULE_PATHS } from './base' @@ -8,28 +11,28 @@ import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.METRICS) // ===== 指标查询 ===== -export const getMetricsAggregateApi = (params = {}) => - apiGet(`${URL}/aggregate${buildQueryString(params)}`) +export const getMetricsAggregateApi = (params = {}, opts = {}) => + apiGet(`${URL}/aggregate${buildQueryString(params)}`, { signal: opts.signal }) -export const getMetricsTimeseriesApi = (params = {}) => - apiGet(`${URL}/timeseries${buildQueryString(params)}`) +export const getMetricsTimeseriesApi = (params = {}, opts = {}) => + apiGet(`${URL}/timeseries${buildQueryString(params)}`, { signal: opts.signal }) -export const getMetricsBySystemApi = (params = {}) => - apiGet(`${URL}/by-system${buildQueryString(params)}`) +export const getMetricsBySystemApi = (params = {}, opts = {}) => + apiGet(`${URL}/by-system${buildQueryString(params)}`, { signal: opts.signal }) -export const getMetricsByEnvApi = (params = {}) => - apiGet(`${URL}/by-env${buildQueryString(params)}`) +export const getMetricsByEnvApi = (params = {}, opts = {}) => + apiGet(`${URL}/by-env${buildQueryString(params)}`, { signal: opts.signal }) -export const getMetricsLatestApi = (params = {}) => - apiGet(`${URL}/latest${buildQueryString(params)}`) +export const getMetricsLatestApi = (params = {}, opts = {}) => + apiGet(`${URL}/latest${buildQueryString(params)}`, { signal: opts.signal }) // ===== Prometheus 导出(返回文本,非 {success,data}) ===== -export const exportPrometheusMetricsApi = (params = {}) => - apiGet(`${URL}/prometheus${buildQueryString(params)}`, {}, true, 'text') +export const exportPrometheusMetricsApi = (params = {}, opts = {}) => + apiGet(`${URL}/prometheus${buildQueryString(params)}`, { signal: opts.signal }, true, 'text') // ===== 桶管理 ===== export const cleanupMetricBucketsApi = (before) => apiAdminDelete(`${URL}/buckets${buildQueryString({ before })}`) -export const getMetricBucketsApi = (params = {}) => - apiGet(`${URL}${buildQueryString(params)}`) +export const getMetricBucketsApi = (params = {}, opts = {}) => + apiGet(`${URL}${buildQueryString(params)}`, { signal: opts.signal }) diff --git a/web/src/apis/external-systems/notification_channel_api.js b/web/src/apis/external-systems/notification_channel_api.js index 5846b9a0..9f920421 100644 --- a/web/src/apis/external-systems/notification_channel_api.js +++ b/web/src/apis/external-systems/notification_channel_api.js @@ -14,7 +14,7 @@ * created_by, updated_by, created_at, updated_at } * 注意:主键字段为 `id`(非 channel_id);config 中敏感字段已由后端脱敏为 `***` * - 列表响应:{ items: NotificationChannelOutput[], total, limit, offset } - * - 统计响应:{ total, by_channel_type: {email, webhook, im}, + * - 统计响应:{ total, by_channel_type: {email, webhook, feishu, dingtalk}, * by_enabled: {enabled: N, disabled: M} } * 注意:by_enabled 的 key 为字符串 'enabled' / 'disabled'(非布尔 true/false) */ @@ -69,5 +69,4 @@ export const deleteNotificationChannelApi = (id) => apiAdminDelete(`${URL}/${id} * @param {number} id - 渠道主键 * @param {Object} [data] - { message? } 自定义测试消息内容 */ -export const testNotificationChannelApi = (id, data = {}) => - apiAdminPost(`${URL}/${id}/test`, data) +export const testNotificationChannelApi = (id, data = {}) => apiAdminPost(`${URL}/${id}/test`, data) diff --git a/web/src/apis/external-systems/quota_api.js b/web/src/apis/external-systems/quota_api.js index 01e92b74..94627117 100644 --- a/web/src/apis/external-systems/quota_api.js +++ b/web/src/apis/external-systems/quota_api.js @@ -1,5 +1,5 @@ /** - * 15-配额管理 API(16 端点) + * 15-配额管理 API(17 端点) * 路径前缀:/quotas * * 对齐后端 Router:backend/server/routers/external_systems/quota_router.py @@ -50,9 +50,10 @@ export const resetQuotaApi = (id, data) => apiAdminPost(`${URL}/${id}/reset`, da /** 删除配额(user 由后端从当前管理员填充) */ export const deleteQuotaApi = (id) => apiAdminDelete(`${URL}/${id}`) /** 按系统批量软删除配额 */ -export const deleteQuotasBySystemApi = (systemId) => - apiAdminDelete(`${URL}/by-system/${systemId}`) +export const deleteQuotasBySystemApi = (systemId) => apiAdminDelete(`${URL}/by-system/${systemId}`) // ===== 批量操作 ===== /** 批量调整配额限额(updated_by 由后端从当前管理员填充) */ export const batchAdjustQuotasApi = (data) => apiAdminPost(`${URL}/batch-adjust`, data) +/** 批量删除配额(user 由后端从当前管理员填充) */ +export const batchDeleteQuotasApi = (data) => apiAdminDelete(`${URL}/batch`, { data }) diff --git a/web/src/apis/external-systems/recycle_bin_api.js b/web/src/apis/external-systems/recycle_bin_api.js index 13b4e7bf..029cf705 100644 --- a/web/src/apis/external-systems/recycle_bin_api.js +++ b/web/src/apis/external-systems/recycle_bin_api.js @@ -19,7 +19,7 @@ * * 统一响应结构:{success: true, data: {...}} */ -import { apiAdminGet, apiAdminPost, apiAdminDelete } from '../base' +import { apiAdminGet, apiAdminPost, apiSuperAdminPost, apiSuperAdminDelete } from '../base' import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.RECYCLE_BIN) @@ -35,17 +35,16 @@ const URL = buildUrl(MODULE_PATHS.RECYCLE_BIN) * @param {string} [params.end_time] - 结束时间(ISO8601),按 deleted_at 过滤 * @returns {Promise<{success: boolean, data: {items: Array, total: number, limit: number, offset: number, by_type: Object}}>} */ -export const getTrashListApi = (params = {}) => - apiAdminGet(`${URL}${buildQueryString(params)}`) +export const getTrashListApi = (params = {}) => apiAdminGet(`${URL}${buildQueryString(params)}`) /** - * 清理过期回收站(物理删除超过保留期的软删除资源) + * 清理过期回收站(物理删除超过保留期的软删除资源,仅 superadmin) * * @param {Object} data - 请求体 * @param {number} data.older_than_days - 保留期天数(≥1,默认 30) * @returns {Promise<{success: boolean, data: {purged_count: number, by_type: Object, cutoff_at: string}}>} */ -export const purgeTrashApi = (data) => apiAdminPost(`${URL}/purge`, data) +export const purgeTrashApi = (data) => apiSuperAdminPost(`${URL}/purge`, data) /** * 恢复软删除资源 @@ -58,11 +57,28 @@ export const restoreTrashApi = (resourceType, resourceId) => apiAdminPost(`${URL}/${resourceType}/${resourceId}/restore`) /** - * 物理删除资源(不可恢复) + * 物理删除资源(不可恢复,仅 superadmin) * * @param {string} resourceType - 资源类型 * @param {number} resourceId - 资源 ID * @returns {Promise<{success: boolean, data: {resource_type: string, resource_id: number, deleted: boolean}}>} */ export const hardDeleteTrashApi = (resourceType, resourceId) => - apiAdminDelete(`${URL}/${resourceType}/${resourceId}`) + apiSuperAdminDelete(`${URL}/${resourceType}/${resourceId}`) + +/** + * 批量恢复软删除资源 + * + * @param {Array<{resource_type: string, resource_id: number}>} items - 资源列表 + * @returns {Promise<{success: boolean, data: {total: number, success_count: number, failed: Array}}>} + */ +export const batchRestoreTrashApi = (items) => apiAdminPost(`${URL}/batch/restore`, { items }) + +/** + * 批量物理删除资源(仅 superadmin) + * + * @param {Array<{resource_type: string, resource_id: number}>} items - 资源列表 + * @returns {Promise<{success: boolean, data: {total: number, success_count: number, failed: Array}}>} + */ +export const batchHardDeleteTrashApi = (items) => + apiSuperAdminPost(`${URL}/batch/hard-delete`, { items }) diff --git a/web/src/apis/external-systems/system_api.js b/web/src/apis/external-systems/system_api.js index 65797ea6..aea3a9b4 100644 --- a/web/src/apis/external-systems/system_api.js +++ b/web/src/apis/external-systems/system_api.js @@ -1,5 +1,5 @@ /** - * 01-系统管理 API(28 端点,后端另有 2 个已废弃端点 health/metrics 前端不暴露) + * 01-系统管理 API(29 端点,后端另有 2 个已废弃端点 health/metrics 前端不暴露) * 路径前缀:/systems * * 对齐后端 Router:backend/server/routers/external_systems/system_router.py @@ -16,7 +16,8 @@ import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.SYSTEM) // ===== 列表与详情 ===== -export const getSystemListApi = (params = {}) => apiGet(`${URL}${buildQueryString(params)}`) +export const getSystemListApi = (params = {}, opts = {}) => + apiGet(`${URL}${buildQueryString(params)}`, { signal: opts.signal, silent: opts.silent }) export const createSystemApi = (data) => apiAdminPost(URL, data) export const getSystemDetailApi = (id) => apiGet(`${URL}/${id}`) export const updateSystemApi = (id, data) => apiAdminPut(`${URL}/${id}`, data) @@ -27,14 +28,14 @@ export const deleteSystemApi = (id, cascade = false) => export const exportSystemsApi = (params = {}) => apiGet(`${URL}/export${buildQueryString(params)}`, {}, true, 'blob') export const getSystemStatsApi = () => apiGet(`${URL}/stats`) +export const getSystemDashboardApi = () => apiGet(`${URL}/dashboard`) // ===== 批量操作 ===== export const batchEnabledSystemsApi = (data) => apiAdminPost(`${URL}/batch-enabled`, data) export const batchCloneSystemsApi = (data) => apiAdminPost(`${URL}/batch-clone`, data) // ===== 熔断器状态 ===== -export const getSystemCircuitBreakersStatusApi = () => - apiGet(`${URL}/circuit-breakers/status`) +export const getSystemCircuitBreakersStatusApi = () => apiGet(`${URL}/circuit-breakers/status`) // ===== 启用/禁用 ===== export const setSystemEnabledApi = (id, data) => apiAdminPatch(`${URL}/${id}/enabled`, data) @@ -74,8 +75,7 @@ export const updateSystemSecretRefsApi = (id, data) => apiAdminPut(`${URL}/${id} // ===== 配置校验 ===== // 后端 validate_system_config 无 body 参数,仅靠路径 system_id 定位 -export const validateSystemConfigApi = (id) => - apiAdminPost(`${URL}/${id}/validate-config`) +export const validateSystemConfigApi = (id) => apiAdminPost(`${URL}/${id}/validate-config`) // ===== 资源汇总与影响分析 ===== export const getSystemResourceSummaryApi = (id) => apiGet(`${URL}/${id}/resource-summary`) diff --git a/web/src/apis/external-systems/test_case_api.js b/web/src/apis/external-systems/test_case_api.js index 4c20c8b4..2f6b9960 100644 --- a/web/src/apis/external-systems/test_case_api.js +++ b/web/src/apis/external-systems/test_case_api.js @@ -17,8 +17,7 @@ const URL = buildUrl(MODULE_PATHS.TEST_CASE) // ===== 列表与详情 ===== /** 分页列出测试用例 */ -export const getTestCaseListApi = (params = {}) => - apiGet(`${URL}${buildQueryString(params)}`) +export const getTestCaseListApi = (params = {}) => apiGet(`${URL}${buildQueryString(params)}`) /** 获取测试用例详情 */ export const getTestCaseDetailApi = (id) => apiGet(`${URL}/${id}`) /** 查询测试用例告警配置 */ diff --git a/web/src/apis/external-systems/token_api.js b/web/src/apis/external-systems/token_api.js index ff007e89..0ef116c8 100644 --- a/web/src/apis/external-systems/token_api.js +++ b/web/src/apis/external-systems/token_api.js @@ -22,29 +22,36 @@ const URL = buildUrl(MODULE_PATHS.TOKEN) // ===== 列表与详情 ===== /** 分页列出 Token(支持 system_id/env_key/token_type/is_invalidated 过滤,DB 层下推) */ -export const getTokenListApi = (params = {}) => apiGet(`${URL}${buildQueryString(params)}`) +export const getTokenListApi = (params = {}, options = {}) => + apiGet(`${URL}${buildQueryString(params)}`, options) /** 获取 Token 详情(access_token/refresh_token 脱敏,含 system_name/system_slug 上下文) */ -export const getTokenDetailApi = (id) => apiGet(`${URL}/${id}`) +export const getTokenDetailApi = (id, options = {}) => apiGet(`${URL}/${id}`, options) // ===== 失效管理 ===== /** 失效单条 Token(admin 权限,幂等,已失效返回 409) */ export const invalidateTokenApi = (id) => apiAdminPost(`${URL}/${id}/invalidate`) /** 按环境失效 Token(admin 权限,幂等,Body: {system_id, env_key}) */ -export const invalidateEnvironmentTokensApi = (data) => apiAdminPost(`${URL}/invalidate-environment`, data) +export const invalidateEnvironmentTokensApi = (data) => + apiAdminPost(`${URL}/invalidate-environment`, data) // ===== 使用与轮换预览 ===== /** 查询 Token 使用记录(基于 ExternalToolExecution 关联查询) */ -export const getTokenUsageApi = (id, params = {}) => - apiGet(`${URL}/${id}/usage${buildQueryString(params)}`) -/** 轮换影响范围预览(只读,返回 token_status + 受影响的系统/环境/工具/密钥轮换策略) */ -export const getTokenRotationPreviewApi = (id) => apiGet(`${URL}/${id}/rotation-preview`) +export const getTokenUsageApi = (id, params = {}, options = {}) => + apiGet(`${URL}/${id}/usage${buildQueryString(params)}`, options) +/** 轮换影响范围预览(只读,返回 token_status + 受影响的系统/环境/工具/密钥轮换策略; + * expiring_days 控制 token_status 中 expiring_soon 阈值,与 /stats、/expiring 端点保持一致) */ +export const getTokenRotationPreviewApi = (id, params = {}, options = {}) => + apiGet(`${URL}/${id}/rotation-preview${buildQueryString(params)}`, options) // ===== 统计与历史 ===== /** 查询 Token 统计(5 状态分组:total/active/invalidated/expired/expiring_soon,支持 expiring_days 阈值) */ -export const getTokenStatsApi = (params = {}) => apiGet(`${URL}/stats${buildQueryString(params)}`) +export const getTokenStatsApi = (params = {}, options = {}) => + apiGet(`${URL}/stats${buildQueryString(params)}`, options) /** 查询 Token 变更历史(system_id 必填,基于审计日志,含刷新成功/失败事件) */ -export const getTokenHistoryApi = (params = {}) => apiGet(`${URL}/history${buildQueryString(params)}`) +export const getTokenHistoryApi = (params = {}, options = {}) => + apiGet(`${URL}/history${buildQueryString(params)}`, options) // ===== 过期预警 ===== /** 查询即将过期的 Token(days 默认 7,范围 1-90,system_id 透传 DB 层过滤) */ -export const getExpiringTokensApi = (params = {}) => apiGet(`${URL}/expiring${buildQueryString(params)}`) +export const getExpiringTokensApi = (params = {}, options = {}) => + apiGet(`${URL}/expiring${buildQueryString(params)}`, options) diff --git a/web/src/apis/external-systems/tool_api.js b/web/src/apis/external-systems/tool_api.js index 1a2de2e6..df8d006c 100644 --- a/web/src/apis/external-systems/tool_api.js +++ b/web/src/apis/external-systems/tool_api.js @@ -1,5 +1,5 @@ /** - * 02-工具管理 API(22 端点) + * 02-工具管理 API * 路径前缀:/tools * * 对齐 backend/server/routers/external_systems/tool_router.py: @@ -7,7 +7,6 @@ * - execute / batch-execute 后端用 get_required_user(执行类操作,非写操作) * - get_tool / delete_tool 接受可选 system_id query * - export-wsdl 后端返回普通 JSON(非 StreamingResponse),system_id 必填 - * - export 后端返回 StreamingResponse,需用 blob 接收 * - health-check 后端用 get_admin_user,请求体可选 env_key */ import { apiGet, apiPost, apiAdminPost, apiAdminPut, apiAdminDelete } from '../base' @@ -24,18 +23,14 @@ export const updateToolApi = (id, data) => apiAdminPut(`${URL}/${id}`, data) export const deleteToolApi = (id, systemId) => apiAdminDelete(`${URL}/${id}${buildQueryString({ system_id: systemId })}`) -// ===== 选项与启用列表 ===== -export const getEnabledToolsApi = (params = {}) => - apiGet(`${URL}/enabled${buildQueryString(params)}`) +// ===== 选项 ===== export const getToolOptionsApi = (params = {}) => apiGet(`${URL}/options${buildQueryString(params)}`) // ===== 导入导出 ===== -// 后端 export_tools 返回 StreamingResponse(application/octet-stream) -export const exportToolsApi = (params = {}) => - apiGet(`${URL}/export${buildQueryString(params)}`, {}, true, 'blob') // 后端 export_wsdl 返回普通 JSON,system_id 必填 -export const exportToolWsdlApi = (params = {}) => apiGet(`${URL}/export-wsdl${buildQueryString(params)}`) +export const exportToolWsdlApi = (params = {}) => + apiGet(`${URL}/export-wsdl${buildQueryString(params)}`) export const importToolsApi = (data) => apiAdminPost(`${URL}/import`, data) export const importToolsFromWsdlApi = (data) => apiAdminPost(`${URL}/import-from-wsdl`, data) @@ -46,8 +41,7 @@ export const batchExecuteToolsApi = (data) => apiPost(`${URL}/batch-execute`, da // ===== 健康检查 ===== // 后端 health_check_external_tool 用 get_admin_user,请求体可选 env_key -export const healthCheckToolApi = (id, data = {}) => - apiAdminPost(`${URL}/${id}/health-check`, data) +export const healthCheckToolApi = (id, data = {}) => apiAdminPost(`${URL}/${id}/health-check`, data) // ===== 批量克隆 ===== export const batchCloneToolsApi = (data) => apiAdminPost(`${URL}/batch-clone`, data) @@ -60,12 +54,10 @@ export const getToolVersionsApi = (id, params = {}) => apiGet(`${URL}/${id}/versions${buildQueryString(params)}`) export const compareToolVersionsApi = (id, v1, v2) => apiGet(`${URL}/${id}/versions/${v1}/compare/${v2}`) -export const rollbackToolVersionApi = (id, v) => - apiAdminPost(`${URL}/${id}/versions/${v}/rollback`) +export const rollbackToolVersionApi = (id, v) => apiAdminPost(`${URL}/${id}/versions/${v}/rollback`) // ===== 参数模板与执行趋势 ===== -export const getToolParameterTemplateApi = (id) => - apiGet(`${URL}/${id}/parameter-template`) +export const getToolParameterTemplateApi = (id) => apiGet(`${URL}/${id}/parameter-template`) export const getToolExecutionTrendApi = (id, params = {}) => apiGet(`${URL}/${id}/execution-trend${buildQueryString(params)}`) diff --git a/web/src/apis/external-systems/vendor_integration_api.js b/web/src/apis/external-systems/vendor_integration_api.js index 098b315b..39b9da06 100644 --- a/web/src/apis/external-systems/vendor_integration_api.js +++ b/web/src/apis/external-systems/vendor_integration_api.js @@ -16,8 +16,7 @@ import { buildUrl, buildQueryString, MODULE_PATHS } from './base' const URL = buildUrl(MODULE_PATHS.VENDOR_INTEGRATION) // ===== 列表与元数据 ===== -export const getVendorListApi = (params = {}) => - apiGet(`${URL}${buildQueryString(params)}`) +export const getVendorListApi = (params = {}) => apiGet(`${URL}${buildQueryString(params)}`) export const getVendorOverviewApi = () => apiGet(`${URL}/overview`) export const getVendorCategoriesApi = () => apiGet(`${URL}/categories`) export const getVendorAdapterTypesApi = () => apiGet(`${URL}/adapter-types`) @@ -26,6 +25,5 @@ export const getVendorSourceTypesApi = () => apiGet(`${URL}/source-types`) // ===== 详情与子资源 ===== export const getVendorDetailApi = (key) => apiGet(`${URL}/${key}`) export const getVendorOperationsApi = (key) => apiGet(`${URL}/${key}/operations`) -export const getVendorConnectionSchemaApi = (key) => - apiGet(`${URL}/${key}/connection-schema`) +export const getVendorConnectionSchemaApi = (key) => apiGet(`${URL}/${key}/connection-schema`) export const getVendorExampleConfigApi = (key) => apiGet(`${URL}/${key}/example-config`) diff --git a/web/src/apis/external-systems/webhook_api.js b/web/src/apis/external-systems/webhook_api.js index f6bc994f..3bd672f2 100644 --- a/web/src/apis/external-systems/webhook_api.js +++ b/web/src/apis/external-systems/webhook_api.js @@ -23,22 +23,18 @@ const URL = buildUrl(MODULE_PATHS.WEBHOOK) export const getWebhookSubscriptionListApi = (params = {}) => apiGet(`${URL}/subscriptions${buildQueryString(params)}`) /** 获取 Webhook 订阅详情 */ -export const getWebhookSubscriptionDetailApi = (id) => - apiGet(`${URL}/subscriptions/${id}`) +export const getWebhookSubscriptionDetailApi = (id) => apiGet(`${URL}/subscriptions/${id}`) /** 创建 Webhook 订阅 */ -export const createWebhookSubscriptionApi = (data) => - apiAdminPost(`${URL}/subscriptions`, data) +export const createWebhookSubscriptionApi = (data) => apiAdminPost(`${URL}/subscriptions`, data) /** 更新 Webhook 订阅(部分更新) */ export const updateWebhookSubscriptionApi = (id, data) => apiAdminPut(`${URL}/subscriptions/${id}`, data) /** 删除 Webhook 订阅 */ -export const deleteWebhookSubscriptionApi = (id) => - apiAdminDelete(`${URL}/subscriptions/${id}`) +export const deleteWebhookSubscriptionApi = (id) => apiAdminDelete(`${URL}/subscriptions/${id}`) // ===== 订阅续期与筛选快捷入口 ===== /** 续期 Webhook 订阅 */ -export const renewWebhookSubscriptionApi = (id) => - apiAdminPost(`${URL}/subscriptions/${id}/renew`) +export const renewWebhookSubscriptionApi = (id) => apiAdminPost(`${URL}/subscriptions/${id}/renew`) /** 列出即将过期的 Webhook 订阅 */ export const getExpiringWebhookSubscriptionsApi = (params = {}) => apiGet(`${URL}/subscriptions/expiring${buildQueryString(params)}`) @@ -48,8 +44,7 @@ export const getWebhookRenewalFailuresApi = (params = {}) => // ===== 过滤规则 / 转换规则 ===== /** 获取 Webhook 订阅过滤规则 */ -export const getWebhookFilterRulesApi = (id) => - apiGet(`${URL}/subscriptions/${id}/filter-rules`) +export const getWebhookFilterRulesApi = (id) => apiGet(`${URL}/subscriptions/${id}/filter-rules`) /** 更新 Webhook 订阅过滤规则 */ export const updateWebhookFilterRulesApi = (id, data) => apiAdminPut(`${URL}/subscriptions/${id}/filter-rules`, data)