Skip to content

rest/protocol: 把 droppedFields 写路径观测扩展到 bulk / GraphQL / client SDK(#3431 D2 波及面 follow-up) #3455

Description

@os-zhuang

背景

#3448(closes #3431)已接通单条写路径的字段剥离观测通道:updateData 转发引擎的 onFieldsDropped(readonly #2948 / readonlyWhen #3042),createData 通过 payload 差集 surface #3043 入口剥离;两者在协议结果上附带可选 droppedFields,REST 的 PATCH/POST 输出 X-ObjectStack-Dropped-Fields 响应头并在 body 保留结构化列表(状态码不变)。

本 issue 跟踪 #3431「设计待拍板 D2:波及面」里有意延后的剩余项。

待办

  • bulk update(updateManyData)—— 真实缺口。 它逐行 engine.update(object, record.data, { where: { id } }),未挂 onFieldsDropped,同一批 readonly/readonlyWhen 剥离照样静默发生。接法:逐行挂 collector,把掉的字段塞进该行结果;给 BatchOperationResultSchema(packages/spec/src/api/batch.zod.ts)加可选 droppedFields
    - 顺带:updateManyData 当前也不透传 context(独立的既存小问题,可一并修)。
  • bulk create(createManyData / batchData / insertManyData)。 走同一个 stripReadonlyForInsert 入口(安全/设计:静态 readonly 的 INSERT 豁免让审批/状态字段可在创建时被直接播种(比 #3003 少一步) #3043),逐行差集即可,per-row droppedFields
  • GraphQL mutation。 写 mutation 若走同一套协议 updateData/createData,运行时现在已自动带上 droppedFields;只差在 GraphQL schema 上暴露一个 typed 的 payload 字段。
  • @objectstack/client typed warnings。UpdateDataResult / CreateDataResult(packages/client/src/index.ts)加 droppedFields?: DroppedFieldsEvent[],让正规 body 通道有类型。
  • (低优先)CORS expose。X-ObjectStack-Dropped-Fields 加进 Hono 的 defaultExposeHeaders(packages/adapters/hono + packages/plugins/plugin-hono-server,注意"三处 CORS 站点 lockstep"),让跨域浏览器能读header。价值有限——body 的 droppedFields 本就是跨域安全通道。

设计注记(#3448 里得到的经验)

参考

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions