@turinhub/tale-js-sdk 1.3.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/dist/acl/index.d.ts +295 -0
  4. package/dist/acl/index.js +653 -0
  5. package/dist/acl/types.d.ts +142 -0
  6. package/dist/acl/types.js +1 -0
  7. package/dist/auth/index.d.ts +166 -0
  8. package/dist/auth/index.js +522 -0
  9. package/dist/auth/types.d.ts +127 -0
  10. package/dist/auth/types.js +1 -0
  11. package/dist/cms/file.d.ts +398 -0
  12. package/dist/cms/file.js +800 -0
  13. package/dist/cms/folder.d.ts +128 -0
  14. package/dist/cms/folder.js +294 -0
  15. package/dist/cms/index.d.ts +3 -0
  16. package/dist/cms/index.js +6 -0
  17. package/dist/cms/types.d.ts +157 -0
  18. package/dist/cms/types.js +1 -0
  19. package/dist/common/types.d.ts +91 -0
  20. package/dist/common/types.js +2 -0
  21. package/dist/errors.d.ts +52 -0
  22. package/dist/errors.js +109 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.js +12 -0
  25. package/dist/rbac/acl.d.ts +152 -0
  26. package/dist/rbac/acl.js +723 -0
  27. package/dist/rbac/index.d.ts +464 -0
  28. package/dist/rbac/index.js +1121 -0
  29. package/dist/rbac/rbac.d.ts +198 -0
  30. package/dist/rbac/rbac.js +984 -0
  31. package/dist/rbac/types.d.ts +125 -0
  32. package/dist/rbac/types.js +1 -0
  33. package/dist/rbac/user-group.d.ts +122 -0
  34. package/dist/rbac/user-group.js +570 -0
  35. package/dist/status.d.ts +40 -0
  36. package/dist/status.js +56 -0
  37. package/dist/task/index.d.ts +163 -0
  38. package/dist/task/index.js +495 -0
  39. package/dist/task/types.d.ts +116 -0
  40. package/dist/task/types.js +1 -0
  41. package/dist/task-type/index.d.ts +92 -0
  42. package/dist/task-type/index.js +256 -0
  43. package/dist/task-type/types.d.ts +54 -0
  44. package/dist/task-type/types.js +1 -0
  45. package/dist/token.d.ts +21 -0
  46. package/dist/token.js +114 -0
  47. package/dist/user/index.d.ts +267 -0
  48. package/dist/user/index.js +786 -0
  49. package/dist/user/types.d.ts +145 -0
  50. package/dist/user/types.js +1 -0
  51. package/dist/user-attribute/index.d.ts +186 -0
  52. package/dist/user-attribute/index.js +615 -0
  53. package/dist/user-attribute/types.d.ts +109 -0
  54. package/dist/user-attribute/types.js +1 -0
  55. package/dist/user-group/index.d.ts +231 -0
  56. package/dist/user-group/index.js +566 -0
  57. package/dist/user-group/types.d.ts +50 -0
  58. package/dist/user-group/types.js +1 -0
  59. package/package.json +50 -0
@@ -0,0 +1,566 @@
1
+ import { getAppToken } from "../token.js";
2
+ import { ApiError, ConfigurationError, NetworkError } from "../errors.js";
3
+ // ==================== Helper Functions ====================
4
+ /**
5
+ * Parses standard API response format: { code, msg, data }
6
+ */
7
+ function parseApiResponse(json, errorMessage, statusCode) {
8
+ if (typeof json !== "object" || json === null) {
9
+ throw new ApiError(`Invalid response: ${errorMessage} - not an object`, statusCode);
10
+ }
11
+ const response = json;
12
+ if (response.code !== 200) {
13
+ const errorMsg = typeof response.msg === "string" ? response.msg : errorMessage;
14
+ throw new ApiError(errorMsg, statusCode, response.code);
15
+ }
16
+ if (!response.data) {
17
+ throw new ApiError(`Invalid response: ${errorMessage} - missing data`, statusCode);
18
+ }
19
+ return response.data;
20
+ }
21
+ // ==================== Functions ====================
22
+ /**
23
+ * Gets a user group by ID.
24
+ *
25
+ * @param groupId - User group ID
26
+ * @param options - Optional configuration
27
+ * @returns Promise resolving to user group information
28
+ * @throws {ConfigurationError} When required environment variables are missing
29
+ * @throws {ApiError} When API request fails
30
+ * @throws {NetworkError} When network request fails
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * import { getUserGroup } from '@tale/client';
35
+ *
36
+ * try {
37
+ * const group = await getUserGroup('group_id_here');
38
+ * console.log('Group name:', group.name);
39
+ * } catch (error) {
40
+ * console.error('Failed to get user group:', error.message);
41
+ * }
42
+ * ```
43
+ */
44
+ export async function getUserGroup(groupId, options) {
45
+ if (!groupId || groupId.trim() === "") {
46
+ throw new ApiError("groupId is required", 400, "9400");
47
+ }
48
+ const token = options?.appToken ?? (await getAppToken(options));
49
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
50
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
51
+ if (!base) {
52
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
53
+ }
54
+ const url = String(base).replace(/\/+$/, "") +
55
+ `/user-group/v1/${encodeURIComponent(groupId)}`;
56
+ let response;
57
+ try {
58
+ response = await globalThis.fetch(url, {
59
+ method: "GET",
60
+ headers: {
61
+ "Content-Type": "application/json",
62
+ "x-t-token": token,
63
+ },
64
+ });
65
+ }
66
+ catch (error) {
67
+ throw new NetworkError(`Failed to get user group: ${error instanceof Error ? error.message : "Unknown error"}`);
68
+ }
69
+ const json = (await response.json());
70
+ if (json.code !== 200) {
71
+ const errorMsg = typeof json.msg === "string" ? json.msg : "Failed to get user group";
72
+ throw new ApiError(errorMsg, response.status, json.code);
73
+ }
74
+ if (!json.data) {
75
+ throw new ApiError("Invalid user group response: missing data", response.status);
76
+ }
77
+ return json.data;
78
+ }
79
+ /**
80
+ * Lists user groups with pagination and optional keyword filtering.
81
+ *
82
+ * @param options - Optional parameters for pagination and filtering
83
+ * @returns Promise resolving to paginated user group list
84
+ * @throws {ConfigurationError} When required environment variables are missing
85
+ * @throws {ApiError} When API request fails
86
+ * @throws {NetworkError} When network request fails
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * import { listUserGroups } from '@tale/client';
91
+ *
92
+ * try {
93
+ * const result = await listUserGroups({
94
+ * page: 0,
95
+ * size: 20,
96
+ * keyword: 'admin'
97
+ * });
98
+ * console.log(`Found ${result.totalElements} user groups`);
99
+ * } catch (error) {
100
+ * console.error('Failed to list user groups:', error.message);
101
+ * }
102
+ * ```
103
+ */
104
+ export async function listUserGroups(options) {
105
+ const token = options?.appToken ?? (await getAppToken(options));
106
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
107
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
108
+ if (!base) {
109
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
110
+ }
111
+ const url = new URL(String(base).replace(/\/+$/, "") + "/user-group/v2");
112
+ const { appToken, baseUrl, ...requestParams } = options || {};
113
+ const queryParams = {
114
+ page: 0,
115
+ size: 10,
116
+ sort: "createdAt,desc",
117
+ ...requestParams,
118
+ };
119
+ Object.entries(queryParams).forEach(([key, value]) => {
120
+ if (value !== undefined) {
121
+ url.searchParams.append(key, String(value));
122
+ }
123
+ });
124
+ let response;
125
+ try {
126
+ response = await globalThis.fetch(url.toString(), {
127
+ method: "GET",
128
+ headers: {
129
+ "Content-Type": "application/json",
130
+ "x-t-token": token,
131
+ },
132
+ });
133
+ }
134
+ catch (error) {
135
+ throw new NetworkError(`Failed to list user groups: ${error instanceof Error ? error.message : "Unknown error"}`);
136
+ }
137
+ const json = await response.json();
138
+ return parseApiResponse(json, "Failed to list user groups", response.status);
139
+ }
140
+ /**
141
+ * Creates a new user group.
142
+ *
143
+ * @param request - User group creation request
144
+ * @param options - Optional configuration
145
+ * @returns Promise resolving to created user group
146
+ * @throws {ConfigurationError} When required environment variables are missing
147
+ * @throws {ApiError} When API request fails
148
+ * @throws {NetworkError} When network request fails
149
+ *
150
+ * @example
151
+ * ```typescript
152
+ * import { createUserGroup } from '@tale/client';
153
+ *
154
+ * try {
155
+ * const group = await createUserGroup({
156
+ * name: 'Administrators',
157
+ * description: 'Admin users',
158
+ * type: 'system'
159
+ * });
160
+ * console.log('Group created:', group.group_id);
161
+ * } catch (error) {
162
+ * console.error('Failed to create user group:', error.message);
163
+ * }
164
+ * ```
165
+ */
166
+ export async function createUserGroup(request, options) {
167
+ if (!request.name || request.name.trim() === "") {
168
+ throw new ApiError("name is required", 400, "9400");
169
+ }
170
+ const token = options?.appToken ?? (await getAppToken(options));
171
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
172
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
173
+ if (!base) {
174
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
175
+ }
176
+ const url = String(base).replace(/\/+$/, "") + "/user-group/v1";
177
+ let response;
178
+ try {
179
+ response = await globalThis.fetch(url, {
180
+ method: "POST",
181
+ headers: {
182
+ "Content-Type": "application/json",
183
+ "x-t-token": token,
184
+ },
185
+ body: JSON.stringify(request),
186
+ });
187
+ }
188
+ catch (error) {
189
+ throw new NetworkError(`Failed to create user group: ${error instanceof Error ? error.message : "Unknown error"}`);
190
+ }
191
+ const json = (await response.json());
192
+ if (json.code !== 200) {
193
+ const errorMsg = typeof json.msg === "string" ? json.msg : "Failed to create user group";
194
+ throw new ApiError(errorMsg, response.status, json.code);
195
+ }
196
+ if (!json.data) {
197
+ throw new ApiError("Invalid user group creation response: missing data", response.status);
198
+ }
199
+ return json.data;
200
+ }
201
+ /**
202
+ * Updates an existing user group.
203
+ *
204
+ * @param groupId - User group ID to update
205
+ * @param request - Update request with fields to modify
206
+ * @param options - Optional configuration
207
+ * @returns Promise resolving to updated user group
208
+ * @throws {ConfigurationError} When required environment variables are missing
209
+ * @throws {ApiError} When API request fails
210
+ * @throws {NetworkError} When network request fails
211
+ *
212
+ * @example
213
+ * ```typescript
214
+ * import { updateUserGroup } from '@tale/client';
215
+ *
216
+ * try {
217
+ * const group = await updateUserGroup('group_id_here', {
218
+ * name: 'Updated Name',
219
+ * description: 'Updated description'
220
+ * });
221
+ * console.log('Group updated:', group.name);
222
+ * } catch (error) {
223
+ * console.error('Failed to update user group:', error.message);
224
+ * }
225
+ * ```
226
+ */
227
+ export async function updateUserGroup(groupId, request, options) {
228
+ if (!groupId || groupId.trim() === "") {
229
+ throw new ApiError("groupId is required", 400, "9400");
230
+ }
231
+ const token = options?.appToken ?? (await getAppToken(options));
232
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
233
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
234
+ if (!base) {
235
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
236
+ }
237
+ const url = String(base).replace(/\/+$/, "") +
238
+ `/user-group/v1/${encodeURIComponent(groupId)}`;
239
+ let response;
240
+ try {
241
+ response = await globalThis.fetch(url, {
242
+ method: "PUT",
243
+ headers: {
244
+ "Content-Type": "application/json",
245
+ "x-t-token": token,
246
+ },
247
+ body: JSON.stringify(request),
248
+ });
249
+ }
250
+ catch (error) {
251
+ throw new NetworkError(`Failed to update user group: ${error instanceof Error ? error.message : "Unknown error"}`);
252
+ }
253
+ const json = (await response.json());
254
+ if (json.code !== 200) {
255
+ const errorMsg = typeof json.msg === "string" ? json.msg : "Failed to update user group";
256
+ throw new ApiError(errorMsg, response.status, json.code);
257
+ }
258
+ if (!json.data) {
259
+ throw new ApiError("Invalid user group update response: missing data", response.status);
260
+ }
261
+ return json.data;
262
+ }
263
+ /**
264
+ * Deletes a user group.
265
+ *
266
+ * @param groupId - User group ID to delete
267
+ * @param options - Optional configuration
268
+ * @returns Promise that resolves when deletion is successful
269
+ * @throws {ConfigurationError} When required environment variables are missing
270
+ * @throws {ApiError} When API request fails
271
+ * @throws {NetworkError} When network request fails
272
+ *
273
+ * @example
274
+ * ```typescript
275
+ * import { deleteUserGroup } from '@tale/client';
276
+ *
277
+ * try {
278
+ * await deleteUserGroup('group_id_here');
279
+ * console.log('Group deleted successfully');
280
+ * } catch (error) {
281
+ * console.error('Failed to delete user group:', error.message);
282
+ * }
283
+ * ```
284
+ */
285
+ export async function deleteUserGroup(groupId, options) {
286
+ if (!groupId || groupId.trim() === "") {
287
+ throw new ApiError("groupId is required", 400, "9400");
288
+ }
289
+ const token = options?.appToken ?? (await getAppToken(options));
290
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
291
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
292
+ if (!base) {
293
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
294
+ }
295
+ const url = String(base).replace(/\/+$/, "") +
296
+ `/user-group/v1/${encodeURIComponent(groupId)}`;
297
+ let response;
298
+ try {
299
+ response = await globalThis.fetch(url, {
300
+ method: "DELETE",
301
+ headers: {
302
+ "Content-Type": "application/json",
303
+ "x-t-token": token,
304
+ },
305
+ });
306
+ }
307
+ catch (error) {
308
+ throw new NetworkError(`Failed to delete user group: ${error instanceof Error ? error.message : "Unknown error"}`);
309
+ }
310
+ const json = (await response.json());
311
+ if (json.code !== 200) {
312
+ const errorMsg = typeof json.msg === "string" ? json.msg : "Failed to delete user group";
313
+ throw new ApiError(errorMsg, response.status, json.code);
314
+ }
315
+ }
316
+ /**
317
+ * Gets members of a user group with pagination.
318
+ *
319
+ * @param groupId - User group ID
320
+ * @param options - Optional parameters for pagination
321
+ * @returns Promise resolving to paginated member list
322
+ * @throws {ConfigurationError} When required environment variables are missing
323
+ * @throws {ApiError} When API request fails
324
+ * @throws {NetworkError} When network request fails
325
+ *
326
+ * @example
327
+ * ```typescript
328
+ * import { listUserGroupMembers } from '@tale/client';
329
+ *
330
+ * try {
331
+ * const result = await listUserGroupMembers('group_id_here', {
332
+ * page: 0,
333
+ * size: 20
334
+ * });
335
+ * console.log(`Found ${result.totalElements} members`);
336
+ * } catch (error) {
337
+ * console.error('Failed to list user group members:', error.message);
338
+ * }
339
+ * ```
340
+ */
341
+ export async function listUserGroupMembers(groupId, options) {
342
+ if (!groupId || groupId.trim() === "") {
343
+ throw new ApiError("groupId is required", 400, "9400");
344
+ }
345
+ const token = options?.appToken ?? (await getAppToken(options));
346
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
347
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
348
+ if (!base) {
349
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
350
+ }
351
+ const url = new URL(String(base).replace(/\/+$/, "") +
352
+ `/user-group/v1/${encodeURIComponent(groupId)}/members`);
353
+ const { appToken, baseUrl, ...requestParams } = options || {};
354
+ const queryParams = {
355
+ page: 0,
356
+ size: 10,
357
+ sort: "createdAt,desc",
358
+ ...requestParams,
359
+ };
360
+ Object.entries(queryParams).forEach(([key, value]) => {
361
+ if (value !== undefined) {
362
+ url.searchParams.append(key, String(value));
363
+ }
364
+ });
365
+ let response;
366
+ try {
367
+ response = await globalThis.fetch(url.toString(), {
368
+ method: "GET",
369
+ headers: {
370
+ "Content-Type": "application/json",
371
+ "x-t-token": token,
372
+ },
373
+ });
374
+ }
375
+ catch (error) {
376
+ throw new NetworkError(`Failed to list user group members: ${error instanceof Error ? error.message : "Unknown error"}`);
377
+ }
378
+ const json = await response.json();
379
+ return parseApiResponse(json, "Failed to list user group members", response.status);
380
+ }
381
+ /**
382
+ * Adds members to a user group.
383
+ *
384
+ * @param groupId - User group ID
385
+ * @param request - Request containing user IDs to add
386
+ * @param options - Optional configuration
387
+ * @returns Promise that resolves when members are added
388
+ * @throws {ConfigurationError} When required environment variables are missing
389
+ * @throws {ApiError} When API request fails
390
+ * @throws {NetworkError} When network request fails
391
+ *
392
+ * @example
393
+ * ```typescript
394
+ * import { addUserGroupMembers } from '@tale/client';
395
+ *
396
+ * try {
397
+ * await addUserGroupMembers('group_id_here', {
398
+ * user_ids: ['user1', 'user2', 'user3']
399
+ * });
400
+ * console.log('Members added successfully');
401
+ * } catch (error) {
402
+ * console.error('Failed to add members:', error.message);
403
+ * }
404
+ * ```
405
+ */
406
+ export async function addUserGroupMembers(groupId, request, options) {
407
+ if (!groupId || groupId.trim() === "") {
408
+ throw new ApiError("groupId is required", 400, "9400");
409
+ }
410
+ if (!request.user_ids ||
411
+ !Array.isArray(request.user_ids) ||
412
+ request.user_ids.length === 0) {
413
+ throw new ApiError("user_ids is required and must be a non-empty array", 400, "9400");
414
+ }
415
+ const token = options?.appToken ?? (await getAppToken(options));
416
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
417
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
418
+ if (!base) {
419
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
420
+ }
421
+ const url = String(base).replace(/\/+$/, "") +
422
+ `/user-group/v1/${encodeURIComponent(groupId)}/members`;
423
+ let response;
424
+ try {
425
+ response = await globalThis.fetch(url, {
426
+ method: "POST",
427
+ headers: {
428
+ "Content-Type": "application/json",
429
+ "x-t-token": token,
430
+ },
431
+ body: JSON.stringify(request),
432
+ });
433
+ }
434
+ catch (error) {
435
+ throw new NetworkError(`Failed to add user group members: ${error instanceof Error ? error.message : "Unknown error"}`);
436
+ }
437
+ const json = (await response.json());
438
+ if (json.code !== 200) {
439
+ const errorMsg = typeof json.msg === "string"
440
+ ? json.msg
441
+ : "Failed to add user group members";
442
+ throw new ApiError(errorMsg, response.status, json.code);
443
+ }
444
+ }
445
+ /**
446
+ * Removes members from a user group.
447
+ *
448
+ * @param groupId - User group ID
449
+ * @param request - Request containing user IDs to remove
450
+ * @param options - Optional configuration
451
+ * @returns Promise that resolves when members are removed
452
+ * @throws {ConfigurationError} When required environment variables are missing
453
+ * @throws {ApiError} When API request fails
454
+ * @throws {NetworkError} When network request fails
455
+ *
456
+ * @example
457
+ * ```typescript
458
+ * import { removeUserGroupMembers } from '@tale/client';
459
+ *
460
+ * try {
461
+ * await removeUserGroupMembers('group_id_here', {
462
+ * user_ids: ['user1', 'user2']
463
+ * });
464
+ * console.log('Members removed successfully');
465
+ * } catch (error) {
466
+ * console.error('Failed to remove members:', error.message);
467
+ * }
468
+ * ```
469
+ */
470
+ export async function removeUserGroupMembers(groupId, request, options) {
471
+ if (!groupId || groupId.trim() === "") {
472
+ throw new ApiError("groupId is required", 400, "9400");
473
+ }
474
+ if (!request.user_ids ||
475
+ !Array.isArray(request.user_ids) ||
476
+ request.user_ids.length === 0) {
477
+ throw new ApiError("user_ids is required and must be a non-empty array", 400, "9400");
478
+ }
479
+ const token = options?.appToken ?? (await getAppToken(options));
480
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
481
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
482
+ if (!base) {
483
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
484
+ }
485
+ const url = String(base).replace(/\/+$/, "") +
486
+ `/user-group/v1/${encodeURIComponent(groupId)}/members`;
487
+ let response;
488
+ try {
489
+ response = await globalThis.fetch(url, {
490
+ method: "DELETE",
491
+ headers: {
492
+ "Content-Type": "application/json",
493
+ "x-t-token": token,
494
+ },
495
+ body: JSON.stringify(request),
496
+ });
497
+ }
498
+ catch (error) {
499
+ throw new NetworkError(`Failed to remove user group members: ${error instanceof Error ? error.message : "Unknown error"}`);
500
+ }
501
+ const json = (await response.json());
502
+ if (json.code !== 200) {
503
+ const errorMsg = typeof json.msg === "string"
504
+ ? json.msg
505
+ : "Failed to remove user group members";
506
+ throw new ApiError(errorMsg, response.status, json.code);
507
+ }
508
+ }
509
+ /**
510
+ * Gets all user groups that a user belongs to.
511
+ *
512
+ * @param userId - User ID
513
+ * @param options - Optional configuration
514
+ * @returns Promise resolving to list of user groups
515
+ * @throws {ConfigurationError} When required environment variables are missing
516
+ * @throws {ApiError} When API request fails
517
+ * @throws {NetworkError} When network request fails
518
+ *
519
+ * @example
520
+ * ```typescript
521
+ * import { getUserGroups } from '@tale/client';
522
+ *
523
+ * try {
524
+ * const groups = await getUserGroups('user_id_here');
525
+ * console.log(`User belongs to ${groups.length} groups`);
526
+ * groups.forEach(group => console.log('-', group.name));
527
+ * } catch (error) {
528
+ * console.error('Failed to get user groups:', error.message);
529
+ * }
530
+ * ```
531
+ */
532
+ export async function getUserGroups(userId, options) {
533
+ if (!userId || userId.trim() === "") {
534
+ throw new ApiError("userId is required", 400, "9400");
535
+ }
536
+ const token = options?.appToken ?? (await getAppToken(options));
537
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
538
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
539
+ if (!base) {
540
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
541
+ }
542
+ const url = String(base).replace(/\/+$/, "") +
543
+ `/user-group/v1/by-user/${encodeURIComponent(userId)}`;
544
+ let response;
545
+ try {
546
+ response = await globalThis.fetch(url, {
547
+ method: "GET",
548
+ headers: {
549
+ "Content-Type": "application/json",
550
+ "x-t-token": token,
551
+ },
552
+ });
553
+ }
554
+ catch (error) {
555
+ throw new NetworkError(`Failed to get user groups: ${error instanceof Error ? error.message : "Unknown error"}`);
556
+ }
557
+ const json = (await response.json());
558
+ if (json.code !== 200) {
559
+ const errorMsg = typeof json.msg === "string" ? json.msg : "Failed to get user groups";
560
+ throw new ApiError(errorMsg, response.status, json.code);
561
+ }
562
+ if (!json.data || !Array.isArray(json.data)) {
563
+ throw new ApiError("Invalid user groups response: missing data", response.status);
564
+ }
565
+ return json.data;
566
+ }
@@ -0,0 +1,50 @@
1
+ import type { CommonOptions } from "../common/types.js";
2
+ export interface UserGroupInfo {
3
+ groupId: string;
4
+ name: string;
5
+ description?: string;
6
+ type?: string;
7
+ remark?: string;
8
+ memberCount: number;
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ }
12
+ export interface UserGroupMember {
13
+ userId: string;
14
+ nickname: string;
15
+ username: string;
16
+ phone: string;
17
+ email: string;
18
+ avatarUrl: string;
19
+ isFrozen: boolean;
20
+ createdAt: string;
21
+ remark: string;
22
+ }
23
+ export interface CreateUserGroupRequest {
24
+ name: string;
25
+ description?: string;
26
+ type?: string;
27
+ remark?: string;
28
+ }
29
+ export interface UpdateUserGroupRequest {
30
+ name?: string;
31
+ description?: string;
32
+ type?: string;
33
+ remark?: string;
34
+ }
35
+ export interface UserGroupMemberRequest {
36
+ user_ids: string[];
37
+ }
38
+ export interface UserGroupOptions extends CommonOptions {
39
+ }
40
+ export interface ListUserGroupsRequest {
41
+ page?: number;
42
+ size?: number;
43
+ keyword?: string;
44
+ sort?: string;
45
+ }
46
+ export interface ListUserGroupMembersRequest {
47
+ page?: number;
48
+ size?: number;
49
+ sort?: string;
50
+ }
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@turinhub/tale-js-sdk",
3
+ "version": "1.3.0",
4
+ "description": "Official TypeScript SDK for Tale backend services",
5
+ "keywords": [
6
+ "tale",
7
+ "sdk",
8
+ "client",
9
+ "api",
10
+ "backend",
11
+ "typescript"
12
+ ],
13
+ "homepage": "https://github.com/turinhub/tale-js-sdk#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/turinhub/tale-js-sdk/issues"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/turinhub/tale-js-sdk.git"
20
+ },
21
+ "license": "MIT",
22
+ "author": "Turinhub <dev@turinhub.com>",
23
+ "type": "module",
24
+ "main": "dist/index.js",
25
+ "scripts": {
26
+ "test": "pnpm run build && node --env-file=.env --experimental-vm-modules ./node_modules/jest/bin/jest.js",
27
+ "test:unit": "pnpm run build && node --env-file=.env --experimental-vm-modules ./node_modules/jest/bin/jest.js --testPathIgnorePatterns='integration'",
28
+ "test:integration": "pnpm run build && node --env-file=.env --experimental-vm-modules ./node_modules/jest/bin/jest.js --testPathPatterns='integration'",
29
+ "build": "tsc -p tsconfig.json",
30
+ "typecheck": "tsc -p tsconfig.json --noEmit",
31
+ "format": "prettier --write \"src/**/*.{ts,tsx,js,jsx}\" \"*.json\" \"*.md\"",
32
+ "format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx}\" \"*.json\" \"*.md\"",
33
+ "docs": "typedoc --entryPoints src/index.ts --out docs",
34
+ "docs:md": "typedoc --entryPoints src/index.ts --plugin typedoc-plugin-markdown --hideBreadcrumbs --out docs"
35
+ },
36
+ "devDependencies": {
37
+ "@types/jest": "^30.0.0",
38
+ "jest": "^30.2.0",
39
+ "prettier": "^3.6.2",
40
+ "typedoc": "^0.28.14",
41
+ "typedoc-plugin-markdown": "^4.9.0",
42
+ "typescript": "^5.9.3"
43
+ },
44
+ "types": "dist/index.d.ts",
45
+ "files": [
46
+ "dist",
47
+ "README.md",
48
+ "LICENSE"
49
+ ]
50
+ }