Merged
refactor(api): extract decodeAPIError helper, eliminate 6x error decoding duplication #361
refactor(api): extract decodeAPIError helper, eliminate 6x error decoding duplication #361
Merged
luojiyinAdd on Jul 8
Jul 8

变更内容

  • 新增 decodeAPIError(respBody, statusCode, status) error 方法,统一 API 错误解码逻辑
  • 替换 6 个方法中的重复错误解码块:REST、RawREST、GetText、PostForm、PatchForm、UploadAsset
  • 新增 7 个单元测试覆盖所有错误字段组合

问题

api/client.go 中错误解码逻辑(检查 Message/ErrorMessage/ErrorName/ErrorCodeName)被复制粘贴 6 次,修改时容易遗漏。

修改文件

文件 改动
api/client.go +decodeAPIError 方法,替换 6 处重复块
api/client_test.go +7 个 TestDecodeAPIError 用例

测试

  • go build ./... ✅
  • go test ./api/... (225 passed) ✅
  • go vet ./api/... ✅

close #421

likedislike
Pull Request has been successfully merged by aflyingto.
(Thank you for luojiyin's contribution.)
Lluojiyin
Jul 8 Created pull request, commit 600629fd
Lluojiyin
Jul 8 Modify description of pull request
Lluojiyin
Jul 8 Pre merge succeeded (commit_id: 4f57dfafe84c9249dc25a57e59e8bed0d2081979)
Lluojiyin
Jul 8 Pushed 7 commits:600629fd-6 commits from branch main,7b4e7293-Merge branch 'main' into refactor/decode-api-error
Lluojiyin
Jul 8 Pre merge succeeded (commit_id: 4ffcb588fee874071eb561ab36f94bce585e87e0)
Lluojiyin
Jul 8 Pre merge succeeded (commit_id: a35e2ff92b5f2d9d6ed975affc725870d9daf0bf)
Lluojiyin
Jul 8 Pushed 6 commits:fa52e575-4 commits from branch main,79eb6e22-Merge branch 'main' into refactor/decode-api-error,7aa15a49-Merge remote-tracking branch 'origin/main' into refactor/decode-api-error
Lluojiyin
Jul 8 Pre merge succeeded (commit_id: e1a64e8cf9cb84480a95a28f709686886c2bc6bc)
aflyingtoCollaborators
Jul 27 Comments:

独立评审报告

  • 评审主体类型: 独立 AI 评审代理
  • 评审主体标识: opencode (glm-5.2),与作者 luojiyin87 为不同执行主体
  • 评审范围: PR !361 refactor(api): extract decodeAPIError helper(head 7aa15a4,base e00d90a)
  • 关联 issue: #421(提取 decodeAPIError,消除 6 处错误解码重复)
  • 评审方法: 不信任原则 — 独立 fetch + 模拟 merge + 本地验证 + CI
  • 结论: APPROVED(0 P0 / 1 P1 / 3 P2),可 merge,P1 通过 merge 后手动关闭 issue 解决

代码层面核验

  • decodeAPIError(respBody, statusCode, status) 提取正确,逻辑与原 6 处一致(json.Unmarshal + 4 字段检查 + StatusCode 设置 + fallback APIError{StatusCode, Message:status})
  • 替换 6 处全部核验:REST、RawREST、GetText、PostForm、PatchForm、UploadAsset(每处从 ~6 行块替换为单行 return decodeAPIError(...))
  • 无行为变更:函数签名、返回值类型、错误语义与原实现完全一致

本地验证(模拟 merge 到 main 后)

$ go test ./api/... -run TestDecodeAPIError -count=1 -v
  TestDecodeAPIError/message_field                  PASS
  TestDecodeAPIError/error_message_field            PASS
  TestDecodeAPIError/error_field                    PASS
  TestDecodeAPIError/error_code_name_field          PASS
  TestDecodeAPIError/non-JSON_body_returns_generic_error  PASS
  TestDecodeAPIError/JSON_but_no_error_fields      PASS
  TestDecodeAPIError/multiple_error_fields          PASS
$ go test ./api/... -count=1                          → PASS
$ go vet ./api/...                                    → clean
$ gofmt -l api/                                       → clean

CI 验证

GitHub Actions run ID: 30245860980(github.com/gitcode-cli/cli CI mirror,评审者为 fork PR 触发)

  • conclusion: success(8 Job 全绿)

P1 阻塞(影响 issue 状态机收敛,非代码问题)

  1. P1 PR body close 关键字格式不对 — body 用 close [#421](https://gitcode.com/.../issues/421)(小写 close + markdown 链接 [#421](url)),非规范要求的 Closes #421(裸 #NNN)。GitCode 对 markdown 链接文本里的 #NNN 不触发自动关闭,merge 后 issue #421 不会自动关闭。
    • 处置:评审者 merge 后手动关闭 issue #421(gc issue close 421 --yes),或作者在 merge 前将 body 改为 Closes #421

P2 非阻塞

  1. P2 风险自检不准确 — 作者自检称 risk 未明示但 Test Plan 段无风险分级;classify-change-risk.py --base origin/main 输出 risk=medium(client.go + client_test.go runtime path)。PR 标签缺失,需补 risk/medium。
  2. P2 PR 无任何标签 — 未进状态机。需补:type/refactor、scope/api、risk/medium、status/ready-for-review。
  3. P2 PR body 非完整自检 — body 是摘要式(变更内容/问题/修改文件/测试),缺规范要求的作者主体标识/根因/未覆盖项/安全审查/文档同步段。issue #421 也无标签。

总结

纯重构无行为变更,代码层面 APPROVED(decodeAPIError 提取正确 + 7 测试覆盖 + CI 绿 + vet/fmt clean)。P1 close 格式通过 merge 后手动关 issue 解决。可进入 merge。

merge 后:

  1. 手动关闭 issue #421(close 格式不触发自动关闭)
  2. 清理 GitHub 镜像仓临时 PR #78 与远程分支 refactor/decode-api-error
  3. 注意:!364 也改 api/client.go,merge !361 后 !364 需 rebase 到最新 main
likedislike
AaflyingtoCollaborators
Jul 27 Added label: risk/mediumscope/apistatus/ready-for-reviewtype/refactor
AaflyingtoCollaborators
Jul 27 Closed associated issue
AaflyingtoCollaborators
Jul 27 Merged pull request, merge node SHA: d15755c34f7d44c6b8d66499664d5d75b1fba700