@turinhub/tale-js-sdk 1.3.0 → 2.1.0

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 (56) hide show
  1. package/README.md +90 -13
  2. package/dist/acl/index.d.ts +62 -49
  3. package/dist/acl/index.js +262 -67
  4. package/dist/acl/types.d.ts +63 -98
  5. package/dist/app/index.d.ts +10 -0
  6. package/dist/app/index.js +198 -0
  7. package/dist/app/types.d.ts +101 -0
  8. package/dist/app/types.js +1 -0
  9. package/dist/app-token/index.d.ts +7 -0
  10. package/dist/app-token/index.js +58 -0
  11. package/dist/app-token/types.d.ts +25 -0
  12. package/dist/app-token/types.js +1 -0
  13. package/dist/attachment/index.d.ts +17 -0
  14. package/dist/attachment/index.js +247 -0
  15. package/dist/attachment/types.d.ts +82 -0
  16. package/dist/attachment/types.js +1 -0
  17. package/dist/attachment-type/index.d.ts +15 -0
  18. package/dist/attachment-type/index.js +203 -0
  19. package/dist/attachment-type/types.d.ts +60 -0
  20. package/dist/attachment-type/types.js +1 -0
  21. package/dist/auth/index.d.ts +21 -21
  22. package/dist/auth/index.js +66 -66
  23. package/dist/auth/types.d.ts +51 -51
  24. package/dist/cms/file.d.ts +88 -70
  25. package/dist/cms/file.js +228 -77
  26. package/dist/cms/folder.d.ts +9 -9
  27. package/dist/cms/folder.js +18 -18
  28. package/dist/cms/types.d.ts +58 -38
  29. package/dist/common/http.d.ts +17 -0
  30. package/dist/common/http.js +141 -0
  31. package/dist/common/types.d.ts +58 -63
  32. package/dist/index.d.ts +6 -1
  33. package/dist/index.js +4 -0
  34. package/dist/rbac/index.d.ts +37 -42
  35. package/dist/rbac/index.js +96 -98
  36. package/dist/rbac/types.d.ts +38 -40
  37. package/dist/status.d.ts +11 -11
  38. package/dist/status.js +30 -3
  39. package/dist/task/index.d.ts +15 -147
  40. package/dist/task/index.js +170 -161
  41. package/dist/task/types.d.ts +57 -81
  42. package/dist/task-type/index.d.ts +7 -7
  43. package/dist/task-type/index.js +12 -12
  44. package/dist/task-type/types.d.ts +18 -34
  45. package/dist/token.d.ts +3 -3
  46. package/dist/token.js +4 -4
  47. package/dist/user/index.d.ts +28 -29
  48. package/dist/user/index.js +69 -74
  49. package/dist/user/types.d.ts +32 -33
  50. package/dist/user-attribute/index.d.ts +4 -7
  51. package/dist/user-attribute/index.js +19 -22
  52. package/dist/user-attribute/types.d.ts +29 -29
  53. package/dist/user-group/index.d.ts +4 -223
  54. package/dist/user-group/index.js +61 -479
  55. package/dist/user-group/types.d.ts +1 -1
  56. package/package.json +1 -1
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @tale/client
1
+ # @turinhub/tale-js-sdk
2
2
 
3
3
  官方 TypeScript SDK,用于与 Tale 后端服务集成与交互。
4
4
 
@@ -11,11 +11,11 @@
11
11
  支持 npm、pnpm、yarn 安装:
12
12
 
13
13
  ```bash
14
- npm install @tale/client
14
+ npm install @turinhub/tale-js-sdk
15
15
  # 或
16
- pnpm add @tale/client
16
+ pnpm add @turinhub/tale-js-sdk
17
17
  # 或
18
- yarn add @tale/client
18
+ yarn add @turinhub/tale-js-sdk
19
19
  ```
20
20
 
21
21
  ## 快速开始
@@ -23,16 +23,90 @@ yarn add @tale/client
23
23
  本 SDK 采用 ESM(`type: module`)。在 TypeScript 或现代 Node.js/前端环境中可直接导入:
24
24
 
25
25
  ```ts
26
- // 具体导出以实际 SDK 为准(后续文档将补充)
27
- import * as Tale from "@tale/client";
26
+ import {
27
+ getAppToken,
28
+ getCurrentUser,
29
+ listAppsByOrg,
30
+ listFiles,
31
+ } from "@turinhub/tale-js-sdk";
32
+
33
+ const appToken = await getAppToken({
34
+ baseUrl: "https://api.tale.example",
35
+ appKey: process.env.TALE_APP_KEY,
36
+ appSecret: process.env.TALE_APP_SECRET,
37
+ });
38
+
39
+ const files = await listFiles({
40
+ baseUrl: "https://api.tale.example",
41
+ appToken,
42
+ folderId: "folder-id",
43
+ });
44
+
45
+ const currentUser = await getCurrentUser({
46
+ baseUrl: "https://api.tale.example",
47
+ taleToken: "tale-user-token",
48
+ });
49
+
50
+ const apps = await listAppsByOrg(currentUser.app.orgId, {
51
+ baseUrl: "https://api.tale.example",
52
+ taleToken: "tale-user-token",
53
+ });
54
+ ```
55
+
56
+ ## 认证与 Token
57
+
58
+ SDK 中常见的鉴权选项都通过 `x-t-token` 发送到 Tale 后端:
59
+
60
+ - `appToken`:应用作用域 Token,适用于 CMS、RBAC、ACL、Task、Attachment 等应用内资源 API。
61
+ - `taleToken`:Tale 用户 Token,适用于平台级 App 管理 API,例如获取当前用户、应用列表、应用详情、App Secret,以及按 App Key 换发 App Token。
62
+ - `baseUrl`:Tale 后端服务基础 URL;未显式传入时会读取环境变量。
63
+
64
+ 服务端可使用 `getAppToken()` 通过 `TALE_APP_KEY` 与 `TALE_APP_SECRET` 获取应用 Token。浏览器端的 Cookie、缓存、自动续期和多应用切换策略不由 SDK 核心管理,调用方可基于 `issueAppToken()` 自行封装。
65
+
66
+ ## App 与 App Token API
28
67
 
29
- // 示例:初始化客户端并调用 API(占位示例)
30
- // const client = Tale.createClient({ baseUrl: 'https://api.tale.example' })
31
- // const result = await client.health()
32
- // console.log(result)
68
+ AppTS 模块提供平台应用相关方法:
69
+
70
+ ```ts
71
+ import {
72
+ getCurrentUser,
73
+ listAppsByOrg,
74
+ createApp,
75
+ getAppDetail,
76
+ updateApp,
77
+ } from "@turinhub/tale-js-sdk";
78
+ ```
79
+
80
+ AppTokenTS 模块提供 App Token 相关接口封装:
81
+
82
+ ```ts
83
+ import {
84
+ listAppTokens,
85
+ getAppSecret,
86
+ issueAppToken,
87
+ } from "@turinhub/tale-js-sdk";
88
+
89
+ const page = await listAppTokens({
90
+ baseUrl: "https://api.tale.example",
91
+ appToken: "app-token",
92
+ page: 0,
93
+ size: 20,
94
+ isValid: true,
95
+ });
96
+
97
+ const secret = await getAppSecret("oa_xxx", {
98
+ baseUrl: "https://api.tale.example",
99
+ taleToken: "tale-user-token",
100
+ });
101
+
102
+ const issued = await issueAppToken({
103
+ baseUrl: "https://api.tale.example",
104
+ taleToken: "tale-user-token",
105
+ appKey: "oa_xxx",
106
+ });
33
107
  ```
34
108
 
35
- > 提示:由于 SDK 仍在迭代中,具体 API 名称与调用方式请以后续文档或源码为准。
109
+ 公开类型、入参和响应字段保持 camelCase。SDK 会处理 Java 后端可能返回的 `{ code, msg, data }` envelope 与直接 payload,但不再兼容历史 snake_case 响应字段。
36
110
 
37
111
  ## 开发与测试
38
112
 
@@ -40,7 +114,10 @@ import * as Tale from "@tale/client";
40
114
 
41
115
  ```bash
42
116
  pnpm install # 或 npm install / yarn
43
- pnpm test # 对应 package.json 中的 "test": "jest"
117
+ pnpm run typecheck
118
+ pnpm run build
119
+ pnpm run test:unit
120
+ pnpm test
44
121
  ```
45
122
 
46
123
  ## 更新日志与版本
@@ -49,7 +126,7 @@ pnpm test # 对应 package.json 中的 "test": "jest"
49
126
 
50
127
  ## TODO
51
128
 
52
- - [ ] 修改 User Group 等分页格式,统一为 PageResponse。
129
+ - [x] 修改 User Group 等分页格式,统一为 PageResponse。
53
130
 
54
131
  ## 许可证
55
132
 
@@ -1,6 +1,7 @@
1
- import type { AclRecord, CreateAclRecordRequest, UpdateAclRecordRequest, ListAclRecordsRequest, AclBatchCreateResponse, AclTemplate, CreateAclTemplateRequest, UpdateAclTemplateRequest, ListAclTemplatesRequest, AclOptions } from "./types.js";
1
+ import type { AclRecord, CreateAclRecordRequest, UpdateAclRecordRequest, ListAclRecordsRequest, AclBatchCreateResponse, AclBatchFailure, AclTemplate, CreateAclTemplateRequest, UpdateAclTemplateRequest, ListAclTemplatesRequest, AclOptions } from "./types.js";
2
2
  import type { PageResponse } from "../common/types.js";
3
- export type { AclRecord, CreateAclRecordRequest, UpdateAclRecordRequest, ListAclRecordsRequest, AclBatchCreateResponse, AclTemplate, CreateAclTemplateRequest, UpdateAclTemplateRequest, ListAclTemplatesRequest, AclOptions, };
3
+ import type { Attachment } from "../attachment/types.js";
4
+ export type { AclRecord, CreateAclRecordRequest, UpdateAclRecordRequest, ListAclRecordsRequest, AclBatchCreateResponse, AclBatchFailure, AclTemplate, CreateAclTemplateRequest, UpdateAclTemplateRequest, ListAclTemplatesRequest, AclOptions, };
4
5
  /**
5
6
  * Gets an ACL record by ID.
6
7
  *
@@ -13,11 +14,11 @@ export type { AclRecord, CreateAclRecordRequest, UpdateAclRecordRequest, ListAcl
13
14
  *
14
15
  * @example
15
16
  * ```typescript
16
- * import { getAclRecord } from '@tale/client';
17
+ * import { getAclRecord } from '@turinhub/tale-js-sdk';
17
18
  *
18
19
  * try {
19
- * const record = await getAclRecord('record_id_here');
20
- * console.log('Record effect:', record.effect_type);
20
+ * const record = await getAclRecord('recordId_here');
21
+ * console.log('Record effect:', record.effectType);
21
22
  * } catch (error) {
22
23
  * console.error('Failed to get ACL record:', error.message);
23
24
  * }
@@ -35,13 +36,13 @@ export declare function getAclRecord(recordId: string, options?: AclOptions): Pr
35
36
  *
36
37
  * @example
37
38
  * ```typescript
38
- * import { listAclRecords } from '@tale/client';
39
+ * import { listAclRecords } from '@turinhub/tale-js-sdk';
39
40
  *
40
41
  * try {
41
42
  * const result = await listAclRecords({
42
43
  * page: 0,
43
44
  * size: 20,
44
- * resource_type: 'document'
45
+ * resourceType: 'document'
45
46
  * });
46
47
  * console.log(`Found ${result.total} records`);
47
48
  * } catch (error) {
@@ -62,17 +63,17 @@ export declare function listAclRecords(options?: ListAclRecordsRequest & AclOpti
62
63
  *
63
64
  * @example
64
65
  * ```typescript
65
- * import { createAclRecord } from '@tale/client';
66
+ * import { createAclRecord } from '@turinhub/tale-js-sdk';
66
67
  *
67
68
  * try {
68
69
  * const record = await createAclRecord({
69
- * subject_type: 'user',
70
- * subject_id: 'user123',
71
- * resource_type: 'document',
72
- * resource_id: 'doc456',
73
- * effect_type: 'allow'
70
+ * subjectType: 'user',
71
+ * subjectId: 'user123',
72
+ * resourceType: 'document',
73
+ * resourceId: 'doc456',
74
+ * effectType: 'allow'
74
75
  * });
75
- * console.log('Record created:', record.record_id);
76
+ * console.log('Record created:', record.recordId);
76
77
  * } catch (error) {
77
78
  * console.error('Failed to create ACL record:', error.message);
78
79
  * }
@@ -91,24 +92,24 @@ export declare function createAclRecord(request: CreateAclRecordRequest, options
91
92
  *
92
93
  * @example
93
94
  * ```typescript
94
- * import { batchCreateAclRecords } from '@tale/client';
95
+ * import { batchCreateAclRecords } from '@turinhub/tale-js-sdk';
95
96
  *
96
97
  * try {
97
98
  * const result = await batchCreateAclRecords([
98
99
  * {
99
- * subject_type: 'user',
100
- * subject_id: 'user1',
101
- * resource_type: 'document',
102
- * effect_type: 'allow'
100
+ * subjectType: 'user',
101
+ * subjectId: 'user1',
102
+ * resourceType: 'document',
103
+ * effectType: 'allow'
103
104
  * },
104
105
  * {
105
- * subject_type: 'user',
106
- * subject_id: 'user2',
107
- * resource_type: 'document',
108
- * effect_type: 'deny'
106
+ * subjectType: 'user',
107
+ * subjectId: 'user2',
108
+ * resourceType: 'document',
109
+ * effectType: 'deny'
109
110
  * }
110
111
  * ]);
111
- * console.log(`Created ${result.success_count}, Failed ${result.failure_count}`);
112
+ * console.log(`Created ${result.successCount}, Failed ${result.failureCount}`);
112
113
  * } catch (error) {
113
114
  * console.error('Failed to batch create ACL records:', error.message);
114
115
  * }
@@ -128,14 +129,14 @@ export declare function batchCreateAclRecords(requests: CreateAclRecordRequest[]
128
129
  *
129
130
  * @example
130
131
  * ```typescript
131
- * import { updateAclRecord } from '@tale/client';
132
+ * import { updateAclRecord } from '@turinhub/tale-js-sdk';
132
133
  *
133
134
  * try {
134
- * const record = await updateAclRecord('record_id_here', {
135
- * effect_type: 'deny',
135
+ * const record = await updateAclRecord('recordId_here', {
136
+ * effectType: 'deny',
136
137
  * priority: 100
137
138
  * });
138
- * console.log('Record updated:', record.record_id);
139
+ * console.log('Record updated:', record.recordId);
139
140
  * } catch (error) {
140
141
  * console.error('Failed to update ACL record:', error.message);
141
142
  * }
@@ -154,10 +155,10 @@ export declare function updateAclRecord(recordId: string, request: UpdateAclReco
154
155
  *
155
156
  * @example
156
157
  * ```typescript
157
- * import { deleteAclRecord } from '@tale/client';
158
+ * import { deleteAclRecord } from '@turinhub/tale-js-sdk';
158
159
  *
159
160
  * try {
160
- * await deleteAclRecord('record_id_here');
161
+ * await deleteAclRecord('recordId_here');
161
162
  * console.log('ACL record deleted successfully');
162
163
  * } catch (error) {
163
164
  * console.error('Failed to delete ACL record:', error.message);
@@ -177,11 +178,11 @@ export declare function deleteAclRecord(recordId: string, options?: AclOptions):
177
178
  *
178
179
  * @example
179
180
  * ```typescript
180
- * import { getAclTemplate } from '@tale/client';
181
+ * import { getAclTemplate } from '@turinhub/tale-js-sdk';
181
182
  *
182
183
  * try {
183
- * const template = await getAclTemplate('template_code_here');
184
- * console.log('Template name:', template.template_name);
184
+ * const template = await getAclTemplate('templateCode_here');
185
+ * console.log('Template name:', template.templateName);
185
186
  * } catch (error) {
186
187
  * console.error('Failed to get ACL template:', error.message);
187
188
  * }
@@ -199,13 +200,13 @@ export declare function getAclTemplate(templateId: string, options?: AclOptions)
199
200
  *
200
201
  * @example
201
202
  * ```typescript
202
- * import { listAclTemplates } from '@tale/client';
203
+ * import { listAclTemplates } from '@turinhub/tale-js-sdk';
203
204
  *
204
205
  * try {
205
206
  * const result = await listAclTemplates({
206
207
  * page: 0,
207
208
  * size: 20,
208
- * resource_type: 'document'
209
+ * resourceType: 'document'
209
210
  * });
210
211
  * console.log(`Found ${result.total} templates`);
211
212
  * } catch (error) {
@@ -226,17 +227,17 @@ export declare function listAclTemplates(options?: ListAclTemplatesRequest & Acl
226
227
  *
227
228
  * @example
228
229
  * ```typescript
229
- * import { createAclTemplate } from '@tale/client';
230
+ * import { createAclTemplate } from '@turinhub/tale-js-sdk';
230
231
  *
231
232
  * try {
232
233
  * const template = await createAclTemplate({
233
- * template_name: 'Document Access',
234
- * template_code: 'doc_access',
235
- * subject_type: 'user',
236
- * resource_type: 'document',
237
- * effect_type: 'allow'
234
+ * templateName: 'Document Access',
235
+ * templateCode: 'doc_access',
236
+ * subjectType: 'user',
237
+ * resourceType: 'document',
238
+ * effectType: 'allow'
238
239
  * });
239
- * console.log('Template created:', template.template_id);
240
+ * console.log('Template created:', template.templateId);
240
241
  * } catch (error) {
241
242
  * console.error('Failed to create ACL template:', error.message);
242
243
  * }
@@ -256,14 +257,14 @@ export declare function createAclTemplate(request: CreateAclTemplateRequest, opt
256
257
  *
257
258
  * @example
258
259
  * ```typescript
259
- * import { updateAclTemplate } from '@tale/client';
260
+ * import { updateAclTemplate } from '@turinhub/tale-js-sdk';
260
261
  *
261
262
  * try {
262
- * const template = await updateAclTemplate('template_code_here', {
263
- * template_name: 'Updated Template Name',
264
- * effect_type: 'deny'
263
+ * const template = await updateAclTemplate('templateCode_here', {
264
+ * templateName: 'Updated Template Name',
265
+ * effectType: 'deny'
265
266
  * });
266
- * console.log('Template updated:', template.template_id);
267
+ * console.log('Template updated:', template.templateId);
267
268
  * } catch (error) {
268
269
  * console.error('Failed to update ACL template:', error.message);
269
270
  * }
@@ -282,10 +283,10 @@ export declare function updateAclTemplate(templateId: string, request: UpdateAcl
282
283
  *
283
284
  * @example
284
285
  * ```typescript
285
- * import { deleteAclTemplate } from '@tale/client';
286
+ * import { deleteAclTemplate } from '@turinhub/tale-js-sdk';
286
287
  *
287
288
  * try {
288
- * await deleteAclTemplate('template_code_here');
289
+ * await deleteAclTemplate('templateCode_here');
289
290
  * console.log('ACL template deleted successfully');
290
291
  * } catch (error) {
291
292
  * console.error('Failed to delete ACL template:', error.message);
@@ -293,3 +294,15 @@ export declare function updateAclTemplate(templateId: string, request: UpdateAcl
293
294
  * ```
294
295
  */
295
296
  export declare function deleteAclTemplate(templateId: string, options?: AclOptions): Promise<void>;
297
+ /** List attachments for an ACL record */
298
+ export declare function listAclRecordAttachments(recordId: string, options?: AclOptions & {
299
+ page?: number;
300
+ size?: number;
301
+ sort?: string;
302
+ }): Promise<PageResponse<Attachment>>;
303
+ /** Get a single attachment for an ACL record */
304
+ export declare function getAclRecordAttachment(recordId: string, attachmentId: string, options?: AclOptions): Promise<Attachment>;
305
+ /** Upload attachment for an ACL record */
306
+ export declare function uploadAclRecordAttachment(recordId: string, attachmentTypeId: string, file: File | Blob, remark?: string, options?: AclOptions): Promise<Attachment>;
307
+ /** Delete attachment from an ACL record */
308
+ export declare function deleteAclRecordAttachment(recordId: string, attachmentId: string, options?: AclOptions): Promise<void>;