Skip to content

feat(web): generate and consume API types from OpenAPI - #256

Merged
liujuanjuan1984 merged 6 commits into
mainfrom
agent/226-openapi-types
Aug 7, 2026
Merged

feat(web): generate and consume API types from OpenAPI#256
liujuanjuan1984 merged 6 commits into
mainfrom
agent/226-openapi-types

Conversation

@liujuanjuan1984

@liujuanjuan1984 liujuanjuan1984 commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

背景

从 OpenAPI 契约生成并消费 TypeScript 类型,收紧 Web 网络边界与后端响应契约的一致性。#255 已合并,本 PR 直接消费其定义的响应契约所生成的类型。

Closes #226

实现

  • 采用 openapi-typescript 7.13:只生成类型,支持 OpenAPI 3,不引入新的请求 runtime、重试或状态管理。
  • 新增 npm run api:generate,直接导入本地 FastAPI app,确定性导出 web/openapi.json 并生成 web/src/services/api/generated/schema.ts
  • 契约文件策略:web/openapi.json 是生成的中间产物,加入 .gitignore 不入库(本地运行 npm run api:generate 即可生成查看);入库的只有 schema.ts,两者都禁止手工编辑。
  • 生成过程不启动服务器、不连接数据库,也不依赖个人配置;当前覆盖 77 条路径、119 个 operation、157 个 schema。
  • 新增 npm run api:check drift 检查:重新生成契约后对比入库的 schema.ts,过期即失败;已接入 scripts/web_validate.sh
  • web/src/services/api/ 的主要资源模块迁移到生成的 request/response 类型;保留现有 fetch runtime 和缓存行为。
  • 通过 PickOmit、交叉类型和显式 adapter 隔离传输 DTO 与前端 view model。
  • 更新 Web 开发文档,说明生成时机、命令和提交要求。

有意保留的手写类型

以下类型属于前端 UI/domain,而不是后端传输契约:

  • 查询筛选与规范化参数,例如 task selector、task list、habit action 和 timelog advanced search;
  • 表单草稿和前端批量操作组合,例如 anniversary 草稿、vision experience rate 和 note batch/bulk 模型;
  • UI 聚合与投影,例如 note stats、分页 view model 和 error bus;
  • 当前没有对应后端 endpoint 的前端本地编排模型。

迁移中显式化的契约边界

  • planned event 的 extra_data 是前端草稿字段,后端 create/update 不接收;adapter 在发送前明确剥离。
  • task 的 person_ids 不属于当前 TaskCreate/TaskUpdate;adapter 在传输边界明确剥离。
  • timelog 的前端扩展字段与关联 note 是 view model;发送 payload 时只保留生成契约允许的字段。
  • tag selector/full response、person compact response 等不同响应形状现在分别由生成类型约束。

本 PR 不改变 API payload、endpoint、缓存 key 或请求 runtime。

CI 修复与验证

Base automatically changed from agent/223-response-contracts to main August 7, 2026 03:41
@liujuanjuan1984 liujuanjuan1984 changed the title Web:从 OpenAPI 生成并消费 API 类型 feat(web): generate and consume API types from OpenAPI Aug 7, 2026
@liujuanjuan1984
liujuanjuan1984 marked this pull request as ready for review August 7, 2026 04:47
@liujuanjuan1984
liujuanjuan1984 merged commit 890b47e into main Aug 7, 2026
6 checks passed
@liujuanjuan1984
liujuanjuan1984 deleted the agent/226-openapi-types branch August 7, 2026 04:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

从 OpenAPI 生成并消费 Web API TypeScript 类型

1 participant