@tier0/sdk-v2 0.1.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +13 -11
  3. package/dist/cjs/app-identity-contract.generated.js.map +1 -1
  4. package/dist/cjs/capabilities.js.map +1 -1
  5. package/dist/cjs/cloud-server.js.map +1 -1
  6. package/dist/cjs/cloud-transport.d.ts +21 -0
  7. package/dist/cjs/cloud-transport.js +81 -1
  8. package/dist/cjs/cloud-transport.js.map +1 -1
  9. package/dist/cjs/controls.js.map +1 -1
  10. package/dist/cjs/data/bootstrap.d.ts +4 -0
  11. package/dist/cjs/data/bootstrap.js +15 -6
  12. package/dist/cjs/data/bootstrap.js.map +1 -1
  13. package/dist/cjs/data/call.d.ts +26 -9
  14. package/dist/cjs/data/call.js +179 -14
  15. package/dist/cjs/data/call.js.map +1 -1
  16. package/dist/cjs/data/client.d.ts +44 -2
  17. package/dist/cjs/data/client.js +87 -4
  18. package/dist/cjs/data/client.js.map +1 -1
  19. package/dist/cjs/data/collection.d.ts +151 -14
  20. package/dist/cjs/data/collection.js +213 -50
  21. package/dist/cjs/data/collection.js.map +1 -1
  22. package/dist/cjs/data/context.d.ts +4 -2
  23. package/dist/cjs/data/context.js +14 -3
  24. package/dist/cjs/data/context.js.map +1 -1
  25. package/dist/cjs/data/define.d.ts +9 -1
  26. package/dist/cjs/data/define.js.map +1 -1
  27. package/dist/cjs/data/error.d.ts +30 -12
  28. package/dist/cjs/data/error.js +61 -63
  29. package/dist/cjs/data/error.js.map +1 -1
  30. package/dist/cjs/data/index.d.ts +6 -3
  31. package/dist/cjs/data/index.js +7 -1
  32. package/dist/cjs/data/index.js.map +1 -1
  33. package/dist/cjs/data/schema.d.ts +7 -1
  34. package/dist/cjs/data/schema.js +54 -4
  35. package/dist/cjs/data/schema.js.map +1 -1
  36. package/dist/cjs/data/subscribe.d.ts +108 -0
  37. package/dist/cjs/data/subscribe.js +270 -0
  38. package/dist/cjs/data/subscribe.js.map +1 -0
  39. package/dist/cjs/mq/broker.js.map +1 -1
  40. package/dist/cjs/mq/client.js.map +1 -1
  41. package/dist/cjs/mq/index.js.map +1 -1
  42. package/dist/cjs/mq/types.js.map +1 -1
  43. package/dist/cjs/runtime-context.js.map +1 -1
  44. package/dist/cjs/runtime-env.js.map +1 -1
  45. package/dist/cjs/uns-v2/client.d.ts +90 -12
  46. package/dist/cjs/uns-v2/client.js +238 -63
  47. package/dist/cjs/uns-v2/client.js.map +1 -1
  48. package/dist/cjs/uns-v2/codec.js.map +1 -1
  49. package/dist/cjs/uns-v2/generated.d.ts +9619 -6923
  50. package/dist/cjs/uns-v2/generated.js +124 -119
  51. package/dist/cjs/uns-v2/generated.js.map +1 -1
  52. package/dist/cjs/uns-v2/index.js.map +1 -1
  53. package/dist/cjs/uns-v2/sse.d.ts +20 -0
  54. package/dist/cjs/uns-v2/sse.js +65 -0
  55. package/dist/cjs/uns-v2/sse.js.map +1 -0
  56. package/dist/esm/app-identity-contract.generated.js.map +1 -1
  57. package/dist/esm/capabilities.js.map +1 -1
  58. package/dist/esm/cloud-server.js.map +1 -1
  59. package/dist/esm/cloud-transport.d.ts +21 -0
  60. package/dist/esm/cloud-transport.js +81 -1
  61. package/dist/esm/cloud-transport.js.map +1 -1
  62. package/dist/esm/controls.js.map +1 -1
  63. package/dist/esm/data/bootstrap.d.ts +4 -0
  64. package/dist/esm/data/bootstrap.js +14 -5
  65. package/dist/esm/data/bootstrap.js.map +1 -1
  66. package/dist/esm/data/call.d.ts +26 -9
  67. package/dist/esm/data/call.js +177 -13
  68. package/dist/esm/data/call.js.map +1 -1
  69. package/dist/esm/data/client.d.ts +44 -2
  70. package/dist/esm/data/client.js +89 -7
  71. package/dist/esm/data/client.js.map +1 -1
  72. package/dist/esm/data/collection.d.ts +151 -14
  73. package/dist/esm/data/collection.js +212 -49
  74. package/dist/esm/data/collection.js.map +1 -1
  75. package/dist/esm/data/context.d.ts +4 -2
  76. package/dist/esm/data/context.js +13 -3
  77. package/dist/esm/data/context.js.map +1 -1
  78. package/dist/esm/data/define.d.ts +9 -1
  79. package/dist/esm/data/define.js.map +1 -1
  80. package/dist/esm/data/error.d.ts +30 -12
  81. package/dist/esm/data/error.js +61 -63
  82. package/dist/esm/data/error.js.map +1 -1
  83. package/dist/esm/data/index.d.ts +6 -3
  84. package/dist/esm/data/index.js +3 -1
  85. package/dist/esm/data/index.js.map +1 -1
  86. package/dist/esm/data/schema.d.ts +7 -1
  87. package/dist/esm/data/schema.js +54 -4
  88. package/dist/esm/data/schema.js.map +1 -1
  89. package/dist/esm/data/subscribe.d.ts +108 -0
  90. package/dist/esm/data/subscribe.js +265 -0
  91. package/dist/esm/data/subscribe.js.map +1 -0
  92. package/dist/esm/mq/broker.js.map +1 -1
  93. package/dist/esm/mq/client.js.map +1 -1
  94. package/dist/esm/mq/index.js.map +1 -1
  95. package/dist/esm/mq/types.js.map +1 -1
  96. package/dist/esm/runtime-context.js.map +1 -1
  97. package/dist/esm/runtime-env.js.map +1 -1
  98. package/dist/esm/uns-v2/client.d.ts +90 -12
  99. package/dist/esm/uns-v2/client.js +236 -63
  100. package/dist/esm/uns-v2/client.js.map +1 -1
  101. package/dist/esm/uns-v2/codec.js.map +1 -1
  102. package/dist/esm/uns-v2/generated.d.ts +9619 -6923
  103. package/dist/esm/uns-v2/generated.js +123 -118
  104. package/dist/esm/uns-v2/generated.js.map +1 -1
  105. package/dist/esm/uns-v2/index.js.map +1 -1
  106. package/dist/esm/uns-v2/sse.d.ts +20 -0
  107. package/dist/esm/uns-v2/sse.js +60 -0
  108. package/dist/esm/uns-v2/sse.js.map +1 -0
  109. package/package.json +29 -16
  110. package/skills/tier0-sdk-v2/SKILL.md +14 -14
  111. package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/SKILL.md +3 -2
  112. package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/references/consistency.md +3 -3
  113. package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/references/errors.md +23 -10
  114. package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/references/modeling.md +36 -0
  115. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +172 -0
  116. package/skills/{tier0-sdk-v2-mq → tier0-sdk-v2/tier0-sdk-v2-mq}/references/quickstart.md +1 -1
  117. package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/SKILL.md +3 -3
  118. package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/references/create.md +3 -6
  119. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/delete.md +39 -0
  120. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/state.md +36 -0
  121. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/update.md +80 -0
  122. package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/SKILL.md +6 -6
  123. package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/create.md +15 -14
  124. package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/deploy.md +11 -9
  125. package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/lifecycle.md +2 -1
  126. package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/update.md +5 -6
  127. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +55 -0
  128. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/create.md +57 -0
  129. package/skills/{tier0-sdk-v2-uns → tier0-sdk-v2/tier0-sdk-v2-uns}/references/data-workflows.md +3 -7
  130. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/delete.md +53 -0
  131. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/namespace.md +38 -0
  132. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/read.md +34 -0
  133. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/restore.md +39 -0
  134. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/update.md +62 -0
  135. package/skills/tier0-sdk-v2-data/references/read-write.md +0 -72
  136. package/skills/tier0-sdk-v2-source/references/delete.md +0 -47
  137. package/skills/tier0-sdk-v2-source/references/state.md +0 -37
  138. package/skills/tier0-sdk-v2-source/references/update.md +0 -61
  139. package/skills/tier0-sdk-v2-uns/SKILL.md +0 -53
  140. package/skills/tier0-sdk-v2-uns/references/create.md +0 -85
  141. package/skills/tier0-sdk-v2-uns/references/delete.md +0 -69
  142. package/skills/tier0-sdk-v2-uns/references/namespace.md +0 -75
  143. package/skills/tier0-sdk-v2-uns/references/read.md +0 -32
  144. package/skills/tier0-sdk-v2-uns/references/restore.md +0 -41
  145. package/skills/tier0-sdk-v2-uns/references/update.md +0 -86
  146. /package/skills/{tier0-sdk-v2-agent → tier0-sdk-v2/tier0-sdk-v2-agent}/SKILL.md +0 -0
  147. /package/skills/{tier0-sdk-v2-agent → tier0-sdk-v2/tier0-sdk-v2-agent}/references/results.md +0 -0
  148. /package/skills/{tier0-sdk-v2-controls → tier0-sdk-v2/tier0-sdk-v2-controls}/SKILL.md +0 -0
  149. /package/skills/{tier0-sdk-v2-data → tier0-sdk-v2/tier0-sdk-v2-data}/references/schema-evolution.md +0 -0
  150. /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/SKILL.md +0 -0
  151. /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/delete.md +0 -0
  152. /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/download.md +0 -0
  153. /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/multipart.md +0 -0
  154. /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/upload.md +0 -0
  155. /package/skills/{tier0-sdk-v2-files → tier0-sdk-v2/tier0-sdk-v2-files}/references/url.md +0 -0
  156. /package/skills/{tier0-sdk-v2-members → tier0-sdk-v2/tier0-sdk-v2-members}/SKILL.md +0 -0
  157. /package/skills/{tier0-sdk-v2-members → tier0-sdk-v2/tier0-sdk-v2-members}/references/app-members.md +0 -0
  158. /package/skills/{tier0-sdk-v2-members → tier0-sdk-v2/tier0-sdk-v2-members}/references/platform-members.md +0 -0
  159. /package/skills/{tier0-sdk-v2-mq → tier0-sdk-v2/tier0-sdk-v2-mq}/SKILL.md +0 -0
  160. /package/skills/{tier0-sdk-v2-notifications → tier0-sdk-v2/tier0-sdk-v2-notifications}/SKILL.md +0 -0
  161. /package/skills/{tier0-sdk-v2-notifications → tier0-sdk-v2/tier0-sdk-v2-notifications}/references/get.md +0 -0
  162. /package/skills/{tier0-sdk-v2-notifications → tier0-sdk-v2/tier0-sdk-v2-notifications}/references/send.md +0 -0
  163. /package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/references/changes.md +0 -0
  164. /package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/references/protocols.md +0 -0
  165. /package/skills/{tier0-sdk-v2-source → tier0-sdk-v2/tier0-sdk-v2-source}/references/read.md +0 -0
  166. /package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/delete.md +0 -0
  167. /package/skills/{tier0-sdk-v2-stream → tier0-sdk-v2/tier0-sdk-v2-stream}/references/read.md +0 -0
  168. /package/skills/{tier0-sdk-v2-system → tier0-sdk-v2/tier0-sdk-v2-system}/SKILL.md +0 -0
  169. /package/skills/{tier0-sdk-v2-system → tier0-sdk-v2/tier0-sdk-v2-system}/references/info.md +0 -0
  170. /package/skills/{tier0-sdk-v2-system → tier0-sdk-v2/tier0-sdk-v2-system}/references/whoami.md +0 -0
@@ -1,75 +0,0 @@
1
- # 目录和 Topic
2
-
3
- 目录组织资源,Topic 是集合的 records/fields 视图,不是旧架构 Metric。增删改查使用 client.uns 的 directory*/topic*。
4
-
5
- | 操作 | 目录 | Topic | 关键参数 |
6
- | --- | --- | --- | --- |
7
- | 创建 | directoryCreate | topicCreate | dryRun、items;名称必填,Topic 另需 viewMode |
8
- | 查询 | directoryList/Get | topicList/Get | list 的 page/size/search/archived;get 的 id |
9
- | 改元数据 | directoryUpdate | topicUpdate | items[].id、expectedRevision、name/description/parentId |
10
- | 归档 | directoryArchive | topicArchive | items[].id、expectedRevision |
11
- | 恢复 | directoryRestore | topicRestore | 归档对象的 id 和当前 revision |
12
- | 改字段映射 | — | topicBindingsUpdate | 按 Topic 字段绑定契约 |
13
-
14
- 创建/更新/归档/恢复均返回 Outcome;检查 committed、results[].error。目录/Topic 的删除语义是归档,不存在 directoryDelete/topicDelete。parentId=null 表示根;更新时省略则保持原位置。归档不能自行扩展成递归清空所有后代或关联集合。
15
-
16
- ## 创建目录和集合视图
17
-
18
- 以下函数独立调用;不要把创建目录后创建 Topic 说成一个原子事务。collectionId 先从集合查询取得。
19
-
20
- ```ts
21
- import { createClient, type Tier0Client } from '@tier0/sdk-v2';
22
-
23
- export async function createDirectory(
24
- id: string, name: string, intentKey: string, client: Tier0Client = createClient(),
25
- ) {
26
- const receipt = await client.uns.directoryCreate({
27
- dryRun: false, mode: 'sync', allowPartial: false, idempotencyKey: intentKey,
28
- items: [{ id, name, parentId: null }],
29
- });
30
- if (receipt.data.status !== 'committed' || receipt.data.results?.some(item => item.error)) {
31
- return { state: 'unconfirmed' as const, receipt };
32
- }
33
- return { state: 'committed' as const, receipt, current: (await client.uns.directoryGet({ id })).data };
34
- }
35
- export async function createRecordTopic(
36
- id: string, name: string, collectionId: string, parentId: string, intentKey: string,
37
- client: Tier0Client = createClient(),
38
- ) {
39
- const receipt = await client.uns.topicCreate({
40
- dryRun: false, mode: 'sync', allowPartial: false, idempotencyKey: intentKey,
41
- items: [{ id, name, viewMode: 'records', collectionId, parentId }],
42
- });
43
- if (receipt.data.status !== 'committed' || receipt.data.results?.some(item => item.error)) {
44
- return { state: 'unconfirmed' as const, receipt };
45
- }
46
- return { state: 'committed' as const, receipt, current: (await client.uns.topicGet({ id })).data };
47
- }
48
- ```
49
-
50
- ## 修改与归档 Topic
51
-
52
- ```ts
53
- import { createClient, type Tier0Client } from '@tier0/sdk-v2';
54
-
55
- export async function renameTopic(
56
- id: string, name: string, intentKey: string, client: Tier0Client = createClient(),
57
- ) {
58
- const current = await client.uns.topicGet({ id });
59
- return client.uns.topicUpdate({
60
- dryRun: false, mode: 'sync', allowPartial: false, idempotencyKey: intentKey,
61
- items: [{ id, name, expectedRevision: current.data.revision }],
62
- });
63
- }
64
- export async function archiveTopic(
65
- id: string, intentKey: string, client: Tier0Client = createClient(),
66
- ) {
67
- const current = await client.uns.topicGet({ id });
68
- return client.uns.topicArchive({
69
- dryRun: false, mode: 'sync', allowPartial: false, idempotencyKey: intentKey,
70
- items: [{ id, expectedRevision: current.data.revision }],
71
- });
72
- }
73
- ```
74
-
75
- 调用后检查 Outcome;修改后 get 核对名称,归档后 topicList({archived:true}) 遍历核对 ID。目录使用对应 directoryGet/Update/Archive;恢复从归档列表取得当前修订再 Restore,最后 get 核对。不要把 Topic 归档解释成底层 Record 已删除。
@@ -1,32 +0,0 @@
1
- # 查询集合与记录
2
-
3
- | 方法 | 必要输入 | 返回 data |
4
- | --- | --- | --- |
5
- | collectionList | 可选 page、size、search、archived | list、total、hasMore、nextPage |
6
- | collectionGet | id | kind、id、revision、data(Schema/元数据) |
7
- | collectionDescribe | collectionId | 集合结构和数据能力 |
8
- | recordFind | collectionId;可选 filter、sort、limit、cursor | items、pageInfo |
9
- | recordCount | collectionId;可选 filter | 计数结果 |
10
-
11
- 集合详情有两层 data:响应.data 是资源,响应.data.data 才是集合定义。记录行是 `{id,data,revision,…}`,过滤业务路径用 name,系统字段用 _id、_meta.revision;不要写 data.name。
12
-
13
- ```ts
14
- import { createClient, type Tier0Client } from '@tier0/sdk-v2';
15
-
16
- export async function readDevices(collectionId: string, client: Tier0Client = createClient()) {
17
- const collection = await client.uns.collectionGet({ id: collectionId });
18
- const records = await client.uns.recordFind({
19
- collectionId, filter: { enabled: true }, sort: [['name', 1]], limit: 20,
20
- });
21
- return { schema: collection.data.data.recordSchema, items: records.data.items,
22
- pageInfo: records.data.pageInfo };
23
- }
24
- export async function readDevice(collectionId: string, id: string, client: Tier0Client = createClient()) {
25
- const result = await client.uns.recordFind({ collectionId, filter: { _id: id }, limit: 1 });
26
- return result.data.items[0] ?? null;
27
- }
28
- ```
29
-
30
- recordFind 的 limit 为 1–200;按 pageInfo.hasMore/nextCursor 继续,完整循环见[数据工作流](data-workflows.md)。不要把第一页当全量,sort 是数组,不是 MongoDB 对象。
31
-
32
- App 使用 dataAppContext 精确选择授权 alias;Workspace 集成使用 dataDiscover/collectionList。数据访问授权不等于集合管理授权。网络/权限错误必须传播,不能返回空数组掩盖错误。
@@ -1,41 +0,0 @@
1
- # 恢复集合与记录
2
-
3
- | 方法 | 输入 | 返回 |
4
- | --- | --- | --- |
5
- | collectionRestore | dryRun、items[{id,expectedRevision}]、可选 mode/idempotencyKey | Outcome |
6
- | recordRestore | collectionId、ids(1–100)、可选 dryRun/idempotencyKey | restoredCount、restoredIds、status、replayed |
7
-
8
- 集合 ID 和修订从 collectionList({archived:true,…}) 的实际归档项取得;不要使用归档前的旧修订。
9
-
10
- ```ts
11
- import { createClient, type Tier0Client, type UnsV2Request } from '@tier0/sdk-v2';
12
-
13
- export async function restoreCollection(
14
- id: string, expectedRevision: NonNullable<UnsV2Request<'collectionRestore'>['items'][number]['expectedRevision']>,
15
- intentKey: string, client: Tier0Client = createClient(),
16
- ) {
17
- const receipt = await client.uns.collectionRestore({
18
- dryRun: false, mode: 'sync', allowPartial: false, idempotencyKey: intentKey,
19
- items: [{ id, expectedRevision }],
20
- });
21
- if (receipt.data.status !== 'committed' || receipt.data.results?.some(item => item.error)) {
22
- return { state: 'unconfirmed' as const, receipt };
23
- }
24
- return { state: 'committed' as const, receipt, current: (await client.uns.collectionGet({ id })).data };
25
- }
26
- export async function restoreDevice(
27
- collectionId: string, id: string, intentKey: string, client: Tier0Client = createClient(),
28
- ) {
29
- const receipt = await client.uns.recordRestore({
30
- collectionId, ids: [id], dryRun: false, idempotencyKey: intentKey,
31
- });
32
- if (receipt.data.status !== 'committed' || !receipt.data.restoredIds.includes(id)) {
33
- return { state: 'unconfirmed' as const, receipt };
34
- }
35
- const found = await client.uns.recordFind({ collectionId, filter: { _id: id }, limit: 1 });
36
- if (!found.data.items[0]) throw new Error('恢复有回执,读回未确认');
37
- return { state: 'committed' as const, receipt, current: found.data.items[0] };
38
- }
39
- ```
40
-
41
- Record 恢复重新校验当前 Schema 和有效唯一索引,冲突整批回滚;revision 递增。删除记录时关联 Sample 已物理删除,恢复不会重建历史。幂等键每个新意图独立,未知结果不要换键重试。
@@ -1,86 +0,0 @@
1
- # 修改记录、集合元数据和 Schema
2
-
3
- | 方法 | 关键输入 | 语义 |
4
- | --- | --- | --- |
5
- | recordUpdateOne | collectionId、filter、update、expectedRevision | 修改一个精确目标 |
6
- | collectionUpdate | dryRun、items[].id/name/description/parentId/expectedRevision | 修改元数据 |
7
- | collectionSchemaUpdate | dryRun、items[].id/recordSchema/expectedRevision | 替换 recordSchema |
8
-
9
- 写前读取 revision;冲突后重新比较并决策。省略 expectedRevision 可能覆盖最新状态,示例始终携带。
10
-
11
- ## 修改一条设备记录
12
-
13
- ```ts
14
- import { createClient, type Tier0Client } from '@tier0/sdk-v2';
15
-
16
- export async function renameDevice(
17
- collectionId: string, id: string, name: string, intentKey: string,
18
- client: Tier0Client = createClient(),
19
- ) {
20
- const found = await client.uns.recordFind({ collectionId, filter: { _id: id }, limit: 1 });
21
- const current = found.data.items[0];
22
- if (!current) throw new Error('记录不存在或不可见');
23
- const receipt = await client.uns.recordUpdateOne({
24
- collectionId, filter: { _id: id }, expectedRevision: current.revision,
25
- update: { $set: { name } }, upsert: false, dryRun: false, idempotencyKey: intentKey,
26
- });
27
- if (receipt.data.status !== 'committed' || String(receipt.data.matchedCount) !== '1') {
28
- return { state: 'unconfirmed' as const, receipt };
29
- }
30
- const after = await client.uns.recordFind({ collectionId, filter: { _id: id }, limit: 1 });
31
- if (after.data.items[0]?.data.name !== name) throw new Error('读回名称与目标不一致');
32
- return { state: 'committed' as const, receipt, current: after.data.items[0] };
33
- }
34
- ```
35
-
36
- data 返回 matchedCount、modifiedCount、status、replayed。modifiedCount=0 可能是值未变化;不能据此断言请求失败。upsert=false 避免不存在时意外创建。批量修改只在明确筛选范围和授权内使用。
37
-
38
- ## 修改集合名称
39
-
40
- ```ts
41
- import { createClient, type Tier0Client } from '@tier0/sdk-v2';
42
-
43
- export async function renameCollection(
44
- id: string, name: string, intentKey: string, client: Tier0Client = createClient(),
45
- ) {
46
- const { data: current } = await client.uns.collectionGet({ id });
47
- const receipt = await client.uns.collectionUpdate({
48
- dryRun: false, mode: 'sync', allowPartial: false, idempotencyKey: intentKey,
49
- items: [{ id, name, expectedRevision: current.revision }],
50
- });
51
- if (receipt.data.status !== 'committed' || receipt.data.results?.some(item => item.error)) {
52
- return { state: 'unconfirmed' as const, receipt };
53
- }
54
- return { state: 'committed' as const, receipt, current: (await client.uns.collectionGet({ id })).data };
55
- }
56
- ```
57
-
58
- ## 扩展 Schema:添加可选位置字段
59
-
60
- ```ts
61
- import { createClient, type Tier0Client, type Schema } from '@tier0/sdk-v2';
62
-
63
- export async function addDeviceLocation(
64
- id: string, intentKey: string, client: Tier0Client = createClient(),
65
- ) {
66
- const { data: current } = await client.uns.collectionGet({ id });
67
- if (current.data.recordSchema.type !== 'object') throw new Error('此示例仅支持对象 Schema');
68
- if (current.data.recordSchema.properties?.location) throw new Error('location 已定义,应先比较原 Schema');
69
- const recordSchema: Schema = {
70
- ...current.data.recordSchema,
71
- properties: { ...current.data.recordSchema.properties, location: { type: 'string' } },
72
- };
73
- const item = { id, expectedRevision: current.revision, recordSchema };
74
- const preview = await client.uns.collectionSchemaUpdate({ dryRun: true, mode: 'sync', items: [item] });
75
- if (preview.data.status !== 'validated') throw new Error('Schema 预检未通过');
76
- const receipt = await client.uns.collectionSchemaUpdate({
77
- dryRun: false, mode: 'sync', allowPartial: false, items: [item], idempotencyKey: intentKey,
78
- });
79
- if (receipt.data.status !== 'committed' || receipt.data.results?.some(item => item.error)) {
80
- return { state: 'unconfirmed' as const, receipt };
81
- }
82
- return { state: 'committed' as const, receipt, current: (await client.uns.collectionGet({ id })).data };
83
- }
84
- ```
85
-
86
- recordSchema 是完整替换,不是 merge patch,也不自动迁移记录。新 Schema 必须接受已有数据并满足相关引用约束。sampleSchema/indexes 省略时保留;不要为了添加一个字段顺手清空它们。收紧类型、增加必填或删除采样 Schema 需额外评估已有数据。