@abtnode/core 1.17.8-beta-20260109-075740-5f484e08 → 1.17.8-beta-20260113-015027-32a1cec4
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/lib/api/team/access-key-manager.js +104 -0
- package/lib/api/team/invitation-manager.js +461 -0
- package/lib/api/team/notification-manager.js +189 -0
- package/lib/api/team/oauth-manager.js +60 -0
- package/lib/api/team/org-crud-manager.js +202 -0
- package/lib/api/team/org-manager.js +56 -0
- package/lib/api/team/org-member-manager.js +403 -0
- package/lib/api/team/org-query-manager.js +126 -0
- package/lib/api/team/org-resource-manager.js +186 -0
- package/lib/api/team/passport-manager.js +670 -0
- package/lib/api/team/rbac-manager.js +335 -0
- package/lib/api/team/session-manager.js +540 -0
- package/lib/api/team/store-manager.js +198 -0
- package/lib/api/team/tag-manager.js +230 -0
- package/lib/api/team/user-auth-manager.js +132 -0
- package/lib/api/team/user-manager.js +78 -0
- package/lib/api/team/user-query-manager.js +299 -0
- package/lib/api/team/user-social-manager.js +354 -0
- package/lib/api/team/user-update-manager.js +224 -0
- package/lib/api/team/verify-code-manager.js +161 -0
- package/lib/api/team.js +439 -3287
- package/lib/blocklet/manager/disk/auth-manager.js +68 -0
- package/lib/blocklet/manager/disk/backup-manager.js +288 -0
- package/lib/blocklet/manager/disk/cleanup-manager.js +157 -0
- package/lib/blocklet/manager/disk/component-manager.js +83 -0
- package/lib/blocklet/manager/disk/config-manager.js +191 -0
- package/lib/blocklet/manager/disk/controller-manager.js +64 -0
- package/lib/blocklet/manager/disk/delete-reset-manager.js +328 -0
- package/lib/blocklet/manager/disk/download-manager.js +96 -0
- package/lib/blocklet/manager/disk/env-config-manager.js +311 -0
- package/lib/blocklet/manager/disk/federated-manager.js +651 -0
- package/lib/blocklet/manager/disk/hook-manager.js +124 -0
- package/lib/blocklet/manager/disk/install-component-manager.js +95 -0
- package/lib/blocklet/manager/disk/install-core-manager.js +448 -0
- package/lib/blocklet/manager/disk/install-download-manager.js +313 -0
- package/lib/blocklet/manager/disk/install-manager.js +36 -0
- package/lib/blocklet/manager/disk/install-upgrade-manager.js +340 -0
- package/lib/blocklet/manager/disk/job-manager.js +467 -0
- package/lib/blocklet/manager/disk/lifecycle-manager.js +26 -0
- package/lib/blocklet/manager/disk/notification-manager.js +343 -0
- package/lib/blocklet/manager/disk/query-manager.js +562 -0
- package/lib/blocklet/manager/disk/settings-manager.js +507 -0
- package/lib/blocklet/manager/disk/start-manager.js +611 -0
- package/lib/blocklet/manager/disk/stop-restart-manager.js +292 -0
- package/lib/blocklet/manager/disk/update-manager.js +153 -0
- package/lib/blocklet/manager/disk.js +669 -5796
- package/lib/blocklet/manager/helper/blue-green-start-blocklet.js +5 -0
- package/lib/blocklet/manager/lock.js +18 -0
- package/lib/event/index.js +28 -24
- package/lib/util/blocklet/app-utils.js +192 -0
- package/lib/util/blocklet/blocklet-loader.js +258 -0
- package/lib/util/blocklet/config-manager.js +232 -0
- package/lib/util/blocklet/did-document.js +240 -0
- package/lib/util/blocklet/environment.js +555 -0
- package/lib/util/blocklet/health-check.js +449 -0
- package/lib/util/blocklet/install-utils.js +365 -0
- package/lib/util/blocklet/logo.js +57 -0
- package/lib/util/blocklet/meta-utils.js +269 -0
- package/lib/util/blocklet/port-manager.js +141 -0
- package/lib/util/blocklet/process-manager.js +504 -0
- package/lib/util/blocklet/runtime-info.js +105 -0
- package/lib/util/blocklet/validation.js +418 -0
- package/lib/util/blocklet.js +98 -3066
- package/lib/util/wallet-app-notification.js +40 -0
- package/package.json +22 -22
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
const { EVENTS } = require('@abtnode/constant');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Get notification
|
|
5
|
+
* @param {Object} api - TeamAPI instance
|
|
6
|
+
* @param {Object} params
|
|
7
|
+
* @param {string} params.teamDid - Team DID
|
|
8
|
+
* @param {Object} context
|
|
9
|
+
* @returns {Promise<Object>}
|
|
10
|
+
*/
|
|
11
|
+
async function getNotification(api, { teamDid, ...rest }, context) {
|
|
12
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
13
|
+
return notificationState.findPaginated({ teamDid, ...rest }, context);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Get notification by ID
|
|
18
|
+
* @param {Object} api - TeamAPI instance
|
|
19
|
+
* @param {Object} params
|
|
20
|
+
* @param {string} params.teamDid - Team DID
|
|
21
|
+
* @param {string} params.id - Notification ID
|
|
22
|
+
* @returns {Promise<Object>}
|
|
23
|
+
*/
|
|
24
|
+
async function getNotificationById(api, { teamDid, id }) {
|
|
25
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
26
|
+
const notification = await notificationState.findNotification({ id });
|
|
27
|
+
return notification;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Get notifications unread count
|
|
32
|
+
* @param {Object} api - TeamAPI instance
|
|
33
|
+
* @param {Object} params
|
|
34
|
+
* @param {string} params.teamDid - Team DID
|
|
35
|
+
* @param {string} params.receiver - Receiver DID
|
|
36
|
+
* @param {Object} context
|
|
37
|
+
* @returns {Promise<number>}
|
|
38
|
+
*/
|
|
39
|
+
async function getNotificationsUnreadCount(api, { teamDid, receiver }, context) {
|
|
40
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
41
|
+
return notificationState.getUnreadCount({ receiver }, context);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Create notification receiver
|
|
46
|
+
* @param {Object} api - TeamAPI instance
|
|
47
|
+
* @param {Object} params
|
|
48
|
+
* @param {string} params.teamDid - Team DID
|
|
49
|
+
* @param {Object} params.receiverInstance - Receiver instance
|
|
50
|
+
* @param {Object} context
|
|
51
|
+
* @returns {Promise<Object>}
|
|
52
|
+
*/
|
|
53
|
+
async function createNotificationReceiver(api, { teamDid, receiverInstance, ...rest }, context) {
|
|
54
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
55
|
+
return notificationState.createNotificationReceiver({ receiverInstance, ...rest }, context);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Mark all notifications as read
|
|
60
|
+
* @param {Object} api - TeamAPI instance
|
|
61
|
+
* @param {Object} params
|
|
62
|
+
* @param {string} params.teamDid - Team DID
|
|
63
|
+
* @param {Object} context
|
|
64
|
+
* @returns {Promise<Object>}
|
|
65
|
+
*/
|
|
66
|
+
async function markAllNotificationsAsRead(api, { teamDid, ...rest }, context) {
|
|
67
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
68
|
+
const result = await notificationState.makeAllAsRead(rest, context);
|
|
69
|
+
const { numAffected, notificationIds, effectRows } = result;
|
|
70
|
+
api.teamManager.emitReadNotification(teamDid, {
|
|
71
|
+
readCount: numAffected,
|
|
72
|
+
notificationIds,
|
|
73
|
+
receiver: rest.receiver,
|
|
74
|
+
effectRows,
|
|
75
|
+
});
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Update notification status
|
|
81
|
+
* @param {Object} api - TeamAPI instance
|
|
82
|
+
* @param {Object} params
|
|
83
|
+
* @param {string} params.teamDid - Team DID
|
|
84
|
+
* @param {Array} params.receivers - Receivers
|
|
85
|
+
* @param {string} params.notificationId - Notification ID
|
|
86
|
+
* @param {Object} params.updates - Updates
|
|
87
|
+
* @returns {Promise<number>}
|
|
88
|
+
*/
|
|
89
|
+
async function updateNotificationStatus(api, { teamDid, receivers, notificationId, updates }) {
|
|
90
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
91
|
+
const result = await notificationState.updateStatus({ receivers, notificationId, updates, teamDid });
|
|
92
|
+
// 发送状态更新的通知给前端,使用通用节流函数
|
|
93
|
+
if (result > 0 && teamDid && !api.teamManager.isNodeTeam(teamDid)) {
|
|
94
|
+
const throttledEmit = api.getThrottledEmit(teamDid);
|
|
95
|
+
if (throttledEmit) {
|
|
96
|
+
throttledEmit(EVENTS.NOTIFICATION_BLOCKLET_UPDATE, {
|
|
97
|
+
teamDid,
|
|
98
|
+
notificationId,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Read notifications
|
|
107
|
+
* @param {Object} api - TeamAPI instance
|
|
108
|
+
* @param {Object} params
|
|
109
|
+
* @param {string} params.teamDid - Team DID
|
|
110
|
+
* @param {Object} context
|
|
111
|
+
* @returns {Promise<number>}
|
|
112
|
+
*/
|
|
113
|
+
async function readNotifications(api, { teamDid, ...rest }, context) {
|
|
114
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
115
|
+
const { numAffected, effectRows } = await notificationState.read({ teamDid, ...rest }, context);
|
|
116
|
+
api.teamManager.emitReadNotification(teamDid, {
|
|
117
|
+
readCount: numAffected,
|
|
118
|
+
receiver: rest.receiver,
|
|
119
|
+
notificationIds: rest.notificationIds ?? [],
|
|
120
|
+
effectRows,
|
|
121
|
+
});
|
|
122
|
+
return numAffected;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Unread notifications
|
|
127
|
+
* @param {Object} api - TeamAPI instance
|
|
128
|
+
* @param {Object} params
|
|
129
|
+
* @param {string} params.teamDid - Team DID
|
|
130
|
+
* @param {Object} context
|
|
131
|
+
* @returns {Promise<Object>}
|
|
132
|
+
*/
|
|
133
|
+
async function unreadNotifications(api, { teamDid, ...rest }, context) {
|
|
134
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
135
|
+
return notificationState.unread({ teamDid, ...rest }, context);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Get notification send log
|
|
140
|
+
* @param {Object} api - TeamAPI instance
|
|
141
|
+
* @param {Object} params
|
|
142
|
+
* @param {string} params.teamDid - Team DID
|
|
143
|
+
* @param {Object} context
|
|
144
|
+
* @returns {Promise<Object>}
|
|
145
|
+
*/
|
|
146
|
+
async function getNotificationSendLog(api, { teamDid, ...rest }, context) {
|
|
147
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
148
|
+
return notificationState.getNotificationSendLog({ ...rest }, context);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Get notification components
|
|
153
|
+
* @param {Object} api - TeamAPI instance
|
|
154
|
+
* @param {Object} params
|
|
155
|
+
* @param {string} params.teamDid - Team DID
|
|
156
|
+
* @param {Object} context
|
|
157
|
+
* @returns {Promise<Object>}
|
|
158
|
+
*/
|
|
159
|
+
async function getNotificationComponents(api, { teamDid, ...rest }, context) {
|
|
160
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
161
|
+
return notificationState.getNotificationComponents({ ...rest }, context);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Get receivers
|
|
166
|
+
* @param {Object} api - TeamAPI instance
|
|
167
|
+
* @param {Object} params
|
|
168
|
+
* @param {string} params.teamDid - Team DID
|
|
169
|
+
* @param {Object} context
|
|
170
|
+
* @returns {Promise<Object>}
|
|
171
|
+
*/
|
|
172
|
+
async function getReceivers(api, { teamDid, ...rest }, context) {
|
|
173
|
+
const notificationState = await api.getNotificationState(teamDid);
|
|
174
|
+
return notificationState.getNotificationReceivers({ ...rest }, context);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
module.exports = {
|
|
178
|
+
getNotification,
|
|
179
|
+
getNotificationById,
|
|
180
|
+
getNotificationsUnreadCount,
|
|
181
|
+
createNotificationReceiver,
|
|
182
|
+
markAllNotificationsAsRead,
|
|
183
|
+
updateNotificationStatus,
|
|
184
|
+
readNotifications,
|
|
185
|
+
unreadNotifications,
|
|
186
|
+
getNotificationSendLog,
|
|
187
|
+
getNotificationComponents,
|
|
188
|
+
getReceivers,
|
|
189
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get OAuth clients
|
|
3
|
+
* @param {Object} api - TeamAPI instance
|
|
4
|
+
* @param {Object} params
|
|
5
|
+
* @param {string} params.teamDid - Team DID
|
|
6
|
+
* @param {Object} params.paging - Paging options
|
|
7
|
+
* @returns {Promise<Object>}
|
|
8
|
+
*/
|
|
9
|
+
async function getOAuthClients(api, { teamDid, paging }) {
|
|
10
|
+
const { oauthClientState } = await api.teamManager.getOAuthState(teamDid);
|
|
11
|
+
return oauthClientState.list(paging);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Delete OAuth client
|
|
16
|
+
* @param {Object} api - TeamAPI instance
|
|
17
|
+
* @param {Object} params
|
|
18
|
+
* @param {string} params.teamDid - Team DID
|
|
19
|
+
* @param {string} params.clientId - Client ID
|
|
20
|
+
* @returns {Promise<Object>}
|
|
21
|
+
*/
|
|
22
|
+
async function deleteOAuthClient(api, { teamDid, clientId }) {
|
|
23
|
+
const { oauthClientState } = await api.teamManager.getOAuthState(teamDid);
|
|
24
|
+
return oauthClientState.remove({ clientId });
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Create OAuth client
|
|
29
|
+
* @param {Object} api - TeamAPI instance
|
|
30
|
+
* @param {Object} params
|
|
31
|
+
* @param {string} params.teamDid - Team DID
|
|
32
|
+
* @param {Object} params.input - OAuth client input
|
|
33
|
+
* @param {Object} context
|
|
34
|
+
* @returns {Promise<Object>}
|
|
35
|
+
*/
|
|
36
|
+
async function createOAuthClient(api, { teamDid, input }, context) {
|
|
37
|
+
const { oauthClientState } = await api.teamManager.getOAuthState(teamDid);
|
|
38
|
+
return oauthClientState.create(input, context);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Update OAuth client
|
|
43
|
+
* @param {Object} api - TeamAPI instance
|
|
44
|
+
* @param {Object} params
|
|
45
|
+
* @param {string} params.teamDid - Team DID
|
|
46
|
+
* @param {Object} params.input - OAuth client input
|
|
47
|
+
* @param {Object} context
|
|
48
|
+
* @returns {Promise<Object>}
|
|
49
|
+
*/
|
|
50
|
+
async function updateOAuthClient(api, { teamDid, input }, context) {
|
|
51
|
+
const { oauthClientState } = await api.teamManager.getOAuthState(teamDid);
|
|
52
|
+
return oauthClientState.update(input, context);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
module.exports = {
|
|
56
|
+
getOAuthClients,
|
|
57
|
+
deleteOAuthClient,
|
|
58
|
+
createOAuthClient,
|
|
59
|
+
updateOAuthClient,
|
|
60
|
+
};
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
const logger = require('@abtnode/logger')('@abtnode/core:api:team:org-crud');
|
|
2
|
+
const { CustomError } = require('@blocklet/error');
|
|
3
|
+
const md5 = require('@abtnode/util/lib/md5');
|
|
4
|
+
const { sanitizeTag } = require('@abtnode/util/lib/sanitize');
|
|
5
|
+
|
|
6
|
+
const { createOrgValidators } = require('../../util/org');
|
|
7
|
+
const { createOrgInputSchema, updateOrgInputSchema } = require('../../validators/org');
|
|
8
|
+
const { getBlocklet } = require('../../util/blocklet');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Issue org owner passport
|
|
12
|
+
* @param {Object} api - TeamAPI instance
|
|
13
|
+
* @param {Object} params
|
|
14
|
+
* @param {string} params.teamDid - Team DID
|
|
15
|
+
* @param {Object} params.org - Org
|
|
16
|
+
* @returns {Promise<void>}
|
|
17
|
+
*/
|
|
18
|
+
async function issueOrgOwnerPassport(api, { teamDid, org }) {
|
|
19
|
+
try {
|
|
20
|
+
// 创建 org 的 owner passport, 并赋值给 owner
|
|
21
|
+
const roleName = md5(`${org.id}-owner`); // 避免 name 重复
|
|
22
|
+
await api.createRole({ teamDid, name: roleName, title: org.name, description: 'Owner', orgId: org.id });
|
|
23
|
+
await api.issuePassportToUser({
|
|
24
|
+
teamDid,
|
|
25
|
+
userDid: org.ownerDid,
|
|
26
|
+
role: roleName,
|
|
27
|
+
notification: {},
|
|
28
|
+
});
|
|
29
|
+
} catch (err) {
|
|
30
|
+
logger.error('Failed to create passport to org owner', { err, teamDid, org });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Create org
|
|
36
|
+
* @param {Object} api - TeamAPI instance
|
|
37
|
+
* @param {Object} params
|
|
38
|
+
* @param {string} params.teamDid - Team DID
|
|
39
|
+
* @param {boolean} params.deferPassport - Defer passport
|
|
40
|
+
* @param {boolean} params.throwOnValidationError - Throw on validation error
|
|
41
|
+
* @param {Object} context
|
|
42
|
+
* @returns {Promise<Object>}
|
|
43
|
+
*/
|
|
44
|
+
async function createOrg(api, { teamDid, deferPassport = false, throwOnValidationError = true, ...rest }, context) {
|
|
45
|
+
try {
|
|
46
|
+
// 1. 对输入进行转义
|
|
47
|
+
const sanitizedOrg = {
|
|
48
|
+
...rest,
|
|
49
|
+
description: sanitizeTag(rest.description || ''),
|
|
50
|
+
name: sanitizeTag(rest.name || ''),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const { error } = createOrgInputSchema.validate(sanitizedOrg);
|
|
54
|
+
if (error) {
|
|
55
|
+
throw new CustomError(400, error.message);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const state = await api.getOrgState(teamDid);
|
|
59
|
+
const blocklet = await getBlocklet({
|
|
60
|
+
did: teamDid,
|
|
61
|
+
states: api.states,
|
|
62
|
+
dataDirs: api.dataDirs,
|
|
63
|
+
useCache: true,
|
|
64
|
+
});
|
|
65
|
+
const checkedUserDid = rest.ownerDid || context.user.did || '';
|
|
66
|
+
const orgCount = await state.getOrgCountByUser(checkedUserDid);
|
|
67
|
+
|
|
68
|
+
const { veriftMaxOrgPerUser } = createOrgValidators(blocklet);
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
veriftMaxOrgPerUser(orgCount); // 验证用户创建的 org 数量是否超过最大限制, 内部已经验证 org 是否开启
|
|
72
|
+
} catch (_error) {
|
|
73
|
+
if (throwOnValidationError) {
|
|
74
|
+
throw _error;
|
|
75
|
+
}
|
|
76
|
+
logger.warn('Failed to validate org creation', { error: _error, teamDid, orgCount });
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const result = await state.create({ ...sanitizedOrg }, context);
|
|
81
|
+
|
|
82
|
+
// 创建 org 的 owner passport, 并赋值给 owner
|
|
83
|
+
if (!deferPassport) {
|
|
84
|
+
await issueOrgOwnerPassport(api, { teamDid, org: result });
|
|
85
|
+
} else {
|
|
86
|
+
const jobId = md5(`${teamDid}-${result.id}-${checkedUserDid}`);
|
|
87
|
+
api.passportIssueQueue.push(
|
|
88
|
+
{
|
|
89
|
+
action: 'issueOrgOwnerPassport',
|
|
90
|
+
entity: 'blocklet',
|
|
91
|
+
entityId: teamDid,
|
|
92
|
+
params: {
|
|
93
|
+
teamDid,
|
|
94
|
+
org: result,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
jobId,
|
|
98
|
+
true
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return result;
|
|
103
|
+
} catch (err) {
|
|
104
|
+
logger.error('Failed to create org', err, {
|
|
105
|
+
teamDid,
|
|
106
|
+
name: rest.name,
|
|
107
|
+
userDid: rest.ownerDid || context.user.did || '',
|
|
108
|
+
});
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Create default org for user
|
|
115
|
+
* @param {Object} api - TeamAPI instance
|
|
116
|
+
* @param {Object} params
|
|
117
|
+
* @param {string} params.teamDid - Team DID
|
|
118
|
+
* @param {Object} params.user - User
|
|
119
|
+
* @returns {Promise<void>}
|
|
120
|
+
*/
|
|
121
|
+
async function createDefaultOrgForUser(api, { teamDid, user }) {
|
|
122
|
+
try {
|
|
123
|
+
// 创建失败不要影响主流程
|
|
124
|
+
await createOrg(
|
|
125
|
+
api,
|
|
126
|
+
{
|
|
127
|
+
teamDid,
|
|
128
|
+
name: user.fullName,
|
|
129
|
+
description: `this is a default org for ${user.fullName}`,
|
|
130
|
+
throwOnValidationError: false,
|
|
131
|
+
},
|
|
132
|
+
{ user }
|
|
133
|
+
);
|
|
134
|
+
} catch (err) {
|
|
135
|
+
logger.error('Failed to create default org for user', { err, teamDid, user });
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Update org
|
|
141
|
+
* @param {Object} api - TeamAPI instance
|
|
142
|
+
* @param {Object} params
|
|
143
|
+
* @param {string} params.teamDid - Team DID
|
|
144
|
+
* @param {Object} params.org - Org
|
|
145
|
+
* @param {Object} context
|
|
146
|
+
* @returns {Promise<Object>}
|
|
147
|
+
*/
|
|
148
|
+
async function updateOrg(api, { teamDid, org }, context) {
|
|
149
|
+
try {
|
|
150
|
+
const sanitizedOrg = {
|
|
151
|
+
...org,
|
|
152
|
+
description: sanitizeTag(org.description),
|
|
153
|
+
name: sanitizeTag(org.name),
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
const { error } = updateOrgInputSchema.validate(sanitizedOrg);
|
|
157
|
+
if (error) {
|
|
158
|
+
throw new CustomError(400, error.message);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const state = await api.getOrgState(teamDid);
|
|
162
|
+
return state.updateOrg({ org: sanitizedOrg }, context);
|
|
163
|
+
} catch (err) {
|
|
164
|
+
logger.error('Failed to update org', { err, teamDid });
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Delete org
|
|
171
|
+
* @param {Object} api - TeamAPI instance
|
|
172
|
+
* @param {Object} params
|
|
173
|
+
* @param {string} params.teamDid - Team DID
|
|
174
|
+
* @param {string} params.id - Org ID
|
|
175
|
+
* @param {Object} context
|
|
176
|
+
* @returns {Promise<Object>}
|
|
177
|
+
*/
|
|
178
|
+
async function deleteOrg(api, { teamDid, id }, context) {
|
|
179
|
+
try {
|
|
180
|
+
const state = await api.getOrgState(teamDid);
|
|
181
|
+
// 要同时删除与 org 相关的 passport 和 邀请链接
|
|
182
|
+
const roles = await api.getRoles({ teamDid, orgId: id });
|
|
183
|
+
const result = await state.deleteOrg({ id }, context);
|
|
184
|
+
try {
|
|
185
|
+
await state.removeOrgRelatedData({ roles, orgId: id });
|
|
186
|
+
} catch (err) {
|
|
187
|
+
logger.error('Failed to remove org related data', { err, teamDid, roles, id });
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
} catch (err) {
|
|
191
|
+
logger.error('Failed to delete org', { err, teamDid, id });
|
|
192
|
+
throw err;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
module.exports = {
|
|
197
|
+
issueOrgOwnerPassport,
|
|
198
|
+
createOrg,
|
|
199
|
+
createDefaultOrgForUser,
|
|
200
|
+
updateOrg,
|
|
201
|
+
deleteOrg,
|
|
202
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Org Manager - Orchestrates organization management operations
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports functionality from specialized sub-modules:
|
|
5
|
+
* - org-query-manager.js: Organization query operations
|
|
6
|
+
* - org-crud-manager.js: Organization CRUD operations
|
|
7
|
+
* - org-member-manager.js: Organization member management operations
|
|
8
|
+
* - org-resource-manager.js: Organization resource and notification operations
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { getOrgs, getOrg, getOrgMembers, getOrgInvitableUsers } = require('./org-query-manager');
|
|
12
|
+
const {
|
|
13
|
+
issueOrgOwnerPassport,
|
|
14
|
+
createOrg,
|
|
15
|
+
createDefaultOrgForUser,
|
|
16
|
+
updateOrg,
|
|
17
|
+
deleteOrg,
|
|
18
|
+
} = require('./org-crud-manager');
|
|
19
|
+
const {
|
|
20
|
+
addOrgMember,
|
|
21
|
+
updateOrgMember,
|
|
22
|
+
sendInvitationNotification,
|
|
23
|
+
getFederatedMasterBlockletInfo,
|
|
24
|
+
inviteMembersToOrg,
|
|
25
|
+
removeOrgMember,
|
|
26
|
+
} = require('./org-member-manager');
|
|
27
|
+
const {
|
|
28
|
+
getOrgResource,
|
|
29
|
+
addOrgResource,
|
|
30
|
+
removeOrgResource,
|
|
31
|
+
migrateOrgResource,
|
|
32
|
+
getNotificationStats,
|
|
33
|
+
} = require('./org-resource-manager');
|
|
34
|
+
|
|
35
|
+
module.exports = {
|
|
36
|
+
getOrgs,
|
|
37
|
+
getOrg,
|
|
38
|
+
createDefaultOrgForUser,
|
|
39
|
+
issueOrgOwnerPassport,
|
|
40
|
+
createOrg,
|
|
41
|
+
updateOrg,
|
|
42
|
+
deleteOrg,
|
|
43
|
+
addOrgMember,
|
|
44
|
+
updateOrgMember,
|
|
45
|
+
sendInvitationNotification,
|
|
46
|
+
getFederatedMasterBlockletInfo,
|
|
47
|
+
inviteMembersToOrg,
|
|
48
|
+
removeOrgMember,
|
|
49
|
+
getOrgMembers,
|
|
50
|
+
getOrgInvitableUsers,
|
|
51
|
+
getOrgResource,
|
|
52
|
+
addOrgResource,
|
|
53
|
+
removeOrgResource,
|
|
54
|
+
migrateOrgResource,
|
|
55
|
+
getNotificationStats,
|
|
56
|
+
};
|