@plolink/sdk 0.0.4
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 +259 -0
- package/dist/chunk-4H4RACSE.js +335 -0
- package/dist/chunk-4H4RACSE.js.map +1 -0
- package/dist/chunk-IHAAKFEJ.js +219 -0
- package/dist/chunk-IHAAKFEJ.js.map +1 -0
- package/dist/chunk-JR4HYYQI.cjs +221 -0
- package/dist/chunk-JR4HYYQI.cjs.map +1 -0
- package/dist/chunk-MD4O7FWT.js +46 -0
- package/dist/chunk-MD4O7FWT.js.map +1 -0
- package/dist/chunk-NS3DJP2O.cjs +349 -0
- package/dist/chunk-NS3DJP2O.cjs.map +1 -0
- package/dist/chunk-Y3UJVC2L.cjs +48 -0
- package/dist/chunk-Y3UJVC2L.cjs.map +1 -0
- package/dist/client-CAjIQKPm.d.cts +193 -0
- package/dist/client-CwNikk7i.d.ts +193 -0
- package/dist/common/index.cjs +65 -0
- package/dist/common/index.cjs.map +1 -0
- package/dist/common/index.d.cts +422 -0
- package/dist/common/index.d.ts +422 -0
- package/dist/common/index.js +4 -0
- package/dist/common/index.js.map +1 -0
- package/dist/core-77EbLgbp.d.cts +97 -0
- package/dist/core-77EbLgbp.d.ts +97 -0
- package/dist/index.cjs +350 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +98 -0
- package/dist/index.d.ts +98 -0
- package/dist/index.js +306 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/agent/index.cjs +21 -0
- package/dist/modules/agent/index.cjs.map +1 -0
- package/dist/modules/agent/index.d.cts +71 -0
- package/dist/modules/agent/index.d.ts +71 -0
- package/dist/modules/agent/index.js +19 -0
- package/dist/modules/agent/index.js.map +1 -0
- package/dist/modules/billing/index.cjs +413 -0
- package/dist/modules/billing/index.cjs.map +1 -0
- package/dist/modules/billing/index.d.cts +538 -0
- package/dist/modules/billing/index.d.ts +538 -0
- package/dist/modules/billing/index.js +411 -0
- package/dist/modules/billing/index.js.map +1 -0
- package/dist/modules/chat/index.cjs +20 -0
- package/dist/modules/chat/index.cjs.map +1 -0
- package/dist/modules/chat/index.d.cts +68 -0
- package/dist/modules/chat/index.d.ts +68 -0
- package/dist/modules/chat/index.js +18 -0
- package/dist/modules/chat/index.js.map +1 -0
- package/dist/modules/psych/index.cjs +20 -0
- package/dist/modules/psych/index.cjs.map +1 -0
- package/dist/modules/psych/index.d.cts +69 -0
- package/dist/modules/psych/index.d.ts +69 -0
- package/dist/modules/psych/index.js +18 -0
- package/dist/modules/psych/index.js.map +1 -0
- package/dist/modules/rbac/index.cjs +197 -0
- package/dist/modules/rbac/index.cjs.map +1 -0
- package/dist/modules/rbac/index.d.cts +293 -0
- package/dist/modules/rbac/index.d.ts +293 -0
- package/dist/modules/rbac/index.js +195 -0
- package/dist/modules/rbac/index.js.map +1 -0
- package/dist/modules/team/index.cjs +54 -0
- package/dist/modules/team/index.cjs.map +1 -0
- package/dist/modules/team/index.d.cts +91 -0
- package/dist/modules/team/index.d.ts +91 -0
- package/dist/modules/team/index.js +52 -0
- package/dist/modules/team/index.js.map +1 -0
- package/dist/modules/virtual-account/index.cjs +293 -0
- package/dist/modules/virtual-account/index.cjs.map +1 -0
- package/dist/modules/virtual-account/index.d.cts +366 -0
- package/dist/modules/virtual-account/index.d.ts +366 -0
- package/dist/modules/virtual-account/index.js +291 -0
- package/dist/modules/virtual-account/index.js.map +1 -0
- package/dist/poller-BlIRbwL4.d.cts +201 -0
- package/dist/poller-DWKZjuSw.d.ts +201 -0
- package/dist/shared-6ZepUSPW.d.cts +31 -0
- package/dist/shared-6ZepUSPW.d.ts +31 -0
- package/package.json +96 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 心理测评模块
|
|
3
|
+
*
|
|
4
|
+
* @description
|
|
5
|
+
* 提供心理题库抽题、评测创建、答题提交、结果生成等功能。
|
|
6
|
+
* 随机逻辑在后端处理,前端获取的题目已经打乱。
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { PlolinkClient } from '@plolink/sdk';
|
|
11
|
+
* import { Psychology } from '@plolink/sdk/psych';
|
|
12
|
+
*
|
|
13
|
+
* const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });
|
|
14
|
+
* const psych = new Psychology(client);
|
|
15
|
+
*
|
|
16
|
+
* // 抽题并创建评测
|
|
17
|
+
* const assessment = await psych.createAssessment({
|
|
18
|
+
* type: 'big-five',
|
|
19
|
+
* count: 50
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module psych
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Psychology 模块占位符
|
|
27
|
+
*
|
|
28
|
+
* @description
|
|
29
|
+
* 此模块将在后续版本中实现以下功能:
|
|
30
|
+
* - 题库抽题(后端随机)
|
|
31
|
+
* - 创建心理评测记录
|
|
32
|
+
* - 提交答题结果
|
|
33
|
+
* - 生成评测报告
|
|
34
|
+
* - 防止重复提交
|
|
35
|
+
* - 获取历史评测记录
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* // 未来使用方式(预览)
|
|
40
|
+
* const psych = new Psychology(client);
|
|
41
|
+
*
|
|
42
|
+
* // 创建评测(自动抽题)
|
|
43
|
+
* const assessment = await psych.createAssessment({
|
|
44
|
+
* type: 'big-five',
|
|
45
|
+
* count: 50
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* // 提交答案
|
|
49
|
+
* const result = await psych.submitAnswers({
|
|
50
|
+
* assessmentId: assessment.id,
|
|
51
|
+
* answers: [
|
|
52
|
+
* { questionId: 1, answer: 'A' },
|
|
53
|
+
* { questionId: 2, answer: 'B' }
|
|
54
|
+
* ]
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* // 获取评测结果
|
|
58
|
+
* console.log('Assessment result:', result);
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
declare const PSYCH_MODULE_INFO: {
|
|
62
|
+
readonly name: "psych";
|
|
63
|
+
readonly version: "1.0.0";
|
|
64
|
+
readonly status: "planned";
|
|
65
|
+
readonly features: readonly ["question-sampling", "assessment-create", "answer-submit", "result-generate", "duplicate-prevention", "history-query"];
|
|
66
|
+
};
|
|
67
|
+
type PsychModuleInfo = typeof PSYCH_MODULE_INFO;
|
|
68
|
+
|
|
69
|
+
export { PSYCH_MODULE_INFO, type PsychModuleInfo };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 心理测评模块
|
|
3
|
+
*
|
|
4
|
+
* @description
|
|
5
|
+
* 提供心理题库抽题、评测创建、答题提交、结果生成等功能。
|
|
6
|
+
* 随机逻辑在后端处理,前端获取的题目已经打乱。
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { PlolinkClient } from '@plolink/sdk';
|
|
11
|
+
* import { Psychology } from '@plolink/sdk/psych';
|
|
12
|
+
*
|
|
13
|
+
* const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });
|
|
14
|
+
* const psych = new Psychology(client);
|
|
15
|
+
*
|
|
16
|
+
* // 抽题并创建评测
|
|
17
|
+
* const assessment = await psych.createAssessment({
|
|
18
|
+
* type: 'big-five',
|
|
19
|
+
* count: 50
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @module psych
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Psychology 模块占位符
|
|
27
|
+
*
|
|
28
|
+
* @description
|
|
29
|
+
* 此模块将在后续版本中实现以下功能:
|
|
30
|
+
* - 题库抽题(后端随机)
|
|
31
|
+
* - 创建心理评测记录
|
|
32
|
+
* - 提交答题结果
|
|
33
|
+
* - 生成评测报告
|
|
34
|
+
* - 防止重复提交
|
|
35
|
+
* - 获取历史评测记录
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* // 未来使用方式(预览)
|
|
40
|
+
* const psych = new Psychology(client);
|
|
41
|
+
*
|
|
42
|
+
* // 创建评测(自动抽题)
|
|
43
|
+
* const assessment = await psych.createAssessment({
|
|
44
|
+
* type: 'big-five',
|
|
45
|
+
* count: 50
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* // 提交答案
|
|
49
|
+
* const result = await psych.submitAnswers({
|
|
50
|
+
* assessmentId: assessment.id,
|
|
51
|
+
* answers: [
|
|
52
|
+
* { questionId: 1, answer: 'A' },
|
|
53
|
+
* { questionId: 2, answer: 'B' }
|
|
54
|
+
* ]
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* // 获取评测结果
|
|
58
|
+
* console.log('Assessment result:', result);
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
declare const PSYCH_MODULE_INFO: {
|
|
62
|
+
readonly name: "psych";
|
|
63
|
+
readonly version: "1.0.0";
|
|
64
|
+
readonly status: "planned";
|
|
65
|
+
readonly features: readonly ["question-sampling", "assessment-create", "answer-submit", "result-generate", "duplicate-prevention", "history-query"];
|
|
66
|
+
};
|
|
67
|
+
type PsychModuleInfo = typeof PSYCH_MODULE_INFO;
|
|
68
|
+
|
|
69
|
+
export { PSYCH_MODULE_INFO, type PsychModuleInfo };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/modules/psych/index.ts
|
|
2
|
+
var PSYCH_MODULE_INFO = {
|
|
3
|
+
name: "psych",
|
|
4
|
+
version: "1.0.0",
|
|
5
|
+
status: "planned",
|
|
6
|
+
features: [
|
|
7
|
+
"question-sampling",
|
|
8
|
+
"assessment-create",
|
|
9
|
+
"answer-submit",
|
|
10
|
+
"result-generate",
|
|
11
|
+
"duplicate-prevention",
|
|
12
|
+
"history-query"
|
|
13
|
+
]
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { PSYCH_MODULE_INFO };
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/psych/index.ts"],"names":[],"mappings":";AA+DO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,OAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,QAAA,EAAU;AAAA,IACR,mBAAA;AAAA,IACA,mBAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA;AAEJ","file":"index.js","sourcesContent":["/**\n * 心理测评模块\n * \n * @description\n * 提供心理题库抽题、评测创建、答题提交、结果生成等功能。\n * 随机逻辑在后端处理,前端获取的题目已经打乱。\n * \n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Psychology } from '@plolink/sdk/psych';\n * \n * const client = new PlolinkClient({ mode: 'apiKey', apiKey: 'xxx' });\n * const psych = new Psychology(client);\n * \n * // 抽题并创建评测\n * const assessment = await psych.createAssessment({\n * type: 'big-five',\n * count: 50\n * });\n * ```\n * \n * @module psych\n */\n\n// 预留:将在后续实现 Psychology 类\n\n/**\n * Psychology 模块占位符\n * \n * @description\n * 此模块将在后续版本中实现以下功能:\n * - 题库抽题(后端随机)\n * - 创建心理评测记录\n * - 提交答题结果\n * - 生成评测报告\n * - 防止重复提交\n * - 获取历史评测记录\n * \n * @example\n * ```typescript\n * // 未来使用方式(预览)\n * const psych = new Psychology(client);\n * \n * // 创建评测(自动抽题)\n * const assessment = await psych.createAssessment({\n * type: 'big-five',\n * count: 50\n * });\n * \n * // 提交答案\n * const result = await psych.submitAnswers({\n * assessmentId: assessment.id,\n * answers: [\n * { questionId: 1, answer: 'A' },\n * { questionId: 2, answer: 'B' }\n * ]\n * });\n * \n * // 获取评测结果\n * console.log('Assessment result:', result);\n * ```\n */\nexport const PSYCH_MODULE_INFO = {\n name: 'psych',\n version: '1.0.0',\n status: 'planned',\n features: [\n 'question-sampling',\n 'assessment-create',\n 'answer-submit',\n 'result-generate',\n 'duplicate-prevention',\n 'history-query',\n ],\n} as const;\n\n// 导出类型(预留)\nexport type PsychModuleInfo = typeof PSYCH_MODULE_INFO;\n\n"]}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkY3UJVC2L_cjs = require('../../chunk-Y3UJVC2L.cjs');
|
|
4
|
+
|
|
5
|
+
// src/modules/rbac/index.ts
|
|
6
|
+
var Rbac = class {
|
|
7
|
+
constructor(client) {
|
|
8
|
+
this.client = client;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 获取所有权限点定义 + 系统角色定义
|
|
12
|
+
* GET /api/v1/permissions
|
|
13
|
+
*/
|
|
14
|
+
async getPermissionDefinitions() {
|
|
15
|
+
return this.client.axiosInstance.get("/api/v1/permissions");
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 列出团队角色(系统角色 + 自定义角色)
|
|
19
|
+
* GET /api/v1/teams/:teamId/roles
|
|
20
|
+
*/
|
|
21
|
+
async listTeamRoles(teamId) {
|
|
22
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
23
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
24
|
+
}
|
|
25
|
+
return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/roles`);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 创建自定义角色
|
|
29
|
+
* POST /api/v1/teams/:teamId/roles
|
|
30
|
+
*/
|
|
31
|
+
async createCustomRole(teamId, params) {
|
|
32
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
33
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
34
|
+
}
|
|
35
|
+
if (!params.name || params.name.trim().length === 0) {
|
|
36
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("name is required and cannot be empty", "INVALID_PARAMS");
|
|
37
|
+
}
|
|
38
|
+
if (!params.code || params.code.trim().length === 0) {
|
|
39
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("code is required and cannot be empty", "INVALID_PARAMS");
|
|
40
|
+
}
|
|
41
|
+
if (!Array.isArray(params.permissions)) {
|
|
42
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("permissions must be an array", "INVALID_PARAMS");
|
|
43
|
+
}
|
|
44
|
+
return this.client.axiosInstance.post(`/api/v1/teams/${teamId}/roles`, params);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 更新自定义角色
|
|
48
|
+
* PUT /api/v1/teams/:teamId/roles/:roleId
|
|
49
|
+
*/
|
|
50
|
+
async updateCustomRole(teamId, roleId, params) {
|
|
51
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
52
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
53
|
+
}
|
|
54
|
+
if (!roleId || roleId.trim().length === 0) {
|
|
55
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("roleId is required", "INVALID_PARAMS");
|
|
56
|
+
}
|
|
57
|
+
if (params.name !== void 0 && params.name.trim().length === 0) {
|
|
58
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("name cannot be empty", "INVALID_PARAMS");
|
|
59
|
+
}
|
|
60
|
+
if (params.code !== void 0 && params.code.trim().length === 0) {
|
|
61
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("code cannot be empty", "INVALID_PARAMS");
|
|
62
|
+
}
|
|
63
|
+
if (params.permissions !== void 0 && !Array.isArray(params.permissions)) {
|
|
64
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("permissions must be an array", "INVALID_PARAMS");
|
|
65
|
+
}
|
|
66
|
+
return this.client.axiosInstance.put(`/api/v1/teams/${teamId}/roles/${roleId}`, params);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 删除自定义角色
|
|
70
|
+
* DELETE /api/v1/teams/:teamId/roles/:roleId?force=true
|
|
71
|
+
*/
|
|
72
|
+
async deleteCustomRole(teamId, roleId, options) {
|
|
73
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
74
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
75
|
+
}
|
|
76
|
+
if (!roleId || roleId.trim().length === 0) {
|
|
77
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("roleId is required", "INVALID_PARAMS");
|
|
78
|
+
}
|
|
79
|
+
const params = options?.force ? { force: "true" } : void 0;
|
|
80
|
+
return this.client.axiosInstance.delete(`/api/v1/teams/${teamId}/roles/${roleId}`, { params });
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 获取角色详情(系统角色或自定义角色)
|
|
84
|
+
* GET /api/v1/teams/:teamId/roles/:roleId
|
|
85
|
+
*/
|
|
86
|
+
async getRoleDetail(teamId, roleId) {
|
|
87
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
88
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
89
|
+
}
|
|
90
|
+
if (!roleId || roleId.trim().length === 0) {
|
|
91
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("roleId is required", "INVALID_PARAMS");
|
|
92
|
+
}
|
|
93
|
+
return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/roles/${roleId}`);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* 获取成员的所有角色(带角色信息与权限)
|
|
97
|
+
* GET /api/v1/teams/:teamId/members/:memberId/roles
|
|
98
|
+
*/
|
|
99
|
+
async listMemberRoles(teamId, memberId) {
|
|
100
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
101
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
102
|
+
}
|
|
103
|
+
if (!memberId || memberId.trim().length === 0) {
|
|
104
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
|
|
105
|
+
}
|
|
106
|
+
return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/members/${memberId}/roles`);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 为成员分配角色(系统/自定义)及数据范围
|
|
110
|
+
* POST /api/v1/teams/:teamId/members/:memberId/roles
|
|
111
|
+
*/
|
|
112
|
+
async assignMemberRole(teamId, memberId, params) {
|
|
113
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
114
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
115
|
+
}
|
|
116
|
+
if (!memberId || memberId.trim().length === 0) {
|
|
117
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
|
|
118
|
+
}
|
|
119
|
+
if (params.roleType === "SYSTEM" && (!params.roleCode || params.roleCode.trim().length === 0)) {
|
|
120
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("roleCode is required when roleType is SYSTEM", "INVALID_PARAMS");
|
|
121
|
+
}
|
|
122
|
+
if (params.roleType === "CUSTOM" && (!params.roleId || params.roleId.trim().length === 0)) {
|
|
123
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("roleId is required when roleType is CUSTOM", "INVALID_PARAMS");
|
|
124
|
+
}
|
|
125
|
+
return this.client.axiosInstance.post(
|
|
126
|
+
`/api/v1/teams/${teamId}/members/${memberId}/roles`,
|
|
127
|
+
params
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 更新成员角色的数据范围
|
|
132
|
+
* PUT /api/v1/teams/:teamId/members/:memberId/roles/:memberRoleId
|
|
133
|
+
*/
|
|
134
|
+
async updateMemberRoleScope(teamId, memberId, memberRoleId, params) {
|
|
135
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
136
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
137
|
+
}
|
|
138
|
+
if (!memberId || memberId.trim().length === 0) {
|
|
139
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
|
|
140
|
+
}
|
|
141
|
+
if (!memberRoleId || memberRoleId.trim().length === 0) {
|
|
142
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("memberRoleId is required", "INVALID_PARAMS");
|
|
143
|
+
}
|
|
144
|
+
if (!params.scopeType || params.scopeType.trim().length === 0) {
|
|
145
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("scopeType is required", "INVALID_PARAMS");
|
|
146
|
+
}
|
|
147
|
+
return this.client.axiosInstance.put(
|
|
148
|
+
`/api/v1/teams/${teamId}/members/${memberId}/roles/${memberRoleId}`,
|
|
149
|
+
params
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* 移除成员角色
|
|
154
|
+
* DELETE /api/v1/teams/:teamId/members/:memberId/roles/:memberRoleId
|
|
155
|
+
*/
|
|
156
|
+
async removeMemberRole(teamId, memberId, memberRoleId) {
|
|
157
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
158
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
159
|
+
}
|
|
160
|
+
if (!memberId || memberId.trim().length === 0) {
|
|
161
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
|
|
162
|
+
}
|
|
163
|
+
if (!memberRoleId || memberRoleId.trim().length === 0) {
|
|
164
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("memberRoleId is required", "INVALID_PARAMS");
|
|
165
|
+
}
|
|
166
|
+
return this.client.axiosInstance.delete(
|
|
167
|
+
`/api/v1/teams/${teamId}/members/${memberId}/roles/${memberRoleId}`
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* 快捷授权人才模块(公司访问范围)
|
|
172
|
+
* POST /api/v1/teams/:teamId/members/:memberId/roles/talent
|
|
173
|
+
*/
|
|
174
|
+
async quickGrantTalentAccess(teamId, memberId, params) {
|
|
175
|
+
if (!teamId || teamId.trim().length === 0) {
|
|
176
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("teamId is required", "INVALID_PARAMS");
|
|
177
|
+
}
|
|
178
|
+
if (!memberId || memberId.trim().length === 0) {
|
|
179
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError("memberId is required", "INVALID_PARAMS");
|
|
180
|
+
}
|
|
181
|
+
const roleCode = params?.roleCode;
|
|
182
|
+
if (roleCode && roleCode !== "SUB_UNIT_VIEWER" && roleCode !== "SUB_UNIT_MANAGER") {
|
|
183
|
+
throw new chunkY3UJVC2L_cjs.PlolinkError(
|
|
184
|
+
"roleCode must be SUB_UNIT_VIEWER or SUB_UNIT_MANAGER",
|
|
185
|
+
"INVALID_PARAMS"
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
return this.client.axiosInstance.post(
|
|
189
|
+
`/api/v1/teams/${teamId}/members/${memberId}/roles/talent`,
|
|
190
|
+
params ?? {}
|
|
191
|
+
);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
exports.Rbac = Rbac;
|
|
196
|
+
//# sourceMappingURL=index.cjs.map
|
|
197
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/modules/rbac/index.ts"],"names":["PlolinkError"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * RBAC 模块 (Rbac)\n *\n * @description\n * 提供权限点、角色、成员角色分配等能力封装,覆盖后端 `docs/api/rbac.md` 中的核心接口:\n * - 获取权限点定义 + 系统角色定义\n * - 团队角色管理(系统角色列表 + 自定义角色 CRUD)\n * - 成员角色管理(查询/分配/更新数据范围/移除)\n * - 人才模块快捷授权(SUB_UNIT_VIEWER / SUB_UNIT_MANAGER)\n *\n * @example\n * ```typescript\n * import { PlolinkClient } from '@plolink/sdk';\n * import { Team } from '@plolink/sdk/team';\n * import { Rbac } from '@plolink/sdk/rbac';\n * import { VirtualAccount } from '@plolink/sdk/virtual-account';\n *\n * const client = new PlolinkClient({ token: 'session-or-apikey' });\n * const virtualAccount = new VirtualAccount(client);\n * const team = new Team(client);\n * const rbac = new Rbac(client);\n *\n * const created = await virtualAccount.createVirtualAccount({\n * mode: 'EXISTING_TEAM',\n * teamId: 'team-123',\n * virtualAccountName: 'Bot'\n * });\n *\n * const members = await team.listTeamMembers(created.virtualAccount.virtualAccountTeamId);\n * const memberId = team.getMemberIdByUserId(members, created.virtualAccount.id);\n *\n * await rbac.assignMemberRole(created.virtualAccount.virtualAccountTeamId, memberId, {\n * roleType: 'SYSTEM',\n * roleCode: 'SUB_UNIT_VIEWER',\n * scopeType: 'TEAM'\n * });\n * ```\n *\n * @module rbac\n */\n\nimport { PlolinkClient } from '../../core/client';\nimport { PlolinkError } from '../../core/error';\nimport type {\n PermissionDefinitionsResponse,\n TeamRolesResponse,\n CreateCustomRoleParams,\n UpdateCustomRoleParams,\n CustomRoleInfo,\n DeleteRoleResult,\n MemberRoleListItem,\n MemberRoleRecord,\n UpdateMemberRoleScopeParams,\n QuickGrantTalentAccessParams,\n TeamRoleDetail,\n} from '../../types/rbac';\nimport type { AssignRoleParams } from '../../types/shared';\n\nexport type {\n PermissionDefinitionsResponse,\n TeamRolesResponse,\n CreateCustomRoleParams,\n UpdateCustomRoleParams,\n CustomRoleInfo,\n DeleteRoleResult,\n MemberRoleListItem,\n MemberRoleRecord,\n UpdateMemberRoleScopeParams,\n QuickGrantTalentAccessParams,\n TeamRoleDetail,\n} from '../../types/rbac';\n\nexport type { AssignRoleParams, RoleType, ScopeType } from '../../types/shared';\n\nexport class Rbac {\n private client: PlolinkClient;\n\n constructor(client: PlolinkClient) {\n this.client = client;\n }\n\n /**\n * 获取所有权限点定义 + 系统角色定义\n * GET /api/v1/permissions\n */\n public async getPermissionDefinitions(): Promise<PermissionDefinitionsResponse> {\n return this.client.axiosInstance.get('/api/v1/permissions');\n }\n\n /**\n * 列出团队角色(系统角色 + 自定义角色)\n * GET /api/v1/teams/:teamId/roles\n */\n public async listTeamRoles(teamId: string): Promise<TeamRolesResponse> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/roles`);\n }\n\n /**\n * 创建自定义角色\n * POST /api/v1/teams/:teamId/roles\n */\n public async createCustomRole(teamId: string, params: CreateCustomRoleParams): Promise<CustomRoleInfo> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!params.name || params.name.trim().length === 0) {\n throw new PlolinkError('name is required and cannot be empty', 'INVALID_PARAMS');\n }\n if (!params.code || params.code.trim().length === 0) {\n throw new PlolinkError('code is required and cannot be empty', 'INVALID_PARAMS');\n }\n if (!Array.isArray(params.permissions)) {\n throw new PlolinkError('permissions must be an array', 'INVALID_PARAMS');\n }\n return this.client.axiosInstance.post(`/api/v1/teams/${teamId}/roles`, params);\n }\n\n /**\n * 更新自定义角色\n * PUT /api/v1/teams/:teamId/roles/:roleId\n */\n public async updateCustomRole(\n teamId: string,\n roleId: string,\n params: UpdateCustomRoleParams\n ): Promise<CustomRoleInfo> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!roleId || roleId.trim().length === 0) {\n throw new PlolinkError('roleId is required', 'INVALID_PARAMS');\n }\n\n // 允许部分更新,但如果传了 name 就要校验\n if (params.name !== undefined && params.name.trim().length === 0) {\n throw new PlolinkError('name cannot be empty', 'INVALID_PARAMS');\n }\n if (params.code !== undefined && params.code.trim().length === 0) {\n throw new PlolinkError('code cannot be empty', 'INVALID_PARAMS');\n }\n if (params.permissions !== undefined && !Array.isArray(params.permissions)) {\n throw new PlolinkError('permissions must be an array', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.put(`/api/v1/teams/${teamId}/roles/${roleId}`, params);\n }\n\n /**\n * 删除自定义角色\n * DELETE /api/v1/teams/:teamId/roles/:roleId?force=true\n */\n public async deleteCustomRole(\n teamId: string,\n roleId: string,\n options?: { force?: boolean }\n ): Promise<DeleteRoleResult> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!roleId || roleId.trim().length === 0) {\n throw new PlolinkError('roleId is required', 'INVALID_PARAMS');\n }\n const params = options?.force ? { force: 'true' } : undefined;\n return this.client.axiosInstance.delete(`/api/v1/teams/${teamId}/roles/${roleId}`, { params });\n }\n\n /**\n * 获取角色详情(系统角色或自定义角色)\n * GET /api/v1/teams/:teamId/roles/:roleId\n */\n public async getRoleDetail(teamId: string, roleId: string): Promise<TeamRoleDetail> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!roleId || roleId.trim().length === 0) {\n throw new PlolinkError('roleId is required', 'INVALID_PARAMS');\n }\n return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/roles/${roleId}`);\n }\n\n /**\n * 获取成员的所有角色(带角色信息与权限)\n * GET /api/v1/teams/:teamId/members/:memberId/roles\n */\n public async listMemberRoles(teamId: string, memberId: string): Promise<MemberRoleListItem[]> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n return this.client.axiosInstance.get(`/api/v1/teams/${teamId}/members/${memberId}/roles`);\n }\n\n /**\n * 为成员分配角色(系统/自定义)及数据范围\n * POST /api/v1/teams/:teamId/members/:memberId/roles\n */\n public async assignMemberRole(\n teamId: string,\n memberId: string,\n params: AssignRoleParams\n ): Promise<MemberRoleRecord> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n\n // 最小校验(服务端也会校验;这里提前快速失败)\n if (params.roleType === 'SYSTEM' && (!params.roleCode || params.roleCode.trim().length === 0)) {\n throw new PlolinkError('roleCode is required when roleType is SYSTEM', 'INVALID_PARAMS');\n }\n if (params.roleType === 'CUSTOM' && (!params.roleId || params.roleId.trim().length === 0)) {\n throw new PlolinkError('roleId is required when roleType is CUSTOM', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.post(\n `/api/v1/teams/${teamId}/members/${memberId}/roles`,\n params\n );\n }\n\n /**\n * 更新成员角色的数据范围\n * PUT /api/v1/teams/:teamId/members/:memberId/roles/:memberRoleId\n */\n public async updateMemberRoleScope(\n teamId: string,\n memberId: string,\n memberRoleId: string,\n params: UpdateMemberRoleScopeParams\n ): Promise<MemberRoleRecord> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n if (!memberRoleId || memberRoleId.trim().length === 0) {\n throw new PlolinkError('memberRoleId is required', 'INVALID_PARAMS');\n }\n if (!params.scopeType || params.scopeType.trim().length === 0) {\n throw new PlolinkError('scopeType is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.put(\n `/api/v1/teams/${teamId}/members/${memberId}/roles/${memberRoleId}`,\n params\n );\n }\n\n /**\n * 移除成员角色\n * DELETE /api/v1/teams/:teamId/members/:memberId/roles/:memberRoleId\n */\n public async removeMemberRole(\n teamId: string,\n memberId: string,\n memberRoleId: string\n ): Promise<DeleteRoleResult> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n if (!memberRoleId || memberRoleId.trim().length === 0) {\n throw new PlolinkError('memberRoleId is required', 'INVALID_PARAMS');\n }\n\n return this.client.axiosInstance.delete(\n `/api/v1/teams/${teamId}/members/${memberId}/roles/${memberRoleId}`\n );\n }\n\n /**\n * 快捷授权人才模块(公司访问范围)\n * POST /api/v1/teams/:teamId/members/:memberId/roles/talent\n */\n public async quickGrantTalentAccess(\n teamId: string,\n memberId: string,\n params?: QuickGrantTalentAccessParams\n ): Promise<MemberRoleRecord> {\n if (!teamId || teamId.trim().length === 0) {\n throw new PlolinkError('teamId is required', 'INVALID_PARAMS');\n }\n if (!memberId || memberId.trim().length === 0) {\n throw new PlolinkError('memberId is required', 'INVALID_PARAMS');\n }\n\n // 轻量校验 roleCode\n const roleCode = params?.roleCode;\n if (roleCode && roleCode !== 'SUB_UNIT_VIEWER' && roleCode !== 'SUB_UNIT_MANAGER') {\n throw new PlolinkError(\n 'roleCode must be SUB_UNIT_VIEWER or SUB_UNIT_MANAGER',\n 'INVALID_PARAMS'\n );\n }\n\n return this.client.axiosInstance.post(\n `/api/v1/teams/${teamId}/members/${memberId}/roles/talent`,\n params ?? {}\n );\n }\n}\n\n\n"]}
|