Skip to content

GET /ui/view/:object/:type 发的是 {list} / {form},spec 的 GetViewResponseSchema 声明的是 {object, view} —— 同一路由声明与实际两种形状(#5563 同族) #5948

Description

@baozhoutao

#5545(client SDK 补返回类型注解)里测绘到:ObjectStackClient.meta.getViewmeta.* 上第 7 处真正产出 unknown 的方法,但不能按 spec 补注解 —— 因为生产端和 spec 对这条路由的响应形状不一致。这与 #5563 是同一族缺陷,只是换了一条路由。

事实(基线 origin/main @ a6b3ee7a1)

spec 声明(packages/spec/src/api/protocol.zod.ts:702):

export const GetViewResponseSchema = lazySchema(() => z.object({
  object: z.string().describe('Object name'),
  view: ViewSchema.describe('View definition'),
}));

REST 路由(packages/rest/src/rest-server.ts:4861)把协议层返回值原样发出:

path: `${uiPath}/view/:object/:type`,
...
const view = await p.getUiView({ object: , type:  });
res.json(view);

生产端(packages/metadata-protocol/src/protocol.ts:4046 getUiView)两条 return 都不是那个形状:

  • :4070return { list: { type: 'grid', object, label, columns, sort, searchableFields } };
  • :4107return { form: { type: 'simple', object, label, sections } };

即:实际是 { list: … } / { form: … }(按请求的 type 二选一),spec 声明的是 { object, view }。没有 object 顶层键,也没有 view 键。

后果:packages/client/src/index.tsmeta.getView(现 :676)只能保持 unwrapResponse(res) 无泛型 → 调用方拿 unknown。标 GetViewResponse 会撒谎(告诉调用方去读一个不存在的 .view),标 {list}|{form} 则是在 SDK 侧单方面推翻 spec 声明 —— 这正是 #5563 定案前 getItem 的处境。所以 #5545 的 PR 没有getView,把它留在这里。

补充一个第三种形状的痕迹:packages/client/src/client.test.ts 现有的 getView 用例(#3611 那条)替身发的是 { success: true, data: { type: 'list' } } —— 只钉 URL 不读载荷,所以形状分裂一直没被任何断言碰到。

处置(待分诊定方向)

两个方向互斥,择一:

按 contract-first,方向应由「哪个形状是长期正确的」决定,而不是由哪边改动小决定 —— 这条留给维护者/分诊。

关联:#5545(测绘出处)、#5563(同族:GET /meta/:type/:name 的形状分裂,已定案收敛)、#5745(同族:save 响应声明是真实 body 的真子集,已补齐)。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions