Closed
refactor(api): 提取 decodeAPIError 方法,消除 6 处错误解码重复 #421
luojiyinAdd on  Jul 8Closed at  Jul 27
luojiyin
Jul 8 Create

问题描述

api/client.go 中错误解码逻辑(检查 Message/ErrorMessage/ErrorName/ErrorCodeName)被复制粘贴 6 次:

方法 行号
REST 119-126
RawREST 179-186
GetText 245-252
PostForm 290-297
PatchForm 355-362
UploadAsset 439-446

修改错误处理逻辑时容易遗漏某处,导致不一致。

修复方案

提取 decodeAPIError(respBody []byte, statusCode int, status string) error 方法,统一错误解码逻辑。

修改文件

  • api/client.go — 新增 decodeAPIError,替换 6 处重复块
  • api/client_test.go — 新增 7 个 TestDecodeAPIError 用例

验证

likedislike
AaflyingtoCollaborators
Jul 25 Associated milestone: M6: Architecture Refactor
AaflyingtoCollaborators
Jul 27 Close issue
langjitianya008Collaborators
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%
likedislike
langjitianya008Collaborators
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 中修复并通过验证
likedislike
langjitianya008Collaborators
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 和示例
likedislike