Skip to content

feat(client): 类型化 data.batchTransaction() —— master-detail 保存统一走原子跨对象批量(#1604 / ADR-0034 item 4)#3271

Merged
os-zhuang merged 1 commit into
mainfrom
claude/master-detail-atomic-transaction-tmz06f
Jul 19, 2026
Merged

feat(client): 类型化 data.batchTransaction() —— master-detail 保存统一走原子跨对象批量(#1604 / ADR-0034 item 4)#3271
os-zhuang merged 1 commit into
mainfrom
claude/master-detail-atomic-transaction-tmz06f

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

背景

承接 #1604 与 ADR-0034 item 4:服务端原子跨对象批量端点(POST {basePath}/batch,单引擎事务、{ $ref: <opIndex> } 批内父引用、逐对象 API 曝光鉴权)已落地,但 @objectstack/client SDK 没有对应的类型化方法——objectui 的 masterDetailTx 适配器要走原子路径只能手写 fetch。本 PR 补上 framework 侧缺口,让原子 batchTransaction 成为 master-detail 保存的一等公民 SDK API。

改动

  • packages/client/src/index.ts:新增 client.data.batchTransaction(operations) 与环境作用域镜像 client.project(id).data.batchTransaction(operations)
    • 复用并 re-export spec 契约类型 CrossObjectBatchOperation/Request/Response(@objectstack/spec/api)。
    • 恒原子、不暴露 atomic 参数——类型上无法表达非原子请求(服务端对 atomic:false 也会 400 BATCH_NOT_ATOMIC)。非原子 per-object 批量保留在 data.batch()/createMany/updateMany;best-effort 回退只能隔离在调用方(ObjectUI masterDetailTx)适配器里,SDK 不承载——这是"非原子回退隔离进适配器"的类型化表达。
    • URL 推导:端点按构造挂在 data 前缀的父级(${basePath}/batch),客户端从 getRoute('data') 去末段推导,兼容 discovery 覆写的自定义路由;不给 ApiRoutesSchema 加 key(避免 3+ 个 discovery 生产方同步、declared-but-unpopulated 路由)。
  • 测试:
    • 单测 6 例(client.test.ts):URL/payload、$ref 透传、裸/信封双响应形态解包、discovery 路由推导、错误整形(code/httpStatus)、scoped 镜像。
    • 端到端 4 例(新文件 client.batch-transaction.test.ts,LiteKernel + Hono 真实服务):父+子 $ref 落库且 FK 等于父 id、scoped 路由、BATCH_UNRESOLVED_REF 全链路错误映射、atomic:false → 400 BATCH_NOT_ATOMIC 契约 pin。文件头注明 InMemoryDriver 事务为 passthrough,回滚原子性由 engine-ambient-transaction.test.ts / rest-batch-endpoint.test.ts 覆盖。
  • 文档:content/docs/api/client-sdk.mdx 增加原子跨对象批量示例并互链 http-protocol.mdx Batch Operations;ADR-0034 §4 补状态注(framework 侧完成)。
  • Changeset:@objectstack/client minor。

验证

  • pnpm --filter @objectstack/client build ✅(DTS 通过)
  • pnpm --filter @objectstack/client test ✅ 4 files / 109 tests(含新增 10 例)
  • pnpm --filter @objectstack/rest test ✅ 19 files / 323 tests(相邻回归)

跨仓库 follow-up(不在本 PR)

objectui 仓库:masterDetailTx / data-objectstack 适配器改为调用 client.data.batchTransaction(以 $ref 组 operations),删除客户端 best-effort 清理;非原子顺序回退(面向无该端点的旧服务器,按 error.httpStatus === 404 特性探测)只保留在该适配器内部。

注:任务标题所引 #2679 在 framework 为不相关 issue(userFilters),应为 objectui 侧编号;本 PR 按 #1604 / ADR-0034 item 4 的实质内容执行。

🤖 Generated with Claude Code

https://claude.ai/code/session_01QCrTB7b5qFX2yyHJEGB5xa


Generated by Claude Code

…ch SDK surface (#1604 / ADR-0034 item 4)

master-detail 保存统一走原子 batchTransaction:给 @objectstack/client 增加
data.batchTransaction(operations)(含环境作用域镜像),类型化封装
POST {basePath}/batch 全有或全无跨对象事务端点,支持 { $ref: <opIndex> }
批内父引用。方法恒原子、不暴露 atomic 参数——非原子 per-object 批量保留在
data.batch()/createMany/updateMany,best-effort 回退只能隔离在调用方
(ObjectUI masterDetailTx)适配器里,SDK 不承载。

- 复用并 re-export spec 契约类型 CrossObjectBatchOperation/Request/Response
- 单测 6 例(URL/payload、$ref 透传、双响应形态解包、discovery 路由推导、
  错误整形、scoped 镜像)+ 端到端 4 例(client→hono→rest→engine 全链路,
  含 BATCH_UNRESOLVED_REF 错误映射与 BATCH_NOT_ATOMIC 契约 pin)
- 文档:client-sdk.mdx / http-protocol.mdx 互链;ADR-0034 §4 补状态注
  (framework 侧完成,objectui 重指 masterDetailTx 为跨仓库 follow-up)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QCrTB7b5qFX2yyHJEGB5xa
@vercel

vercel Bot commented Jul 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 19, 2026 11:58am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation size/m tests tooling labels Jul 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/client.

12 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/skills-reference.mdx (via packages/client)
  • content/docs/api/client-sdk.mdx (via @objectstack/client)
  • content/docs/api/data-flow.mdx (via @objectstack/client)
  • content/docs/api/environment-routing.mdx (via @objectstack/client)
  • content/docs/api/error-catalog.mdx (via @objectstack/client)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/client)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/client)
  • content/docs/kernel/runtime-services/index.mdx (via packages/client)
  • content/docs/permissions/authentication.mdx (via @objectstack/client)
  • content/docs/plugins/packages.mdx (via @objectstack/client)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/client)
  • content/docs/releases/implementation-status.mdx (via @objectstack/client)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang marked this pull request as ready for review July 19, 2026 16:10
@os-zhuang
os-zhuang merged commit 9ccd1e9 into main Jul 19, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/master-detail-atomic-transaction-tmz06f branch July 19, 2026 16:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants