@turinhub/tale-js-sdk 2.2.0 → 2.4.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.
package/README.md CHANGED
@@ -24,33 +24,25 @@ yarn add @turinhub/tale-js-sdk
24
24
 
25
25
  ```ts
26
26
  import {
27
- getAppToken,
28
- getCurrentUser,
29
- listAppsByOrg,
30
- listFiles,
27
+ createTaleAdminClient,
28
+ createTaleAppClient,
31
29
  } from "@turinhub/tale-js-sdk";
32
30
 
33
- const appToken = await getAppToken({
31
+ const admin = createTaleAdminClient({
34
32
  baseUrl: "https://api.tale.example",
35
- appKey: process.env.TALE_APP_KEY,
36
- appSecret: process.env.TALE_APP_SECRET,
33
+ taleToken: "tale-user-token",
37
34
  });
38
35
 
39
- const files = await listFiles({
40
- baseUrl: "https://api.tale.example",
41
- appToken,
42
- folderId: "folder-id",
43
- });
36
+ const currentUser = await admin.currentUser.get();
37
+ const apps = await admin.apps.listByOrg(currentUser.app.orgId);
38
+ const issued = await admin.appTokens.issue({ appKey: "oa_xxx" });
44
39
 
45
- const currentUser = await getCurrentUser({
40
+ const app = createTaleAppClient({
46
41
  baseUrl: "https://api.tale.example",
47
- taleToken: "tale-user-token",
42
+ appToken: issued.token,
48
43
  });
49
44
 
50
- const apps = await listAppsByOrg(currentUser.app.orgId, {
51
- baseUrl: "https://api.tale.example",
52
- taleToken: "tale-user-token",
53
- });
45
+ const files = await app.cms.listFiles({ folderId: "folder-id" });
54
46
  ```
55
47
 
56
48
  ## 认证与 Token
@@ -61,9 +53,67 @@ SDK 中常见的鉴权选项都通过 `x-t-token` 发送到 Tale 后端:
61
53
  - `taleToken`:Tale 用户 Token,适用于平台级 App 管理 API,例如获取当前用户、应用列表、应用详情、App Secret,以及按 App Key 换发 App Token。
62
54
  - `baseUrl`:Tale 后端服务基础 URL;未显式传入时会读取环境变量。
63
55
 
64
- 服务端可使用 `getAppToken()` 通过 `TALE_APP_KEY` 与 `TALE_APP_SECRET` 获取应用 Token。浏览器端的 Cookie、缓存、自动续期和多应用切换策略不由 SDK 核心管理,调用方可基于 `issueAppToken()` 自行封装。
56
+ 服务端可使用 `getAppToken()` 通过 `TALE_APP_KEY` 与 `TALE_APP_SECRET` 获取应用 Token。`getAppToken()` 是 server-only helper,不应在浏览器代码中调用或暴露 `TALE_APP_SECRET`。浏览器端的 Cookie、缓存、自动续期和多应用切换策略不由 SDK 核心管理,调用方可基于 `createTaleAdminClient().appTokens.issue()` 或业务后端代理自行封装。
65
57
 
66
- ## App 与 App Token API
58
+ ## Admin 与 App Client
59
+
60
+ 也可以从子路径导入两个客户端入口:
61
+
62
+ ```ts
63
+ import { createTaleAdminClient } from "@turinhub/tale-js-sdk/admin";
64
+ import { createTaleAppClient } from "@turinhub/tale-js-sdk/app";
65
+ ```
66
+
67
+ Admin client 只接收 `taleToken`,用于平台级应用管理:
68
+
69
+ ```ts
70
+ const admin = createTaleAdminClient({ baseUrl, taleToken });
71
+
72
+ await admin.currentUser.get();
73
+ await admin.apps.listByOrg("org_1");
74
+ await admin.apps.create({ appName: "Demo", orgId: "org_1" });
75
+ await admin.apps.getDetail("oa_xxx");
76
+ await admin.apps.update({ appId: "app_1", appName: "Demo" });
77
+ await admin.appTokens.getSecret("oa_xxx");
78
+ await admin.appTokens.issue({ appKey: "oa_xxx" });
79
+ ```
80
+
81
+ App client 只接收 `appToken`,用于单应用内资源:
82
+
83
+ ```ts
84
+ const app = createTaleAppClient({ baseUrl, appToken });
85
+
86
+ await app.cms.listFiles({ folderId: "folder_1" });
87
+ await app.users.list({ page: 0, size: 20 });
88
+ await app.tasks.create({ openId: "ou_xxx", taskTypeId: "type_1" });
89
+ await app.rbac.listRoles();
90
+ await app.acl.listRecords();
91
+ await app.attachments.listByRef({ refType: "task", refId: "task_1" });
92
+ await app.appTokens.list({ page: 0, size: 20 });
93
+ ```
94
+
95
+ ## Legacy-compatible 函数导入
96
+
97
+ 已有项目可以继续从根入口直接导入函数。该方式在 2.x 内保持兼容,但新项目建议优先使用 Admin/App client。
98
+
99
+ ```ts
100
+ import {
101
+ getAppToken,
102
+ getCurrentUser,
103
+ listAppsByOrg,
104
+ listFiles,
105
+ } from "@turinhub/tale-js-sdk";
106
+
107
+ const appToken = await getAppToken({
108
+ baseUrl,
109
+ appKey: process.env.TALE_APP_KEY,
110
+ appSecret: process.env.TALE_APP_SECRET,
111
+ });
112
+
113
+ const files = await listFiles({ baseUrl, appToken, folderId: "folder-id" });
114
+ const currentUser = await getCurrentUser({ baseUrl, taleToken });
115
+ const apps = await listAppsByOrg(currentUser.app.orgId, { baseUrl, taleToken });
116
+ ```
67
117
 
68
118
  AppTS 模块提供平台应用相关方法:
69
119
 
@@ -0,0 +1,24 @@
1
+ import { createApp, getAppDetail, listAppsByOrg, updateApp } from "./app/index.js";
2
+ import { getAppSecret, issueAppToken } from "./app-token/index.js";
3
+ export interface TaleAdminClientOptions {
4
+ baseUrl?: string;
5
+ taleToken: string;
6
+ }
7
+ type IssueAppTokenRequestWithoutAuth = Omit<Parameters<typeof issueAppToken>[0], keyof TaleAdminClientOptions | "appToken">;
8
+ export declare function createTaleAdminClient(options: TaleAdminClientOptions): {
9
+ currentUser: {
10
+ get: () => Promise<import("./app/types.js").CurrentAppUser>;
11
+ };
12
+ apps: {
13
+ listByOrg: (orgId: Parameters<typeof listAppsByOrg>[0]) => Promise<import("./app/types.js").AppInfo[]>;
14
+ create: (request: Parameters<typeof createApp>[0]) => Promise<import("./app/types.js").CreateAppResponse>;
15
+ getDetail: (appKey: Parameters<typeof getAppDetail>[0]) => Promise<import("./app/types.js").AppDetail>;
16
+ update: (request: Parameters<typeof updateApp>[0]) => Promise<import("./app/types.js").AppDetail>;
17
+ };
18
+ appTokens: {
19
+ getSecret: (appKey: Parameters<typeof getAppSecret>[0]) => Promise<string>;
20
+ issue: (request: IssueAppTokenRequestWithoutAuth) => Promise<import("./app-token/types.js").IssueAppTokenResponse>;
21
+ };
22
+ };
23
+ export type TaleAdminClient = ReturnType<typeof createTaleAdminClient>;
24
+ export {};
package/dist/admin.js ADDED
@@ -0,0 +1,20 @@
1
+ import { createApp, getAppDetail, getCurrentUser, listAppsByOrg, updateApp, } from "./app/index.js";
2
+ import { getAppSecret, issueAppToken } from "./app-token/index.js";
3
+ export function createTaleAdminClient(options) {
4
+ const adminOptions = () => ({ ...options });
5
+ return {
6
+ currentUser: {
7
+ get: () => getCurrentUser(adminOptions()),
8
+ },
9
+ apps: {
10
+ listByOrg: (orgId) => listAppsByOrg(orgId, adminOptions()),
11
+ create: (request) => createApp(request, adminOptions()),
12
+ getDetail: (appKey) => getAppDetail(appKey, adminOptions()),
13
+ update: (request) => updateApp(request, adminOptions()),
14
+ },
15
+ appTokens: {
16
+ getSecret: (appKey) => getAppSecret(appKey, adminOptions()),
17
+ issue: (request) => issueAppToken({ ...request, ...adminOptions() }),
18
+ },
19
+ };
20
+ }
@@ -0,0 +1,229 @@
1
+ import * as Acl from "./acl/index.js";
2
+ import * as AppToken from "./app-token/index.js";
3
+ import * as Attachment from "./attachment/index.js";
4
+ import * as AttachmentType from "./attachment-type/index.js";
5
+ import * as Auth from "./auth/index.js";
6
+ import * as Cms from "./cms/index.js";
7
+ import * as Dashboard from "./dashboard/index.js";
8
+ import * as Rbac from "./rbac/index.js";
9
+ import * as Task from "./task/index.js";
10
+ import * as TaskType from "./task-type/index.js";
11
+ import * as User from "./user/index.js";
12
+ import * as UserAttribute from "./user-attribute/index.js";
13
+ import * as UserGroup from "./user-group/index.js";
14
+ export interface TaleAppClientOptions {
15
+ baseUrl?: string;
16
+ appToken: string;
17
+ }
18
+ type StripAuth<T> = T extends object ? Omit<T, keyof TaleAppClientOptions | "taleToken" | "appKey" | "appSecret"> : T;
19
+ type Request<T extends (...args: any[]) => unknown, Index extends number> = StripAuth<NonNullable<Parameters<T>[Index]>>;
20
+ type OptionalRequest<T extends (...args: any[]) => unknown, Index extends number> = Request<T, Index> | undefined;
21
+ export declare function createTaleAppClient(options: TaleAppClientOptions): {
22
+ auth: {
23
+ login: (credentials: Parameters<typeof Auth.login>[0], request?: OptionalRequest<typeof Auth.login, 1>) => Promise<Auth.LoginResponse>;
24
+ validateToken: (token: Parameters<typeof Auth.validateToken>[0], request?: OptionalRequest<typeof Auth.validateToken, 1>) => Promise<boolean>;
25
+ loginWithSms: (phone: Parameters<typeof Auth.loginWithSms>[0], request?: OptionalRequest<typeof Auth.loginWithSms, 1>) => Promise<Auth.SendSmsResponse>;
26
+ verifySmsCode: (request: Parameters<typeof Auth.verifySmsCode>[0], optionsOverride?: OptionalRequest<typeof Auth.verifySmsCode, 1>) => Promise<Auth.SmsLoginResponse>;
27
+ verifyPasswordChangeSmsAndUpdatePassword: (request: Parameters<typeof Auth.verifyPasswordChangeSmsAndUpdatePassword>[0], optionsOverride?: OptionalRequest<typeof Auth.verifyPasswordChangeSmsAndUpdatePassword, 1>) => Promise<Auth.PasswordChangeSmsResponse>;
28
+ registerWithSms: (request: Parameters<typeof Auth.registerWithSms>[0], optionsOverride?: OptionalRequest<typeof Auth.registerWithSms, 1>) => Promise<Auth.SmsLoginResponse>;
29
+ };
30
+ users: {
31
+ create: (request: Parameters<typeof User.createUser>[0]) => Promise<User.CreateUserResponse>;
32
+ getById: (userId?: Parameters<typeof User.getUserById>[0], request?: OptionalRequest<typeof User.getUserById, 1>) => Promise<User.CreateUserResponse>;
33
+ delete: (userId: Parameters<typeof User.deleteUser>[0]) => Promise<User.DeleteUserResponse>;
34
+ list: (request?: OptionalRequest<typeof User.listUsers, 0>) => Promise<User.ListUsersResponse>;
35
+ update: (userId: Parameters<typeof User.updateUser>[0], request: Parameters<typeof User.updateUser>[1]) => Promise<User.UpdateUserResponse>;
36
+ updatePassword: (request: Parameters<typeof User.updateUserPassword>[0]) => Promise<User.UpdateUserPasswordResponse>;
37
+ uploadAvatar: (userId: Parameters<typeof User.uploadAvatar>[0], file: Parameters<typeof User.uploadAvatar>[1]) => Promise<User.UploadAvatarResponse>;
38
+ getAvatarPresignedUrl: (userId: Parameters<typeof User.getAvatarPresignedUrl>[0]) => Promise<User.AvatarPresignedUrlResponse>;
39
+ updateFrozenStatus: (userId: Parameters<typeof User.updateUserFrozenStatus>[0], isFrozen: Parameters<typeof User.updateUserFrozenStatus>[1]) => Promise<User.UserFrozenStatusResponse>;
40
+ getFrozenStatus: (userId: Parameters<typeof User.getUserFrozenStatus>[0]) => Promise<User.UserFrozenStatusResponse>;
41
+ };
42
+ userGroups: {
43
+ get: (groupId: Parameters<typeof UserGroup.getUserGroup>[0]) => Promise<UserGroup.UserGroupInfo>;
44
+ list: (request?: OptionalRequest<typeof UserGroup.listUserGroups, 0>) => Promise<AppToken.PageResponse<UserGroup.UserGroupInfo>>;
45
+ create: (request: Parameters<typeof UserGroup.createUserGroup>[0]) => Promise<UserGroup.UserGroupInfo>;
46
+ update: (groupId: Parameters<typeof UserGroup.updateUserGroup>[0], request: Parameters<typeof UserGroup.updateUserGroup>[1]) => Promise<UserGroup.UserGroupInfo>;
47
+ delete: (groupId: Parameters<typeof UserGroup.deleteUserGroup>[0]) => Promise<void>;
48
+ listMembers: (groupId: Parameters<typeof UserGroup.listUserGroupMembers>[0], request?: OptionalRequest<typeof UserGroup.listUserGroupMembers, 1>) => Promise<AppToken.PageResponse<UserGroup.UserGroupMember>>;
49
+ addMembers: (groupId: Parameters<typeof UserGroup.addUserGroupMembers>[0], request: Parameters<typeof UserGroup.addUserGroupMembers>[1]) => Promise<void>;
50
+ removeMembers: (groupId: Parameters<typeof UserGroup.removeUserGroupMembers>[0], request: Parameters<typeof UserGroup.removeUserGroupMembers>[1]) => Promise<void>;
51
+ getUserGroups: (userId: Parameters<typeof UserGroup.getUserGroups>[0], request?: OptionalRequest<typeof UserGroup.getUserGroups, 1>) => Promise<UserGroup.UserGroupInfo[]>;
52
+ };
53
+ userAttributes: {
54
+ createDefinition: (request: Parameters<typeof UserAttribute.createUserAttributeDefinition>[0]) => Promise<UserAttribute.UserAttributeDefinition>;
55
+ updateDefinition: (definitionId: Parameters<typeof UserAttribute.updateUserAttributeDefinition>[0], request: Parameters<typeof UserAttribute.updateUserAttributeDefinition>[1]) => Promise<UserAttribute.UserAttributeDefinition>;
56
+ deleteDefinition: (definitionId: Parameters<typeof UserAttribute.deleteUserAttributeDefinition>[0]) => Promise<void>;
57
+ getDefinition: (definitionId: Parameters<typeof UserAttribute.getUserAttributeDefinition>[0]) => Promise<UserAttribute.UserAttributeDefinition>;
58
+ listDefinitions: (request?: OptionalRequest<typeof UserAttribute.listUserAttributeDefinitions, 0>) => Promise<AppToken.PageResponse<UserAttribute.UserAttributeDefinition>>;
59
+ listEnabledDefinitions: (request?: OptionalRequest<typeof UserAttribute.listEnabledUserAttributeDefinitions, 0>) => Promise<UserAttribute.UserAttributeDefinition[]>;
60
+ toggleDefinitionStatus: (definitionId: Parameters<typeof UserAttribute.toggleUserAttributeDefinitionStatus>[0], enabled: Parameters<typeof UserAttribute.toggleUserAttributeDefinitionStatus>[1]) => Promise<UserAttribute.UserAttributeDefinition>;
61
+ set: (userId: Parameters<typeof UserAttribute.setUserAttribute>[0], attributeDefinitionId: Parameters<typeof UserAttribute.setUserAttribute>[1], request: Parameters<typeof UserAttribute.setUserAttribute>[2]) => Promise<UserAttribute.UserAttributeDTO>;
62
+ get: (userId: Parameters<typeof UserAttribute.getUserAttribute>[0], definitionId: Parameters<typeof UserAttribute.getUserAttribute>[1]) => Promise<UserAttribute.UserAttributeDTO>;
63
+ delete: (userId: Parameters<typeof UserAttribute.deleteUserAttribute>[0], definitionId: Parameters<typeof UserAttribute.deleteUserAttribute>[1]) => Promise<void>;
64
+ getUserAttributes: (userId: Parameters<typeof UserAttribute.getUserAttributes>[0]) => Promise<UserAttribute.UserAttributeDTO[]>;
65
+ listUserAttributes: (userId: Parameters<typeof UserAttribute.listUserAttributes>[0], request?: OptionalRequest<typeof UserAttribute.listUserAttributes, 1>) => Promise<AppToken.PageResponse<UserAttribute.UserAttributeDTO>>;
66
+ listAttributeUsers: (definitionId: Parameters<typeof UserAttribute.listAttributeUsers>[0], request?: OptionalRequest<typeof UserAttribute.listAttributeUsers, 1>) => Promise<AppToken.PageResponse<UserAttribute.UserAttributeDTO>>;
67
+ listAll: (request?: OptionalRequest<typeof UserAttribute.listAllUserAttributes, 0>) => Promise<AppToken.PageResponse<UserAttribute.UserAttributeGroupedDTO>>;
68
+ };
69
+ cms: {
70
+ getFolder: (folderId: Parameters<typeof Cms.getFolder>[0]) => Promise<Cms.Folder>;
71
+ listFolders: (request?: OptionalRequest<typeof Cms.listFolders, 0>) => Promise<AppToken.PageResponse<Cms.Folder>>;
72
+ createFolder: (request: Parameters<typeof Cms.createFolder>[0]) => Promise<Cms.Folder>;
73
+ updateFolder: (folderId: Parameters<typeof Cms.updateFolder>[0], request: Parameters<typeof Cms.updateFolder>[1]) => Promise<Cms.Folder>;
74
+ deleteFolder: (folderId: Parameters<typeof Cms.deleteFolder>[0]) => Promise<void>;
75
+ getFile: (fileId: Parameters<typeof Cms.getFile>[0]) => Promise<Cms.File>;
76
+ listFiles: (request?: OptionalRequest<typeof Cms.listFiles, 0>) => Promise<AppToken.PageResponse<Cms.File>>;
77
+ createFile: (request: Parameters<typeof Cms.createFile>[0]) => Promise<Cms.File>;
78
+ updateFile: (fileId: Parameters<typeof Cms.updateFile>[0], request: Parameters<typeof Cms.updateFile>[1]) => Promise<Cms.File>;
79
+ updateFileContent: (fileId: Parameters<typeof Cms.updateFileContent>[0], content: Parameters<typeof Cms.updateFileContent>[1]) => Promise<Cms.File>;
80
+ deleteFile: (fileId: Parameters<typeof Cms.deleteFile>[0]) => Promise<void>;
81
+ getFilePresignedUrl: (fileId: Parameters<typeof Cms.getFilePresignedUrl>[0], expireTimeInSeconds?: Parameters<typeof Cms.getFilePresignedUrl>[1]) => Promise<{
82
+ fileId: string;
83
+ fileName: string;
84
+ ossKey: string;
85
+ presignedUrl: string;
86
+ expireTimeInSeconds: number;
87
+ }>;
88
+ batchGetFilePresignedUrl: (fileIds: Parameters<typeof Cms.batchGetFilePresignedUrl>[0], expireTimeInSeconds?: Parameters<typeof Cms.batchGetFilePresignedUrl>[1]) => Promise<{
89
+ fileId: string;
90
+ fileName?: string;
91
+ ossKey?: string;
92
+ presignedUrl?: string;
93
+ expireTimeInSeconds?: number;
94
+ error?: string;
95
+ }[]>;
96
+ getOssMetadata: (fileId: Parameters<typeof Cms.getOssMetadata>[0]) => Promise<{
97
+ ossKey: string;
98
+ contentType?: string;
99
+ contentLength?: number;
100
+ lastModified?: string;
101
+ etag?: string;
102
+ metadata?: Record<string, string>;
103
+ }>;
104
+ getUploadAuthorization: (request: Parameters<typeof Cms.getUploadAuthorization>[0]) => Promise<{
105
+ ossKey: string;
106
+ presignedUrl: string;
107
+ fileName: string;
108
+ fileType: string;
109
+ expireTimeInSeconds: number;
110
+ fileId: string;
111
+ }>;
112
+ getFileStsCredentials: (fileId: Parameters<typeof Cms.getFileStsCredentials>[0], fileExtension: Parameters<typeof Cms.getFileStsCredentials>[1], durationSeconds?: Parameters<typeof Cms.getFileStsCredentials>[2]) => Promise<{
113
+ credentials: {
114
+ tmpSecretId: string;
115
+ tmpSecretKey: string;
116
+ sessionToken: string;
117
+ bucket: string;
118
+ region: string;
119
+ };
120
+ startTime: number;
121
+ expiredTime: number;
122
+ bucket: string;
123
+ region: string;
124
+ allowPrefix: string;
125
+ }>;
126
+ fileUploadComplete: (fileId: Parameters<typeof Cms.fileUploadComplete>[0], request: Parameters<typeof Cms.fileUploadComplete>[1]) => Promise<{
127
+ message: string;
128
+ fileId: string;
129
+ }>;
130
+ setFilePreviewImage: (fileId: Parameters<typeof Cms.setFilePreviewImage>[0], request: Parameters<typeof Cms.setFilePreviewImage>[1]) => Promise<Cms.File>;
131
+ listFileAttachments: (fileId: Parameters<typeof Cms.listFileAttachments>[0], request?: OptionalRequest<typeof Cms.listFileAttachments, 1>) => Promise<AppToken.PageResponse<Cms.FileAttachment>>;
132
+ getFileAttachment: (fileId: Parameters<typeof Cms.getFileAttachment>[0], attachmentId: Parameters<typeof Cms.getFileAttachment>[1]) => Promise<Cms.FileAttachment>;
133
+ uploadFileAttachment: (fileId: Parameters<typeof Cms.uploadFileAttachment>[0], attachmentTypeId: Parameters<typeof Cms.uploadFileAttachment>[1], file: Parameters<typeof Cms.uploadFileAttachment>[2], remark?: Parameters<typeof Cms.uploadFileAttachment>[3]) => Promise<Cms.FileAttachment>;
134
+ deleteFileAttachment: (fileId: Parameters<typeof Cms.deleteFileAttachment>[0], attachmentId: Parameters<typeof Cms.deleteFileAttachment>[1]) => Promise<void>;
135
+ };
136
+ tasks: {
137
+ create: (request: Parameters<typeof Task.createUserTask>[0]) => Promise<Task.UserTask>;
138
+ batchCreate: (request: Parameters<typeof Task.batchCreateUserTasks>[0]) => Promise<Task.BatchCreateUserTasksResponse>;
139
+ get: (taskId: Parameters<typeof Task.getUserTask>[0]) => Promise<Task.UserTask>;
140
+ batchGet: (request: Parameters<typeof Task.batchGetUserTasks>[0]) => Promise<Task.UserTask[]>;
141
+ list: (request?: OptionalRequest<typeof Task.listUserTasks, 0>) => Promise<AppToken.PageResponse<Task.UserTask>>;
142
+ update: (taskId: Parameters<typeof Task.updateUserTask>[0], request: Parameters<typeof Task.updateUserTask>[1]) => Promise<Task.UserTask>;
143
+ delete: (taskId: Parameters<typeof Task.deleteUserTask>[0]) => Promise<void>;
144
+ getInput: (taskId: Parameters<typeof Task.getTaskInput>[0]) => Promise<Record<string, unknown>>;
145
+ getOutput: (taskId: Parameters<typeof Task.getTaskOutput>[0]) => Promise<Record<string, unknown>>;
146
+ updateInput: (taskId: Parameters<typeof Task.updateTaskInput>[0], input: Parameters<typeof Task.updateTaskInput>[1]) => Promise<Task.UserTask>;
147
+ updateOutput: (taskId: Parameters<typeof Task.updateTaskOutput>[0], output: Parameters<typeof Task.updateTaskOutput>[1]) => Promise<Task.UserTask>;
148
+ getStatus: (taskId: Parameters<typeof Task.getTaskStatus>[0]) => Promise<string>;
149
+ updateStatus: (taskId: Parameters<typeof Task.updateTaskStatus>[0], status: Parameters<typeof Task.updateTaskStatus>[1]) => Promise<Task.UserTask>;
150
+ getStatistics: (userId?: Parameters<typeof Task.getTaskStatistics>[0]) => Promise<Task.TaskStatistics>;
151
+ getFrozenStatus: (taskId: Parameters<typeof Task.getTaskFrozenStatus>[0]) => Promise<Task.TaskFrozenStatusResponse>;
152
+ updateFrozenStatus: (taskId: Parameters<typeof Task.updateTaskFrozenStatus>[0], isFrozen: Parameters<typeof Task.updateTaskFrozenStatus>[1]) => Promise<Task.TaskFrozenStatusResponse>;
153
+ listAttachments: (taskId: Parameters<typeof Task.listTaskAttachments>[0], request?: OptionalRequest<typeof Task.listTaskAttachments, 1>) => Promise<AppToken.PageResponse<Attachment.Attachment>>;
154
+ getAttachment: (taskId: Parameters<typeof Task.getTaskAttachment>[0], attachmentId: Parameters<typeof Task.getTaskAttachment>[1]) => Promise<Attachment.Attachment>;
155
+ uploadAttachment: (taskId: Parameters<typeof Task.uploadTaskAttachment>[0], attachmentTypeId: Parameters<typeof Task.uploadTaskAttachment>[1], file: Parameters<typeof Task.uploadTaskAttachment>[2], remark?: Parameters<typeof Task.uploadTaskAttachment>[3]) => Promise<Attachment.Attachment>;
156
+ deleteAttachment: (taskId: Parameters<typeof Task.deleteTaskAttachment>[0], attachmentId: Parameters<typeof Task.deleteTaskAttachment>[1]) => Promise<void>;
157
+ };
158
+ taskTypes: {
159
+ create: (request: Parameters<typeof TaskType.createTaskType>[0]) => Promise<TaskType.TaskType>;
160
+ update: (taskTypeId: Parameters<typeof TaskType.updateTaskType>[0], request: Parameters<typeof TaskType.updateTaskType>[1]) => Promise<TaskType.TaskType>;
161
+ delete: (taskTypeId: Parameters<typeof TaskType.deleteTaskType>[0]) => Promise<void>;
162
+ get: (taskTypeId: Parameters<typeof TaskType.getTaskType>[0]) => Promise<TaskType.TaskType>;
163
+ list: (request?: OptionalRequest<typeof TaskType.listTaskTypes, 0>) => Promise<AppToken.PageResponse<TaskType.TaskType>>;
164
+ listEnabled: (request?: OptionalRequest<typeof TaskType.listEnabledTaskTypes, 0>) => Promise<TaskType.TaskType[]>;
165
+ };
166
+ rbac: {
167
+ getRole: (roleId: Parameters<typeof Rbac.getRole>[0]) => Promise<Rbac.Role>;
168
+ listRoles: (request?: OptionalRequest<typeof Rbac.listRoles, 0>) => Promise<AppToken.PageResponse<Rbac.Role>>;
169
+ createRole: (request: Parameters<typeof Rbac.createRole>[0]) => Promise<Rbac.Role>;
170
+ updateRole: (roleId: Parameters<typeof Rbac.updateRole>[0], request: Parameters<typeof Rbac.updateRole>[1]) => Promise<Rbac.Role>;
171
+ deleteRole: (roleId: Parameters<typeof Rbac.deleteRole>[0]) => Promise<void>;
172
+ getPrivilege: (privilegeId: Parameters<typeof Rbac.getPrivilege>[0]) => Promise<Rbac.Privilege>;
173
+ listPrivileges: (request?: OptionalRequest<typeof Rbac.listPrivileges, 0>) => Promise<AppToken.PageResponse<Rbac.Privilege>>;
174
+ createPrivilege: (request: Parameters<typeof Rbac.createPrivilege>[0]) => Promise<Rbac.Privilege>;
175
+ updatePrivilege: (privilegeId: Parameters<typeof Rbac.updatePrivilege>[0], request: Parameters<typeof Rbac.updatePrivilege>[1]) => Promise<Rbac.Privilege>;
176
+ deletePrivilege: (privilegeId: Parameters<typeof Rbac.deletePrivilege>[0]) => Promise<void>;
177
+ getUserRoles: (userId: Parameters<typeof Rbac.getUserRoles>[0]) => Promise<Rbac.Role[]>;
178
+ assignRolesToUser: (userId: Parameters<typeof Rbac.assignRolesToUser>[0], request: Parameters<typeof Rbac.assignRolesToUser>[1]) => Promise<Rbac.Role[]>;
179
+ unassignRolesFromUser: (userId: Parameters<typeof Rbac.unassignRolesFromUser>[0], request: Parameters<typeof Rbac.unassignRolesFromUser>[1]) => Promise<void>;
180
+ getUserPrivileges: (userId: Parameters<typeof Rbac.getUserPrivileges>[0]) => Promise<Rbac.Privilege[]>;
181
+ assignPrivilegesToUser: (userId: Parameters<typeof Rbac.assignPrivilegesToUser>[0], request: Parameters<typeof Rbac.assignPrivilegesToUser>[1]) => Promise<Rbac.Privilege[]>;
182
+ unassignPrivilegesFromUser: (userId: Parameters<typeof Rbac.unassignPrivilegesFromUser>[0], request: Parameters<typeof Rbac.unassignPrivilegesFromUser>[1]) => Promise<void>;
183
+ assignPrivilegesToRole: (roleId: Parameters<typeof Rbac.assignPrivilegesToRole>[0], request: Parameters<typeof Rbac.assignPrivilegesToRole>[1]) => Promise<Rbac.Privilege[]>;
184
+ unassignPrivilegesFromRole: (roleId: Parameters<typeof Rbac.unassignPrivilegesFromRole>[0], request: Parameters<typeof Rbac.unassignPrivilegesFromRole>[1]) => Promise<void>;
185
+ };
186
+ acl: {
187
+ getRecord: (recordId: Parameters<typeof Acl.getAclRecord>[0]) => Promise<Acl.AclRecord>;
188
+ listRecords: (request?: OptionalRequest<typeof Acl.listAclRecords, 0>) => Promise<AppToken.PageResponse<Acl.AclRecord>>;
189
+ createRecord: (request: Parameters<typeof Acl.createAclRecord>[0]) => Promise<Acl.AclRecord>;
190
+ batchCreateRecords: (request: Parameters<typeof Acl.batchCreateAclRecords>[0]) => Promise<Acl.AclBatchCreateResponse>;
191
+ updateRecord: (recordId: Parameters<typeof Acl.updateAclRecord>[0], request: Parameters<typeof Acl.updateAclRecord>[1]) => Promise<Acl.AclRecord>;
192
+ deleteRecord: (recordId: Parameters<typeof Acl.deleteAclRecord>[0]) => Promise<void>;
193
+ getTemplate: (templateId: Parameters<typeof Acl.getAclTemplate>[0]) => Promise<Acl.AclTemplate>;
194
+ listTemplates: (request?: OptionalRequest<typeof Acl.listAclTemplates, 0>) => Promise<AppToken.PageResponse<Acl.AclTemplate>>;
195
+ createTemplate: (request: Parameters<typeof Acl.createAclTemplate>[0]) => Promise<Acl.AclTemplate>;
196
+ updateTemplate: (templateId: Parameters<typeof Acl.updateAclTemplate>[0], request: Parameters<typeof Acl.updateAclTemplate>[1]) => Promise<Acl.AclTemplate>;
197
+ deleteTemplate: (templateId: Parameters<typeof Acl.deleteAclTemplate>[0]) => Promise<void>;
198
+ listRecordAttachments: (recordId: Parameters<typeof Acl.listAclRecordAttachments>[0], request?: OptionalRequest<typeof Acl.listAclRecordAttachments, 1>) => Promise<AppToken.PageResponse<Attachment.Attachment>>;
199
+ getRecordAttachment: (recordId: Parameters<typeof Acl.getAclRecordAttachment>[0], attachmentId: Parameters<typeof Acl.getAclRecordAttachment>[1]) => Promise<Attachment.Attachment>;
200
+ uploadRecordAttachment: (recordId: Parameters<typeof Acl.uploadAclRecordAttachment>[0], attachmentTypeId: Parameters<typeof Acl.uploadAclRecordAttachment>[1], file: Parameters<typeof Acl.uploadAclRecordAttachment>[2], remark?: Parameters<typeof Acl.uploadAclRecordAttachment>[3]) => Promise<Attachment.Attachment>;
201
+ deleteRecordAttachment: (recordId: Parameters<typeof Acl.deleteAclRecordAttachment>[0], attachmentId: Parameters<typeof Acl.deleteAclRecordAttachment>[1]) => Promise<void>;
202
+ };
203
+ attachments: {
204
+ get: (attachmentId: Parameters<typeof Attachment.getAttachment>[0]) => Promise<Attachment.Attachment>;
205
+ listByRef: (request: Request<typeof Attachment.listAttachmentsByRef, 0>) => Promise<AppToken.PageResponse<Attachment.Attachment>>;
206
+ upload: (request: Parameters<typeof Attachment.uploadAttachment>[0]) => Promise<Attachment.Attachment>;
207
+ delete: (request: Parameters<typeof Attachment.deleteAttachment>[0]) => Promise<void>;
208
+ getUploadUrl: (request: Parameters<typeof Attachment.getAttachmentUploadUrl>[0]) => Promise<Attachment.UploadAuthorizationResponse>;
209
+ completeUpload: (attachmentId: Parameters<typeof Attachment.completeAttachmentUpload>[0], request: Parameters<typeof Attachment.completeAttachmentUpload>[1]) => Promise<Attachment.Attachment>;
210
+ getDownloadUrl: (request: Parameters<typeof Attachment.getAttachmentDownloadUrl>[0]) => Promise<Attachment.DownloadUrlResponse>;
211
+ };
212
+ attachmentTypes: {
213
+ list: (request?: OptionalRequest<typeof AttachmentType.listAttachmentTypes, 0>) => Promise<AppToken.PageResponse<AttachmentType.AttachmentType>>;
214
+ listByRef: (request: Request<typeof AttachmentType.listAttachmentTypesByRef, 0>) => Promise<AppToken.PageResponse<AttachmentType.AttachmentType>>;
215
+ get: (typeId: Parameters<typeof AttachmentType.getAttachmentType>[0]) => Promise<AttachmentType.AttachmentType>;
216
+ create: (request: Parameters<typeof AttachmentType.createAttachmentType>[0]) => Promise<AttachmentType.AttachmentType>;
217
+ update: (typeId: Parameters<typeof AttachmentType.updateAttachmentType>[0], request: Parameters<typeof AttachmentType.updateAttachmentType>[1]) => Promise<AttachmentType.AttachmentType>;
218
+ delete: (typeId: Parameters<typeof AttachmentType.deleteAttachmentType>[0]) => Promise<void>;
219
+ };
220
+ dashboard: {
221
+ getView: (viewName: Parameters<typeof Dashboard.getDashboardView>[0], request?: OptionalRequest<typeof Dashboard.getDashboardView, 1>) => Promise<AppToken.PageResponse<Dashboard.DashboardViewRow>>;
222
+ queryView: (request: Parameters<typeof Dashboard.queryDashboardView>[0]) => Promise<Dashboard.DashboardViewQueryResponse>;
223
+ };
224
+ appTokens: {
225
+ list: (request?: OptionalRequest<typeof AppToken.listAppTokens, 0>) => Promise<AppToken.PageResponse<AppToken.AppToken>>;
226
+ };
227
+ };
228
+ export type TaleAppClient = ReturnType<typeof createTaleAppClient>;
229
+ export {};
@@ -0,0 +1,187 @@
1
+ import * as Acl from "./acl/index.js";
2
+ import * as AppToken from "./app-token/index.js";
3
+ import * as Attachment from "./attachment/index.js";
4
+ import * as AttachmentType from "./attachment-type/index.js";
5
+ import * as Auth from "./auth/index.js";
6
+ import * as Cms from "./cms/index.js";
7
+ import * as Dashboard from "./dashboard/index.js";
8
+ import * as Rbac from "./rbac/index.js";
9
+ import * as Task from "./task/index.js";
10
+ import * as TaskType from "./task-type/index.js";
11
+ import * as User from "./user/index.js";
12
+ import * as UserAttribute from "./user-attribute/index.js";
13
+ import * as UserGroup from "./user-group/index.js";
14
+ export function createTaleAppClient(options) {
15
+ const appOptions = () => ({ ...options });
16
+ const mergeRequest = (request) => ({ ...(request ?? {}), ...appOptions() });
17
+ return {
18
+ auth: {
19
+ login: (credentials, request) => Auth.login(credentials, {
20
+ ...(request ?? {}),
21
+ baseUrl: options.baseUrl,
22
+ }),
23
+ validateToken: (token, request) => Auth.validateToken(token, {
24
+ ...(request ?? {}),
25
+ baseUrl: options.baseUrl,
26
+ }),
27
+ loginWithSms: (phone, request) => Auth.loginWithSms(phone, mergeRequest(request)),
28
+ verifySmsCode: (request, optionsOverride) => Auth.verifySmsCode(request, mergeRequest(optionsOverride)),
29
+ verifyPasswordChangeSmsAndUpdatePassword: (request, optionsOverride) => Auth.verifyPasswordChangeSmsAndUpdatePassword(request, mergeRequest(optionsOverride)),
30
+ registerWithSms: (request, optionsOverride) => Auth.registerWithSms(request, mergeRequest(optionsOverride)),
31
+ },
32
+ users: {
33
+ create: (request) => User.createUser(request, appOptions()),
34
+ getById: (userId, request) => User.getUserById(userId, mergeRequest(request)),
35
+ delete: (userId) => User.deleteUser(userId, appOptions()),
36
+ list: (request) => User.listUsers(mergeRequest(request)),
37
+ update: (userId, request) => User.updateUser(userId, request, appOptions()),
38
+ updatePassword: (request) => User.updateUserPassword(request, appOptions()),
39
+ uploadAvatar: (userId, file) => User.uploadAvatar(userId, file, appOptions()),
40
+ getAvatarPresignedUrl: (userId) => User.getAvatarPresignedUrl(userId, appOptions()),
41
+ updateFrozenStatus: (userId, isFrozen) => User.updateUserFrozenStatus(userId, isFrozen, appOptions()),
42
+ getFrozenStatus: (userId) => User.getUserFrozenStatus(userId, appOptions()),
43
+ },
44
+ userGroups: {
45
+ get: (groupId) => UserGroup.getUserGroup(groupId, appOptions()),
46
+ list: (request) => UserGroup.listUserGroups(mergeRequest(request)),
47
+ create: (request) => UserGroup.createUserGroup(request, appOptions()),
48
+ update: (groupId, request) => UserGroup.updateUserGroup(groupId, request, appOptions()),
49
+ delete: (groupId) => UserGroup.deleteUserGroup(groupId, appOptions()),
50
+ listMembers: (groupId, request) => UserGroup.listUserGroupMembers(groupId, mergeRequest(request)),
51
+ addMembers: (groupId, request) => UserGroup.addUserGroupMembers(groupId, request, appOptions()),
52
+ removeMembers: (groupId, request) => UserGroup.removeUserGroupMembers(groupId, request, appOptions()),
53
+ getUserGroups: (userId, request) => UserGroup.getUserGroups(userId, mergeRequest(request)),
54
+ },
55
+ userAttributes: {
56
+ createDefinition: (request) => UserAttribute.createUserAttributeDefinition(request, appOptions()),
57
+ updateDefinition: (definitionId, request) => UserAttribute.updateUserAttributeDefinition(definitionId, request, appOptions()),
58
+ deleteDefinition: (definitionId) => UserAttribute.deleteUserAttributeDefinition(definitionId, appOptions()),
59
+ getDefinition: (definitionId) => UserAttribute.getUserAttributeDefinition(definitionId, appOptions()),
60
+ listDefinitions: (request) => UserAttribute.listUserAttributeDefinitions(mergeRequest(request)),
61
+ listEnabledDefinitions: (request) => UserAttribute.listEnabledUserAttributeDefinitions(mergeRequest(request)),
62
+ toggleDefinitionStatus: (definitionId, enabled) => UserAttribute.toggleUserAttributeDefinitionStatus(definitionId, enabled, appOptions()),
63
+ set: (userId, attributeDefinitionId, request) => UserAttribute.setUserAttribute(userId, attributeDefinitionId, request, appOptions()),
64
+ get: (userId, definitionId) => UserAttribute.getUserAttribute(userId, definitionId, appOptions()),
65
+ delete: (userId, definitionId) => UserAttribute.deleteUserAttribute(userId, definitionId, appOptions()),
66
+ getUserAttributes: (userId) => UserAttribute.getUserAttributes(userId, appOptions()),
67
+ listUserAttributes: (userId, request) => UserAttribute.listUserAttributes(userId, mergeRequest(request)),
68
+ listAttributeUsers: (definitionId, request) => UserAttribute.listAttributeUsers(definitionId, mergeRequest(request)),
69
+ listAll: (request) => UserAttribute.listAllUserAttributes(mergeRequest(request)),
70
+ },
71
+ cms: {
72
+ getFolder: (folderId) => Cms.getFolder(folderId, appOptions()),
73
+ listFolders: (request) => Cms.listFolders(mergeRequest(request)),
74
+ createFolder: (request) => Cms.createFolder(request, appOptions()),
75
+ updateFolder: (folderId, request) => Cms.updateFolder(folderId, request, appOptions()),
76
+ deleteFolder: (folderId) => Cms.deleteFolder(folderId, appOptions()),
77
+ getFile: (fileId) => Cms.getFile(fileId, appOptions()),
78
+ listFiles: (request) => Cms.listFiles(mergeRequest(request)),
79
+ createFile: (request) => Cms.createFile(request, appOptions()),
80
+ updateFile: (fileId, request) => Cms.updateFile(fileId, request, appOptions()),
81
+ updateFileContent: (fileId, content) => Cms.updateFileContent(fileId, content, appOptions()),
82
+ deleteFile: (fileId) => Cms.deleteFile(fileId, appOptions()),
83
+ getFilePresignedUrl: (fileId, expireTimeInSeconds) => Cms.getFilePresignedUrl(fileId, expireTimeInSeconds, appOptions()),
84
+ batchGetFilePresignedUrl: (fileIds, expireTimeInSeconds) => Cms.batchGetFilePresignedUrl(fileIds, expireTimeInSeconds, appOptions()),
85
+ getOssMetadata: (fileId) => Cms.getOssMetadata(fileId, appOptions()),
86
+ getUploadAuthorization: (request) => Cms.getUploadAuthorization(request, appOptions()),
87
+ getFileStsCredentials: (fileId, fileExtension, durationSeconds) => Cms.getFileStsCredentials(fileId, fileExtension, durationSeconds, appOptions()),
88
+ fileUploadComplete: (fileId, request) => Cms.fileUploadComplete(fileId, request, appOptions()),
89
+ setFilePreviewImage: (fileId, request) => Cms.setFilePreviewImage(fileId, request, appOptions()),
90
+ listFileAttachments: (fileId, request) => Cms.listFileAttachments(fileId, mergeRequest(request)),
91
+ getFileAttachment: (fileId, attachmentId) => Cms.getFileAttachment(fileId, attachmentId, appOptions()),
92
+ uploadFileAttachment: (fileId, attachmentTypeId, file, remark) => Cms.uploadFileAttachment(fileId, attachmentTypeId, file, remark, appOptions()),
93
+ deleteFileAttachment: (fileId, attachmentId) => Cms.deleteFileAttachment(fileId, attachmentId, appOptions()),
94
+ },
95
+ tasks: {
96
+ create: (request) => Task.createUserTask(request, appOptions()),
97
+ batchCreate: (request) => Task.batchCreateUserTasks(request, appOptions()),
98
+ get: (taskId) => Task.getUserTask(taskId, appOptions()),
99
+ batchGet: (request) => Task.batchGetUserTasks(request, appOptions()),
100
+ list: (request) => Task.listUserTasks(mergeRequest(request)),
101
+ update: (taskId, request) => Task.updateUserTask(taskId, request, appOptions()),
102
+ delete: (taskId) => Task.deleteUserTask(taskId, appOptions()),
103
+ getInput: (taskId) => Task.getTaskInput(taskId, appOptions()),
104
+ getOutput: (taskId) => Task.getTaskOutput(taskId, appOptions()),
105
+ updateInput: (taskId, input) => Task.updateTaskInput(taskId, input, appOptions()),
106
+ updateOutput: (taskId, output) => Task.updateTaskOutput(taskId, output, appOptions()),
107
+ getStatus: (taskId) => Task.getTaskStatus(taskId, appOptions()),
108
+ updateStatus: (taskId, status) => Task.updateTaskStatus(taskId, status, appOptions()),
109
+ getStatistics: (userId) => Task.getTaskStatistics(userId, appOptions()),
110
+ getFrozenStatus: (taskId) => Task.getTaskFrozenStatus(taskId, appOptions()),
111
+ updateFrozenStatus: (taskId, isFrozen) => Task.updateTaskFrozenStatus(taskId, isFrozen, appOptions()),
112
+ listAttachments: (taskId, request) => Task.listTaskAttachments(taskId, mergeRequest(request)),
113
+ getAttachment: (taskId, attachmentId) => Task.getTaskAttachment(taskId, attachmentId, appOptions()),
114
+ uploadAttachment: (taskId, attachmentTypeId, file, remark) => Task.uploadTaskAttachment(taskId, attachmentTypeId, file, remark, appOptions()),
115
+ deleteAttachment: (taskId, attachmentId) => Task.deleteTaskAttachment(taskId, attachmentId, appOptions()),
116
+ },
117
+ taskTypes: {
118
+ create: (request) => TaskType.createTaskType(request, appOptions()),
119
+ update: (taskTypeId, request) => TaskType.updateTaskType(taskTypeId, request, appOptions()),
120
+ delete: (taskTypeId) => TaskType.deleteTaskType(taskTypeId, appOptions()),
121
+ get: (taskTypeId) => TaskType.getTaskType(taskTypeId, appOptions()),
122
+ list: (request) => TaskType.listTaskTypes(mergeRequest(request)),
123
+ listEnabled: (request) => TaskType.listEnabledTaskTypes(mergeRequest(request)),
124
+ },
125
+ rbac: {
126
+ getRole: (roleId) => Rbac.getRole(roleId, appOptions()),
127
+ listRoles: (request) => Rbac.listRoles(mergeRequest(request)),
128
+ createRole: (request) => Rbac.createRole(request, appOptions()),
129
+ updateRole: (roleId, request) => Rbac.updateRole(roleId, request, appOptions()),
130
+ deleteRole: (roleId) => Rbac.deleteRole(roleId, appOptions()),
131
+ getPrivilege: (privilegeId) => Rbac.getPrivilege(privilegeId, appOptions()),
132
+ listPrivileges: (request) => Rbac.listPrivileges(mergeRequest(request)),
133
+ createPrivilege: (request) => Rbac.createPrivilege(request, appOptions()),
134
+ updatePrivilege: (privilegeId, request) => Rbac.updatePrivilege(privilegeId, request, appOptions()),
135
+ deletePrivilege: (privilegeId) => Rbac.deletePrivilege(privilegeId, appOptions()),
136
+ getUserRoles: (userId) => Rbac.getUserRoles(userId, appOptions()),
137
+ assignRolesToUser: (userId, request) => Rbac.assignRolesToUser(userId, request, appOptions()),
138
+ unassignRolesFromUser: (userId, request) => Rbac.unassignRolesFromUser(userId, request, appOptions()),
139
+ getUserPrivileges: (userId) => Rbac.getUserPrivileges(userId, appOptions()),
140
+ assignPrivilegesToUser: (userId, request) => Rbac.assignPrivilegesToUser(userId, request, appOptions()),
141
+ unassignPrivilegesFromUser: (userId, request) => Rbac.unassignPrivilegesFromUser(userId, request, appOptions()),
142
+ assignPrivilegesToRole: (roleId, request) => Rbac.assignPrivilegesToRole(roleId, request, appOptions()),
143
+ unassignPrivilegesFromRole: (roleId, request) => Rbac.unassignPrivilegesFromRole(roleId, request, appOptions()),
144
+ },
145
+ acl: {
146
+ getRecord: (recordId) => Acl.getAclRecord(recordId, appOptions()),
147
+ listRecords: (request) => Acl.listAclRecords(mergeRequest(request)),
148
+ createRecord: (request) => Acl.createAclRecord(request, appOptions()),
149
+ batchCreateRecords: (request) => Acl.batchCreateAclRecords(request, appOptions()),
150
+ updateRecord: (recordId, request) => Acl.updateAclRecord(recordId, request, appOptions()),
151
+ deleteRecord: (recordId) => Acl.deleteAclRecord(recordId, appOptions()),
152
+ getTemplate: (templateId) => Acl.getAclTemplate(templateId, appOptions()),
153
+ listTemplates: (request) => Acl.listAclTemplates(mergeRequest(request)),
154
+ createTemplate: (request) => Acl.createAclTemplate(request, appOptions()),
155
+ updateTemplate: (templateId, request) => Acl.updateAclTemplate(templateId, request, appOptions()),
156
+ deleteTemplate: (templateId) => Acl.deleteAclTemplate(templateId, appOptions()),
157
+ listRecordAttachments: (recordId, request) => Acl.listAclRecordAttachments(recordId, mergeRequest(request)),
158
+ getRecordAttachment: (recordId, attachmentId) => Acl.getAclRecordAttachment(recordId, attachmentId, appOptions()),
159
+ uploadRecordAttachment: (recordId, attachmentTypeId, file, remark) => Acl.uploadAclRecordAttachment(recordId, attachmentTypeId, file, remark, appOptions()),
160
+ deleteRecordAttachment: (recordId, attachmentId) => Acl.deleteAclRecordAttachment(recordId, attachmentId, appOptions()),
161
+ },
162
+ attachments: {
163
+ get: (attachmentId) => Attachment.getAttachment(attachmentId, appOptions()),
164
+ listByRef: (request) => Attachment.listAttachmentsByRef(mergeRequest(request)),
165
+ upload: (request) => Attachment.uploadAttachment(mergeRequest(request)),
166
+ delete: (request) => Attachment.deleteAttachment(mergeRequest(request)),
167
+ getUploadUrl: (request) => Attachment.getAttachmentUploadUrl(mergeRequest(request)),
168
+ completeUpload: (attachmentId, request) => Attachment.completeAttachmentUpload(attachmentId, request, appOptions()),
169
+ getDownloadUrl: (request) => Attachment.getAttachmentDownloadUrl(mergeRequest(request)),
170
+ },
171
+ attachmentTypes: {
172
+ list: (request) => AttachmentType.listAttachmentTypes(mergeRequest(request)),
173
+ listByRef: (request) => AttachmentType.listAttachmentTypesByRef(mergeRequest(request)),
174
+ get: (typeId) => AttachmentType.getAttachmentType(typeId, appOptions()),
175
+ create: (request) => AttachmentType.createAttachmentType(request, appOptions()),
176
+ update: (typeId, request) => AttachmentType.updateAttachmentType(typeId, request, appOptions()),
177
+ delete: (typeId) => AttachmentType.deleteAttachmentType(typeId, appOptions()),
178
+ },
179
+ dashboard: {
180
+ getView: (viewName, request) => Dashboard.getDashboardView(viewName, mergeRequest(request)),
181
+ queryView: (request) => Dashboard.queryDashboardView(request, appOptions()),
182
+ },
183
+ appTokens: {
184
+ list: (request) => AppToken.listAppTokens(mergeRequest(request)),
185
+ },
186
+ };
187
+ }
@@ -1,5 +1,5 @@
1
- import type { LoginRequest, LoginOptions, LoginWithSmsOptions, VerifySmsOptions, AppInfo, AuthUser, UserToken, AuthRole, AuthPrivilege, UserGroup, AuthUserLoginMethod, LoginResponse, LoginJson, SendSmsResponse, SendSmsJson, VerifySmsRequest, SmsLoginResponse, SmsLoginJson } from "./types.js";
2
- export type { LoginRequest, LoginOptions, LoginWithSmsOptions, VerifySmsOptions, AppInfo, AuthUser, UserToken, AuthRole, AuthPrivilege, UserGroup, AuthUserLoginMethod, LoginResponse, LoginJson, SendSmsResponse, SendSmsJson, VerifySmsRequest, SmsLoginResponse, SmsLoginJson, };
1
+ import type { LoginRequest, LoginOptions, LoginWithSmsOptions, VerifySmsOptions, AppInfo, AuthUser, UserToken, AuthRole, AuthPrivilege, UserGroup, AuthUserLoginMethod, LoginResponse, LoginJson, LoginOrRegisterSmsType, PasswordChangeSmsType, PasswordChangeSmsSendType, SmsType, SendSmsResponse, SendSmsJson, VerifySmsRequest, PasswordChangeSmsRequest, PasswordChangeSmsResponse, PasswordChangeSmsJson, SmsLoginResponse, SmsLoginJson } from "./types.js";
2
+ export type { LoginRequest, LoginOptions, LoginWithSmsOptions, VerifySmsOptions, AppInfo, AuthUser, UserToken, AuthRole, AuthPrivilege, UserGroup, AuthUserLoginMethod, LoginResponse, LoginJson, LoginOrRegisterSmsType, PasswordChangeSmsType, PasswordChangeSmsSendType, SmsType, SendSmsResponse, SendSmsJson, VerifySmsRequest, PasswordChangeSmsRequest, PasswordChangeSmsResponse, PasswordChangeSmsJson, SmsLoginResponse, SmsLoginJson, };
3
3
  /**
4
4
  * Authenticates a user with username and password.
5
5
  *
@@ -99,7 +99,7 @@ export declare function validateToken(token: string, options?: {
99
99
  * try {
100
100
  * const result = await loginWithSms('+8613800138000');
101
101
  * console.log('SMS sent:', result.smsId);
102
- * console.log('Type:', result.type); // 'login' or 'register'
102
+ * console.log('Type:', result.type); // 'login', 'register', or 'changePassword'
103
103
  * } catch (error) {
104
104
  * console.error('SMS sending failed:', error.message);
105
105
  * }
@@ -134,6 +134,17 @@ export declare function loginWithSms(phone: string, options?: LoginWithSmsOption
134
134
  * ```
135
135
  */
136
136
  export declare function verifySmsCode(request: VerifySmsRequest, options?: VerifySmsOptions): Promise<SmsLoginResponse>;
137
+ /**
138
+ * Verifies password-change SMS code and updates user password.
139
+ *
140
+ * @param request - Password change SMS verification request
141
+ * @param options - Optional configuration for the request
142
+ * @returns Promise resolving to password update result
143
+ * @throws {ConfigurationError} When required environment variables are missing
144
+ * @throws {ApiError} When verification or password update fails
145
+ * @throws {NetworkError} When network request fails
146
+ */
147
+ export declare function verifyPasswordChangeSmsAndUpdatePassword(request: PasswordChangeSmsRequest, options?: VerifySmsOptions): Promise<PasswordChangeSmsResponse>;
137
148
  /**
138
149
  * Registers a new user with SMS verification and optional additional information.
139
150
  *
@@ -1,5 +1,16 @@
1
1
  import { getAppToken } from "../token.js";
2
2
  import { ApiError, ConfigurationError, NetworkError } from "../errors.js";
3
+ const LOGIN_OR_REGISTER_SMS_TYPES = [
4
+ "login",
5
+ "register",
6
+ ];
7
+ const PASSWORD_CHANGE_SMS_TYPES = [
8
+ "changePassword",
9
+ "reset_password",
10
+ ];
11
+ const PASSWORD_CHANGE_SMS_SEND_TYPES = [
12
+ "changePassword",
13
+ ];
3
14
  /**
4
15
  * Authenticates a user with username and password.
5
16
  *
@@ -224,7 +235,7 @@ export async function validateToken(token, options) {
224
235
  * try {
225
236
  * const result = await loginWithSms('+8613800138000');
226
237
  * console.log('SMS sent:', result.smsId);
227
- * console.log('Type:', result.type); // 'login' or 'register'
238
+ * console.log('Type:', result.type); // 'login', 'register', or 'changePassword'
228
239
  * } catch (error) {
229
240
  * console.error('SMS sending failed:', error.message);
230
241
  * }
@@ -237,14 +248,21 @@ export async function loginWithSms(phone, options) {
237
248
  }
238
249
  // Determine base URL from environment variables
239
250
  const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
240
- const base = env?.TALE_BASE_URL;
251
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL;
241
252
  if (!base) {
242
253
  throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
243
254
  }
255
+ if (options?.smsType &&
256
+ !PASSWORD_CHANGE_SMS_SEND_TYPES.includes(options.smsType)) {
257
+ throw new ApiError('smsType must be "changePassword"', 400, "9400");
258
+ }
244
259
  // Use provided app token or get one from token service
245
- const authToken = options?.appToken ?? (await getAppToken());
260
+ const authToken = options?.appToken ?? (await getAppToken(options));
246
261
  const url = new URL(String(base).replace(/\/+$/, "") + "/auth/v2/sms/login-or-register");
247
262
  url.searchParams.append("phone", phone.trim());
263
+ if (options?.smsType) {
264
+ url.searchParams.append("smsType", options.smsType);
265
+ }
248
266
  let response;
249
267
  try {
250
268
  response = await globalThis.fetch(url.toString(), {
@@ -332,8 +350,9 @@ export async function verifySmsCode(request, options) {
332
350
  if (!request.smsId || request.smsId.trim() === "") {
333
351
  throw new ApiError("smsId is required", 400, "9400");
334
352
  }
335
- if (!request.smsType || !["login", "register"].includes(request.smsType)) {
336
- throw new ApiError('smsType must be "login" or "register"', 400, "9400");
353
+ if (!request.smsType ||
354
+ !LOGIN_OR_REGISTER_SMS_TYPES.includes(request.smsType)) {
355
+ throw new ApiError('smsType must be "login" or "register". Use verifyPasswordChangeSmsAndUpdatePassword for password changes', 400, "9400");
337
356
  }
338
357
  if (!request.verificationCode || request.verificationCode.trim() === "") {
339
358
  throw new ApiError("verificationCode is required", 400, "9400");
@@ -409,6 +428,91 @@ export async function verifySmsCode(request, options) {
409
428
  };
410
429
  return smsLoginResponse;
411
430
  }
431
+ /**
432
+ * Verifies password-change SMS code and updates user password.
433
+ *
434
+ * @param request - Password change SMS verification request
435
+ * @param options - Optional configuration for the request
436
+ * @returns Promise resolving to password update result
437
+ * @throws {ConfigurationError} When required environment variables are missing
438
+ * @throws {ApiError} When verification or password update fails
439
+ * @throws {NetworkError} When network request fails
440
+ */
441
+ export async function verifyPasswordChangeSmsAndUpdatePassword(request, options) {
442
+ if (!request.smsId || request.smsId.trim() === "") {
443
+ throw new ApiError("smsId is required", 400, "9400");
444
+ }
445
+ if (!request.smsType ||
446
+ !PASSWORD_CHANGE_SMS_TYPES.includes(request.smsType)) {
447
+ throw new ApiError('smsType must be "changePassword" or "reset_password"', 400, "9400");
448
+ }
449
+ if (!request.verificationCode || request.verificationCode.trim() === "") {
450
+ throw new ApiError("verificationCode is required", 400, "9400");
451
+ }
452
+ if (!request.passwordEncrypted ||
453
+ request.passwordEncrypted.trim() === "") {
454
+ throw new ApiError("passwordEncrypted is required", 400, "9400");
455
+ }
456
+ const env = globalThis?.process?.env ?? import.meta?.env ?? undefined;
457
+ const base = options?.baseUrl ?? env?.TALE_BASE_URL ?? undefined;
458
+ if (!base) {
459
+ throw new ConfigurationError("Missing required environment variable: TALE_BASE_URL");
460
+ }
461
+ const authToken = options?.appToken ?? (await getAppToken(options));
462
+ const url = String(base).replace(/\/+$/, "") + "/auth/v2/sms/password/verify";
463
+ const requestBody = {
464
+ smsId: request.smsId.trim(),
465
+ smsType: request.smsType,
466
+ verificationCode: request.verificationCode.trim(),
467
+ passwordEncrypted: request.passwordEncrypted,
468
+ };
469
+ let response;
470
+ try {
471
+ response = await globalThis.fetch(url, {
472
+ method: "POST",
473
+ headers: {
474
+ "x-t-token": authToken,
475
+ "Content-Type": "application/json",
476
+ },
477
+ body: JSON.stringify(requestBody),
478
+ });
479
+ }
480
+ catch (error) {
481
+ throw new NetworkError(`Failed to verify password change SMS: ${error instanceof Error ? error.message : "Unknown error"}`);
482
+ }
483
+ let json;
484
+ try {
485
+ const responseJson = await response.json();
486
+ json = responseJson;
487
+ }
488
+ catch (error) {
489
+ throw new ApiError(`Failed to parse password change SMS response: ${error instanceof Error ? error.message : "Invalid JSON"}`, response.status);
490
+ }
491
+ if (response.status === 400) {
492
+ const errorMsg = typeof json === "object" &&
493
+ json !== null &&
494
+ ("message" in json || "msg" in json)
495
+ ? String(json.message || json.msg)
496
+ : "Password change SMS verification failed";
497
+ throw new ApiError(errorMsg, response.status, "9400");
498
+ }
499
+ if (response.status === 403) {
500
+ throw new ApiError("Account is frozen or access forbidden", response.status, "9403");
501
+ }
502
+ if (!response.ok) {
503
+ const errorMsg = typeof json === "object" &&
504
+ json !== null &&
505
+ ("message" in json || "msg" in json)
506
+ ? String(json.message || json.msg)
507
+ : "Password change SMS verification failed";
508
+ throw new ApiError(errorMsg, response.status);
509
+ }
510
+ const responseData = json.data || json;
511
+ return {
512
+ success: true,
513
+ message: typeof responseData === "string" ? responseData : undefined,
514
+ };
515
+ }
412
516
  /**
413
517
  * Registers a new user with SMS verification and optional additional information.
414
518
  *
@@ -78,8 +78,12 @@ export interface LoginJson {
78
78
  userGroups: UserGroup[];
79
79
  userLoginMethods: AuthUserLoginMethod[];
80
80
  }
81
- export interface LoginWithSmsOptions {
82
- appToken?: string;
81
+ export type SmsType = "login" | "register" | "changePassword";
82
+ export type LoginOrRegisterSmsType = "login" | "register";
83
+ export type PasswordChangeSmsType = "changePassword" | "reset_password";
84
+ export type PasswordChangeSmsSendType = "changePassword";
85
+ export interface LoginWithSmsOptions extends CommonOptions {
86
+ smsType?: PasswordChangeSmsSendType;
83
87
  }
84
88
  export interface VerifySmsOptions extends CommonOptions {
85
89
  deviceName?: string;
@@ -89,24 +93,40 @@ export interface VerifySmsOptions extends CommonOptions {
89
93
  export interface SendSmsResponse {
90
94
  appKey: string;
91
95
  phone: string;
92
- type: "login" | "register";
96
+ type: SmsType;
93
97
  smsId: string;
94
98
  expiredAt: string;
95
99
  }
96
100
  export interface SendSmsJson {
97
101
  appKey: string;
98
102
  phone: string;
99
- type: "login" | "register";
103
+ type: SmsType;
100
104
  smsId: string;
101
105
  expiredAt: string;
102
106
  }
103
107
  export interface VerifySmsRequest {
104
108
  smsId: string;
105
- smsType: "login" | "register";
109
+ smsType: LoginOrRegisterSmsType;
106
110
  verificationCode: string;
107
111
  username?: string;
108
112
  passwordEncrypted?: string;
109
113
  }
114
+ export interface PasswordChangeSmsRequest {
115
+ smsId: string;
116
+ smsType: PasswordChangeSmsType;
117
+ verificationCode: string;
118
+ passwordEncrypted: string;
119
+ }
120
+ export interface PasswordChangeSmsResponse {
121
+ success: boolean;
122
+ message?: string;
123
+ }
124
+ export interface PasswordChangeSmsJson {
125
+ data?: string;
126
+ code?: number;
127
+ msg?: string;
128
+ message?: string;
129
+ }
110
130
  export interface SmsLoginResponse {
111
131
  app: AppInfo;
112
132
  user: AuthUser;
package/dist/index.d.ts CHANGED
@@ -14,6 +14,8 @@ export * from "./attachment-type/index.js";
14
14
  export * from "./app/index.js";
15
15
  export * from "./app-token/index.js";
16
16
  export * from "./dashboard/index.js";
17
+ export * from "./admin.js";
18
+ export * from "./app-client.js";
17
19
  export * from "./errors.js";
18
20
  export type { CommonOptions, PageResponse, UserGroup, Role, Privilege, AppInfo, User, } from "./common/types.js";
19
21
  export type { Attachment, AttachmentRefType, ListAttachmentsByRefRequest, UploadAttachmentRequest, UploadAuthorizationRequest, CompleteUploadRequest, DeleteAttachmentRequest, DownloadAttachmentUrlRequest, DownloadUrlResponse, AttachmentOptions, } from "./attachment/types.js";
package/dist/index.js CHANGED
@@ -14,4 +14,6 @@ export * from "./attachment-type/index.js";
14
14
  export * from "./app/index.js";
15
15
  export * from "./app-token/index.js";
16
16
  export * from "./dashboard/index.js";
17
+ export * from "./admin.js";
18
+ export * from "./app-client.js";
17
19
  export * from "./errors.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turinhub/tale-js-sdk",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "description": "Official TypeScript SDK for Tale backend services",
5
5
  "keywords": [
6
6
  "tale",
@@ -22,6 +22,21 @@
22
22
  "author": "Turinhub <dev@turinhub.com>",
23
23
  "type": "module",
24
24
  "main": "dist/index.js",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ },
30
+ "./admin": {
31
+ "types": "./dist/admin.d.ts",
32
+ "import": "./dist/admin.js"
33
+ },
34
+ "./app": {
35
+ "types": "./dist/app-client.d.ts",
36
+ "import": "./dist/app-client.js"
37
+ },
38
+ "./dist/*": "./dist/*"
39
+ },
25
40
  "scripts": {
26
41
  "test": "pnpm run build && node --env-file=.env --experimental-vm-modules ./node_modules/jest/bin/jest.js",
27
42
  "test:unit": "pnpm run build && node --env-file=.env --experimental-vm-modules ./node_modules/jest/bin/jest.js --testPathIgnorePatterns='integration'",