mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-03-31 16:20:28 +02:00
140 lines
8.0 KiB
Go
140 lines
8.0 KiB
Go
package handler
|
||
|
||
// apiDocI18n 为 OpenAPI 文档提供 x-i18n-* 扩展键,供前端 apiDocs 国际化使用。
|
||
// 前端通过 apiDocs.tags.* / apiDocs.summary.* / apiDocs.response.* 翻译。
|
||
|
||
var apiDocI18nTagToKey = map[string]string{
|
||
"认证": "auth", "对话管理": "conversationManagement", "对话交互": "conversationInteraction",
|
||
"批量任务": "batchTasks", "对话分组": "conversationGroups", "漏洞管理": "vulnerabilityManagement",
|
||
"角色管理": "roleManagement", "Skills管理": "skillsManagement", "监控": "monitoring",
|
||
"配置管理": "configManagement", "外部MCP管理": "externalMCPManagement", "攻击链": "attackChain",
|
||
"知识库": "knowledgeBase", "MCP": "mcp",
|
||
}
|
||
|
||
var apiDocI18nSummaryToKey = map[string]string{
|
||
"用户登录": "login", "用户登出": "logout", "修改密码": "changePassword", "验证Token": "validateToken",
|
||
"创建对话": "createConversation", "列出对话": "listConversations", "查看对话详情": "getConversationDetail",
|
||
"更新对话": "updateConversation", "删除对话": "deleteConversation", "获取对话结果": "getConversationResult",
|
||
"发送消息并获取AI回复(非流式)": "sendMessageNonStream", "发送消息并获取AI回复(流式)": "sendMessageStream",
|
||
"取消任务": "cancelTask", "列出运行中的任务": "listRunningTasks", "列出已完成的任务": "listCompletedTasks",
|
||
"创建批量任务队列": "createBatchQueue", "列出批量任务队列": "listBatchQueues", "获取批量任务队列": "getBatchQueue",
|
||
"删除批量任务队列": "deleteBatchQueue", "启动批量任务队列": "startBatchQueue", "暂停批量任务队列": "pauseBatchQueue",
|
||
"添加任务到队列": "addTaskToQueue", "SQL注入扫描": "sqlInjectionScan", "端口扫描": "portScan",
|
||
"更新批量任务": "updateBatchTask", "删除批量任务": "deleteBatchTask",
|
||
"创建分组": "createGroup", "列出分组": "listGroups", "获取分组": "getGroup", "更新分组": "updateGroup",
|
||
"删除分组": "deleteGroup", "获取分组中的对话": "getGroupConversations", "添加对话到分组": "addConversationToGroup",
|
||
"从分组移除对话": "removeConversationFromGroup",
|
||
"列出漏洞": "listVulnerabilities", "创建漏洞": "createVulnerability", "获取漏洞统计": "getVulnerabilityStats",
|
||
"获取漏洞": "getVulnerability", "更新漏洞": "updateVulnerability", "删除漏洞": "deleteVulnerability",
|
||
"列出角色": "listRoles", "创建角色": "createRole", "获取角色": "getRole", "更新角色": "updateRole", "删除角色": "deleteRole",
|
||
"获取可用Skills列表": "getAvailableSkills", "列出Skills": "listSkills", "创建Skill": "createSkill",
|
||
"获取Skill统计": "getSkillStats", "清空Skill统计": "clearSkillStats", "获取Skill": "getSkill",
|
||
"更新Skill": "updateSkill", "删除Skill": "deleteSkill", "获取绑定角色": "getBoundRoles",
|
||
"获取监控信息": "getMonitorInfo", "获取执行记录": "getExecutionRecords", "删除执行记录": "deleteExecutionRecord",
|
||
"批量删除执行记录": "batchDeleteExecutionRecords", "获取统计信息": "getStats",
|
||
"获取配置": "getConfig", "更新配置": "updateConfig", "获取工具配置": "getToolConfig", "应用配置": "applyConfig",
|
||
"列出外部MCP": "listExternalMCP", "获取外部MCP统计": "getExternalMCPStats", "获取外部MCP": "getExternalMCP",
|
||
"添加或更新外部MCP": "addOrUpdateExternalMCP", "stdio模式配置": "stdioModeConfig", "SSE模式配置": "sseModeConfig",
|
||
"删除外部MCP": "deleteExternalMCP", "启动外部MCP": "startExternalMCP", "停止外部MCP": "stopExternalMCP",
|
||
"获取攻击链": "getAttackChain", "重新生成攻击链": "regenerateAttackChain",
|
||
"设置对话置顶": "pinConversation", "设置分组置顶": "pinGroup", "设置分组中对话的置顶": "pinGroupConversation",
|
||
"获取分类": "getCategories", "列出知识项": "listKnowledgeItems", "创建知识项": "createKnowledgeItem",
|
||
"获取知识项": "getKnowledgeItem", "更新知识项": "updateKnowledgeItem", "删除知识项": "deleteKnowledgeItem",
|
||
"获取索引状态": "getIndexStatus", "重建索引": "rebuildIndex", "扫描知识库": "scanKnowledgeBase",
|
||
"搜索知识库": "searchKnowledgeBase", "基础搜索": "basicSearch", "按风险类型搜索": "searchByRiskType",
|
||
"获取检索日志": "getRetrievalLogs", "删除检索日志": "deleteRetrievalLog",
|
||
"MCP端点": "mcpEndpoint", "列出所有工具": "listAllTools", "调用工具": "invokeTool", "初始化连接": "initConnection",
|
||
"成功响应": "successResponse", "错误响应": "errorResponse",
|
||
}
|
||
|
||
var apiDocI18nResponseDescToKey = map[string]string{
|
||
"获取成功": "getSuccess", "未授权": "unauthorized", "未授权,需要有效的Token": "unauthorizedToken",
|
||
"创建成功": "createSuccess", "请求参数错误": "badRequest", "对话不存在": "conversationNotFound",
|
||
"对话不存在或结果不存在": "conversationOrResultNotFound", "请求参数错误(如task为空)": "badRequestTaskEmpty",
|
||
"请求参数错误或分组名称已存在": "badRequestGroupNameExists", "分组不存在": "groupNotFound",
|
||
"请求参数错误(如配置格式不正确、缺少必需字段等)": "badRequestConfig",
|
||
"请求参数错误(如query为空)": "badRequestQueryEmpty", "方法不允许(仅支持POST请求)": "methodNotAllowed",
|
||
"登录成功": "loginSuccess", "密码错误": "invalidPassword", "登出成功": "logoutSuccess",
|
||
"密码修改成功": "passwordChanged", "Token有效": "tokenValid", "Token无效或已过期": "tokenInvalid",
|
||
"对话创建成功": "conversationCreated", "服务器内部错误": "internalError", "更新成功": "updateSuccess",
|
||
"删除成功": "deleteSuccess", "队列不存在": "queueNotFound", "启动成功": "startSuccess",
|
||
"暂停成功": "pauseSuccess", "添加成功": "addSuccess",
|
||
"任务不存在": "taskNotFound", "对话或分组不存在": "conversationOrGroupNotFound",
|
||
"取消请求已提交": "cancelSubmitted", "未找到正在执行的任务": "noRunningTask",
|
||
"消息发送成功,返回AI回复": "messageSent", "流式响应(Server-Sent Events)": "streamResponse",
|
||
}
|
||
|
||
// enrichSpecWithI18nKeys 在 spec 的每个 operation 上写入 x-i18n-tags、x-i18n-summary,
|
||
// 在每个 response 上写入 x-i18n-description,供前端按 key 做国际化。
|
||
func enrichSpecWithI18nKeys(spec map[string]interface{}) {
|
||
paths, _ := spec["paths"].(map[string]interface{})
|
||
if paths == nil {
|
||
return
|
||
}
|
||
for _, pathItem := range paths {
|
||
pm, _ := pathItem.(map[string]interface{})
|
||
if pm == nil {
|
||
continue
|
||
}
|
||
for _, method := range []string{"get", "post", "put", "delete", "patch"} {
|
||
opVal, ok := pm[method]
|
||
if !ok {
|
||
continue
|
||
}
|
||
op, _ := opVal.(map[string]interface{})
|
||
if op == nil {
|
||
continue
|
||
}
|
||
// x-i18n-tags: 与 tags 一一对应的 i18n 键数组(spec 中 tags 为 []string)
|
||
switch tags := op["tags"].(type) {
|
||
case []string:
|
||
if len(tags) > 0 {
|
||
keys := make([]string, 0, len(tags))
|
||
for _, s := range tags {
|
||
if k := apiDocI18nTagToKey[s]; k != "" {
|
||
keys = append(keys, k)
|
||
} else {
|
||
keys = append(keys, s)
|
||
}
|
||
}
|
||
op["x-i18n-tags"] = keys
|
||
}
|
||
case []interface{}:
|
||
if len(tags) > 0 {
|
||
keys := make([]interface{}, 0, len(tags))
|
||
for _, t := range tags {
|
||
if s, ok := t.(string); ok {
|
||
if k := apiDocI18nTagToKey[s]; k != "" {
|
||
keys = append(keys, k)
|
||
} else {
|
||
keys = append(keys, s)
|
||
}
|
||
}
|
||
}
|
||
if len(keys) > 0 {
|
||
op["x-i18n-tags"] = keys
|
||
}
|
||
}
|
||
}
|
||
// x-i18n-summary
|
||
if summary, _ := op["summary"].(string); summary != "" {
|
||
if k := apiDocI18nSummaryToKey[summary]; k != "" {
|
||
op["x-i18n-summary"] = k
|
||
}
|
||
}
|
||
// responses -> 每个 status -> x-i18n-description
|
||
if respMap, _ := op["responses"].(map[string]interface{}); respMap != nil {
|
||
for _, rv := range respMap {
|
||
if r, _ := rv.(map[string]interface{}); r != nil {
|
||
if desc, _ := r["description"].(string); desc != "" {
|
||
if k := apiDocI18nResponseDescToKey[desc]; k != "" {
|
||
r["x-i18n-description"] = k
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|