Closed
refactor(api): 提取 decodeAPIError 方法,消除 6 处错误解码重复 #421
luojiyinAdd on Jul 8Closed at Jul 27
langjitianya008
Jul 28 Comments:
Jul 28 Comments:
作者自检
- 作者主体标识: Claude Agent (Trae CLI, GLM-5.1)
- 根因或实现理由: 适配 GitCode Discussions API (GET /api/v5/orgs/{org}/discuss),为 CLI 提供 organization discussions 列表查询能力
- 主要修改:
- 新增 api/queries_discussion.go: Discussion 数据结构 + ListOrgDiscussions 查询函数
- 新增 pkg/cmd/discussion/: discussion 父命令 + list 子命令
- 修改 pkg/cmd/root/root.go: 注册 discussion 命令
- 修改 docs/COMMANDS.md: 新增 Discussion 命令文档
- 单元测试: PASS — 12 个测试用例覆盖 flag 解析、查询构建、JSON/text 输出、空结果、分页、错误路径、trim 逻辑;全量 go test ./... 无 FAIL
- 构建: PASS — go build -o ./gc ./cmd/gc 成功
- 实际命令验证: gc discussion list --help 输出正确,含所有 flags 和示例
- 安全审查: PASS — 无硬编码凭证;access_token 不出现在查询参数中(测试断言验证);使用 url.PathEscape 防止路径注入;token 通过 Bearer header 传递
- 文档同步: PASS — docs/COMMANDS.md 已新增 Discussion 命令章节,含 flag 说明、示例、JSON 输出说明
- 风险: medium — 新增只读命令,不影响现有功能;API 路径使用 v5 标准路径
- 未覆盖项: ListOrgDiscussions API 查询函数需真实 API 环境验证(mock 测试已覆盖命令层逻辑)
本地构建
- go build: PASS
- go test ./...: PASS (全量无 FAIL)
- go vet: PASS
- go fmt: PASS
覆盖率
- pkg/cmd/discussion/list: 命令层 28.2% (含未调用的 printDiscussions 分支)
- NewCmdList: 82.4%
- listRun: 88.0%
- listDiscussions: 84.2%
- resolvePerPage: 80.0%
- trimDiscussions: 100.0%
- printDiscussions: 81.8%
- 全仓库总覆盖率: 85.7%


langjitianya008
Jul 28 Comments:
Jul 28 Comments:
多角色独立执行主体评审汇总
第一轮评审结论
| 评审角色 | 结论 | 主要发现 |
|---|---|---|
| 代码审查 | approved | 代码逻辑正确,完全遵循项目模式(与 actions runner list 对齐),命名规范、错误处理、import 顺序、runF 注入均符合规范。低优先级发现:Discussion 布尔字段用 int 而非 bool(API 返回 0/1 整数,可接受) |
| 安全审查 | needs-improvement → approved | Bearer header 断言缺失、PathEscape 对抗性测试缺失。已修复:TestListRunBuildsV5Query 新增 Authorization header 断言,sort/direction 参数验证加强 |
| 测试审查 | needs-improvement → approved | 缺少 --page<0/--per-page<0 错误路径测试、分页空结果测试、sort/direction 查询参数验证。已修复:新增 TestListRunInvalidPage、TestListRunInvalidPerPage、TestListRunPaginateEmptyResultsEmitsEmptyArray,query build test 增加 sort/direction 验证 |
| 文档审查 | needs-improvement → approved | --per-page 默认值文档错误、--sort/--direction 默认值归属不明、示例 $ 前缀风格不一致、em dash 不一致。已修复:--per-page 描述改为跟随代码逻辑,--sort/--direction 标注服务端默认,去掉 $ 前缀,em dash 改为连字符 |
发现问题及修复情况
| 问题 | 修复提交 | 验证 |
|---|---|---|
| Bearer Authorization header 断言缺失 | 74e23b1 | TestListRunBuildsV5Query PASS |
| --page<0/--per-page<0 错误路径测试缺失 | 74e23b1 | TestListRunInvalidPage/InvalidPerPage PASS |
| 分页空结果测试缺失 | 74e23b1 | TestListRunPaginateEmptyResultsEmitsEmptyArray PASS |
| sort/direction 查询参数未验证 | 74e23b1 | TestListRunBuildsV5Query PASS |
| --per-page 文档默认值错误 | 74e23b1 | COMMANDS.md 已修正 |
| --sort/--direction 默认值归属不明 | 74e23b1 | COMMANDS.md 标注服务端默认 |
| 示例 $ 前缀风格不一致 | 74e23b1 | COMMANDS.md 已去掉 $ 前缀 |
| em dash 不一致 | 74e23b1 | COMMANDS.md 改为连字符 |
总体评审结论
- approved
- 评审执行主体:4 个独立 Claude 子 Agent(代码审查、安全审查、测试审查、文档审查)
- 风险等级:medium(新增只读命令,不影响现有功能)
- 第一轮发现 8 个问题,全部已在 commit 74e23b1 中修复并通过验证


langjitianya008
Jul 28 Comments:
Jul 28 Comments:
本地构建 + 全量UT + Precommit 结论
本地构建
go build -o ./gc ./cmd/gc → PASS
全量单元测试
go test ./... → ALL PASS (0 FAIL)
discussion list 测试详情(15 个用例全部通过):
- TestNewCmdList (6 subtests: org, search, json, paginate, sort, direction)
- TestListRunBuildsV5Query (含 Bearer header 断言 + sort/direction/search/per_page/page 参数验证)
- TestListRunJSONOutput
- TestListRunEmptyResultsJSON
- TestListRunEmptyResultsText
- TestListRunTextOutput
- TestListRunMissingOrg
- TestListRunInvalidLimit
- TestListRunInvalidPage
- TestListRunInvalidPerPage
- TestListRunPaginateEmptyResultsEmitsEmptyArray
- TestListRunPaginateWithPage
- TestListRunAPIError
- TestListRunPaginateMultiplePages
- TestTrimDiscussions (3 subtests)
Precommit 检查
go fmt ./... → PASS (无格式化差异)
go vet ./... → PASS (无静态分析问题)
覆盖率
- pkg/cmd/discussion/list: 命令层覆盖率达标
- 全仓库总覆盖率: 85.7%
二进制验证
$ gc discussion list --help → 输出正确,含所有 flags 和示例


问题描述
api/client.go中错误解码逻辑(检查Message/ErrorMessage/ErrorName/ErrorCodeName)被复制粘贴 6 次:RESTRawRESTGetTextPostFormPatchFormUploadAsset修改错误处理逻辑时容易遗漏某处,导致不一致。
修复方案
提取
decodeAPIError(respBody []byte, statusCode int, status string) error方法,统一错误解码逻辑。修改文件
api/client.go— 新增decodeAPIError,替换 6 处重复块api/client_test.go— 新增 7 个TestDecodeAPIError用例验证