e0a6558 (base) → 00f6c53 (head)codescan.issues_diff 真实数据)本次提交是一次功能新增 + 安全加固,共改动 15 个文件(新增 6 / 修改 9):
| 类别 | 文件 |
|---|---|
| 新增 | internal/biz/agent_prompt.go、internal/biz/agent_prompt_test.go、internal/controller/agent_prompt.go、internal/controller/agent_prompt_test.go、internal/data/agent_prompt_repo.go、internal/data/agent_prompt_repo_test.go |
| 修改 | CHANGELOG.md、cmd/yumc-codewiki-hub-api/db.go、cmd/yumc-codewiki-hub-api/db_logging_test.go、cmd/yumc-codewiki-hub-api/initialize.go、cmd/yumc-codewiki-hub-api/wire_gen.go、docs/ddl.sql、internal/data/models.go、internal/server/http.go |
功能链路(分层清晰,符合既有 Template 模块范式):
data.AgentPromptRepo(GORM 数据访问)→ biz.AgentPromptService(校验 + SHA256 checksum)→ controller.AgentPromptController(HTTP)→ server.NewHTTPServer 注册 4 条路由。hub_agent_prompt:models.go 新增 AgentPrompt 结构体,同时在 db.go 的 AutoMigrate 与 docs/ddl.sql 双向落地(表前缀 hub_,与 DDL 一致)。initialize.go 的 repo/biz/service ProviderSet 各增一条 + wire_gen.go 同步生成。接口变更(新增,Backward-compatible),均挂在 admin 命名空间:
GET /hub/admin/agent-prompts
GET /hub/admin/agent-prompts/{prompt_key}
PUT /hub/admin/agent-prompts/{prompt_key}
PUT /hub/admin/agent-prompts/{prompt_key}/enabled
安全加固:db.go 新增 newParameterizedGormLogger(ParameterizedQueries: true),GORM 日志不再插值 SQL 参数,避免提示词正文进入慢查询/错误日志;并新增回归测试 TestParameterizedGormLoggerDoesNotLogPromptBody 断言日志只出现 ? 占位符。
数据来源:
codescan.issues_diff。
| 严重度/类型 | 位置 | 建议 |
|---|---|---|
| Low/Maintainability 行过长 | cmd/yumc-codewiki-hub-api/db.go:66 | break long lines for readability |
| Medium/Complexity 圈复杂度过高 | cmd/yumc-codewiki-hub-api/db_logging_test.go:14 | consider splitting into smaller functions |
| Low/Maintainability 行过长 | cmd/yumc-codewiki-hub-api/initialize.go:117 | break long lines for readability |
| Low/DeadCode 未使用的参数 | cmd/yumc-codewiki-hub-api/initialize.go:128 | remove unused parameter or prefix with _ |
| Medium/Dependency 高耦合 | cmd/yumc-codewiki-hub-api/initialize.go:128 | split the function or introduce interfaces to reduce coupling |
⚠ 落地判读(重要):这 5 条并非真实修复,而是行号漂移的同一问题。对照「新增问题」列表可见同一问题在 head 中以下一行的行号重新出现:
db.go 行过长 :66 → :90(文件头部插入 ~24 行)db_logging_test.go 圈复杂度 :14 → :66(前面插入新测试 ~52 行)initialize.go 行过长 :117 → :121、未使用参数/高耦合 :128 → :132(ProviderSet 各增 1~2 行,函数整体下移 4 行)即净修复为 0 条,仅位置变化。不应将其计入"缺陷收敛"。
数据来源:
codescan.issues_diff。
| 严重度/类型 | 位置 | 说明 |
|---|---|---|
| Medium/Dependency 高耦合 | cmd/yumc-codewiki-hub-api/db.go:38 | NewGormDB 直接依赖 11 个函数,超阈值 10(新增 newParameterizedGormLogger 所致) |
| Low/Maintainability 重复代码块 | internal/biz/agent_prompt.go:76 | 4 行重复(2 次) |
| Low/Maintainability 重复代码块 | internal/biz/agent_prompt.go:89 | 4 行重复(2 次) |
| Low/Maintainability 重复代码块 | internal/controller/agent_prompt.go:100 | 4 行重复(3 次) |
| Low/Maintainability 重复代码块 | internal/data/agent_prompt_repo.go:79 | 4 行重复(2 次) |
| Low/Maintainability 重复代码块 | internal/biz/agent_prompt_test.go:24 | 4 行重复(2 次) |
| Low/Maintainability 重复代码块 | internal/biz/agent_prompt_test.go:130 |
真实新增集中在 新增代码自身的重复代码块(错误映射 / 响应封装 / 测试桩),均 Low,无功能或安全风险。唯一 Threshold 级问题是 NewGormDB 高耦合(新增 logger 构造使其从 10 → 11)。
| 严重度/类型 | 位置 | 说明 |
|---|---|---|
| Low/Maintainability 行过长 | cmd/yumc-codewiki-hub-api/db.go:90 | 即 base :66 |
| Medium/Complexity 圈复杂度过高 | cmd/yumc-codewiki-hub-api/db_logging_test.go:66 | 即 base :14(count=15) |
| Low/Maintainability 行过长 | cmd/yumc-codewiki-hub-api/initialize.go:121 | 即 base :117 |
| Low/DeadCode 未使用的参数 | cmd/yumc-codewiki-hub-api/initialize.go:132 | 即 base :128(config 未使用) |
| Medium/Dependency 高耦合 | cmd/yumc-codewiki-hub-api/initialize.go:132 | 即 base :128(newApp 依赖 12 个函数) |
| 严重度/类型 | 位置 | 说明 |
|---|---|---|
| Low/DeadCode 未使用的参数 | internal/data/agent_prompt_repo.go:123 | 误报:escapeLikePattern(value string) 中 value 在 replacer.Replace(value) 被使用,非未使用。 |
汇总:15 条新增中,真实新增 9 条(全部 Low + 1 条 Medium 高耦合),伪新增(行号漂移)5 条,误报 1 条。无 Critical / High,无功能或安全缺陷。
biz.UpdateContent 先 TrimSpace 归一化,再 sha256 + hex,且以归一化后的正文计算,测试已覆盖(首尾空白去除后校验和一致)。utf8.RuneCountInString(normalized) > MaxAgentPromptChars(200_000),按字符而非字节计数,中文安全。escapeLikePattern 对 \、%、_ 转义,配合 ESCAPE '\',用户输入按字面量匹配(TestAgentPromptRepoListEscapesWildcard 覆盖)。转义顺序(先转义 \)正确,无二次转义漏洞。UpdateContent/UpdateEnabled 用 Updates(map) 部分更新,并以 RowsAffected == 0 → gorm.ErrRecordNotFound 处理并发删除,biz 层统一 mapAgentPromptError 映射为业务 ErrAgentPromptNotFound。agentPromptSummary 不含 prompt_content,正文仅详情接口返回(TestAgentPromptControllerListOmitsPromptContent 覆盖),减少正文外泄面。updated_by 可伪造:4 条新路由未挂鉴权中间件(与既有 /hub/admin/*、模板管理一致,依赖上游 BFF 身份透传)。agentPromptUpdatedBy 直接取客户端可控的 X-User-Domain 头并小写化写入 updated_by。若提示词被视为敏感配置,建议补充权限校验,否则审计字段可被任意调用方伪造。Update 使用 json.NewDecoder(ctx.Request().Body) 直接解码,DisallowUnknownFields 已开启,但未 MaxBytesReader;超长 body 会被完整读入内存后才在 biz 层按 200k 字符拒绝。建议在 handler 层限制体积(如 http.MaxBytesReader)。List 一次返回全表,提示词为配置类小表,当前可接受;若后续量级增长建议补分页。hub_agent_prompt 同时由 AutoMigrate 与 docs/ddl.sql 维护,需保证二者字段/索引长期一致(当前一致:prompt_key 唯一、category/enabled 索引)。biz.AgentPromptRepository 接口 + wire.Bind,符合依赖倒置,未把 *gorm.DB 泄漏到 biz 层。总体风险等级:低。 本增量以新增功能为主,附带一项有价值的安全加固;未引入 Critical/High 缺陷,未发现功能性或安全性 bug。质检报告的 5 条"修复"实为行号漂移,净修复为 0;15 条"新增"中仅 9 条真实(多为 Low 重复代码),1 条误报。
建议动作:
biz/controller 中重复的错误映射与响应封装小工具(对应 6 处重复代码块),消除 Low 噪音;NewGormDB 高耦合可通过抽取 buildGormLogger() 或 autoMigrate(db) 助手降低 fan-out。/hub/admin/agent-prompts/* 的鉴权归属;如提示词属敏感配置,补充权限校验与体积限制。放行建议:可放行(无阻断项)。
| 4 行重复(2 次) |
| Low/Maintainability 重复代码块 | internal/controller/agent_prompt_test.go:38 | 4 行重复(3 次) |
| Low/Maintainability 重复代码块 | internal/data/agent_prompt_repo_test.go:19 | 4 行重复(2 次) |
ParameterizedQueries: trueagentPromptErrorResulterror_type=%T