feat(FB-06): OpenAPI 驱动的前后端 API 契约对齐 + CI 接入#2
FB-06 是 foundation-setup 留下的唯一 OPEN 反馈:前后端 API 路径契约没有自动化校验,只能等端到端或人工检查才发现不一致。本轮落地闭环方案。
后端 SpringDoc → OpenApiExportTest → backend/target/openapi.json ↓ openapi-typescript → frontend/src/api/generated/api-types.ts ↓ openapi-fetch → typed apiClient(编译期类型约束) ↓ check-api-contract.mjs → 扫描手写 /api/v1/* 字面量兜底 ↓ .cnb.yml 阻塞合并
refactor(payment)
fix(frontend)
inventorys
inventory
test(backend)
OpenApiExportTest
target/openapi.json
feat(frontend)
apiClient
check-api-contract.mjs
chore(ci)
.cnb.yml
docs(framework)
api-docs/SKILL.md §前后端契约对齐
本次实现首次运行契约校验脚本就抓到 2 处真实问题(而非构造示例):
frontend/src/api/modules/inventory.ts
/api/v1/inventorys/*
frontend/src/api/modules/payment.ts
stores/payment.ts
views/payment/*
/api/v1/payments
这 2 个问题在原先的工作流里必须等到 E2E 测试或真机运行才会暴露。现在在 CI 的静态阶段就阻塞合并。
npm run gen:api
mvn test
mvn test-compile
node --check check-api-contract.mjs
.codebuddy/
base 选择 feature/foundation-setup 而非 main:因为 foundation-setup 的 PR #1 还没合入 main,这个 PR 需要基于它才能看到代码。PR #1 合入 main 后,此 PR 的 base 可改为 main,或直接 rebase 后一起合。
FB-06 关闭后,未完成工作清单只剩 B13/B14/B15 三个中低优的业务层修复。
背景
FB-06 是 foundation-setup 留下的唯一 OPEN 反馈:前后端 API 路径契约没有自动化校验,只能等端到端或人工检查才发现不一致。本轮落地闭环方案。
架构
6 个 commit
refactor(payment)fix(frontend)inventorys→inventory(FB-01 修复后前端未同步,同样被抓出)test(backend)OpenApiExportTest:mvn test 自动导出target/openapi.jsonfeat(frontend)apiClient+check-api-contract.mjs校验脚本chore(ci).cnb.yml:push 6 阶段 + PR 完整 verify,对齐 R5 §五 真实编译门禁docs(framework)api-docs/SKILL.md §前后端契约对齐,FB-06 状态改为 RESOLVED立竿见影的收益
本次实现首次运行契约校验脚本就抓到 2 处真实问题(而非构造示例):
frontend/src/api/modules/inventory.ts使用/api/v1/inventorys/*(FB-01 修复复数后前端没同步)frontend/src/api/modules/payment.ts+stores/payment.ts+views/payment/*全是 scaffold 死代码(后端没实现/api/v1/paymentsCRUD)这 2 个问题在原先的工作流里必须等到 E2E 测试或真机运行才会暴露。现在在 CI 的静态阶段就阻塞合并。
方案特点
check-api-contract.mjs只用 Node 标准库,可在任何 CI 环境跑npm run gen:api就能同步最新契约,typed apiClient 路径改错 TS 编译立刻报错mvn test已经会跑OpenApiExportTest,契约 JSON 自动产出,无需额外 plugin验证
mvn test-compileBUILD SUCCESSnode --check check-api-contract.mjs语法通过.codebuddy/lint 0 错误合并目标
base 选择 feature/foundation-setup 而非 main:因为 foundation-setup 的 PR #1 还没合入 main,这个 PR 需要基于它才能看到代码。PR #1 合入 main 后,此 PR 的 base 可改为 main,或直接 rebase 后一起合。
下一轮
FB-06 关闭后,未完成工作清单只剩 B13/B14/B15 三个中低优的业务层修复。