@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.
Files changed (65) hide show
  1. package/lib/api/team/access-key-manager.js +104 -0
  2. package/lib/api/team/invitation-manager.js +461 -0
  3. package/lib/api/team/notification-manager.js +189 -0
  4. package/lib/api/team/oauth-manager.js +60 -0
  5. package/lib/api/team/org-crud-manager.js +202 -0
  6. package/lib/api/team/org-manager.js +56 -0
  7. package/lib/api/team/org-member-manager.js +403 -0
  8. package/lib/api/team/org-query-manager.js +126 -0
  9. package/lib/api/team/org-resource-manager.js +186 -0
  10. package/lib/api/team/passport-manager.js +670 -0
  11. package/lib/api/team/rbac-manager.js +335 -0
  12. package/lib/api/team/session-manager.js +540 -0
  13. package/lib/api/team/store-manager.js +198 -0
  14. package/lib/api/team/tag-manager.js +230 -0
  15. package/lib/api/team/user-auth-manager.js +132 -0
  16. package/lib/api/team/user-manager.js +78 -0
  17. package/lib/api/team/user-query-manager.js +299 -0
  18. package/lib/api/team/user-social-manager.js +354 -0
  19. package/lib/api/team/user-update-manager.js +224 -0
  20. package/lib/api/team/verify-code-manager.js +161 -0
  21. package/lib/api/team.js +439 -3287
  22. package/lib/blocklet/manager/disk/auth-manager.js +68 -0
  23. package/lib/blocklet/manager/disk/backup-manager.js +288 -0
  24. package/lib/blocklet/manager/disk/cleanup-manager.js +157 -0
  25. package/lib/blocklet/manager/disk/component-manager.js +83 -0
  26. package/lib/blocklet/manager/disk/config-manager.js +191 -0
  27. package/lib/blocklet/manager/disk/controller-manager.js +64 -0
  28. package/lib/blocklet/manager/disk/delete-reset-manager.js +328 -0
  29. package/lib/blocklet/manager/disk/download-manager.js +96 -0
  30. package/lib/blocklet/manager/disk/env-config-manager.js +311 -0
  31. package/lib/blocklet/manager/disk/federated-manager.js +651 -0
  32. package/lib/blocklet/manager/disk/hook-manager.js +124 -0
  33. package/lib/blocklet/manager/disk/install-component-manager.js +95 -0
  34. package/lib/blocklet/manager/disk/install-core-manager.js +448 -0
  35. package/lib/blocklet/manager/disk/install-download-manager.js +313 -0
  36. package/lib/blocklet/manager/disk/install-manager.js +36 -0
  37. package/lib/blocklet/manager/disk/install-upgrade-manager.js +340 -0
  38. package/lib/blocklet/manager/disk/job-manager.js +467 -0
  39. package/lib/blocklet/manager/disk/lifecycle-manager.js +26 -0
  40. package/lib/blocklet/manager/disk/notification-manager.js +343 -0
  41. package/lib/blocklet/manager/disk/query-manager.js +562 -0
  42. package/lib/blocklet/manager/disk/settings-manager.js +507 -0
  43. package/lib/blocklet/manager/disk/start-manager.js +611 -0
  44. package/lib/blocklet/manager/disk/stop-restart-manager.js +292 -0
  45. package/lib/blocklet/manager/disk/update-manager.js +153 -0
  46. package/lib/blocklet/manager/disk.js +669 -5796
  47. package/lib/blocklet/manager/helper/blue-green-start-blocklet.js +5 -0
  48. package/lib/blocklet/manager/lock.js +18 -0
  49. package/lib/event/index.js +28 -24
  50. package/lib/util/blocklet/app-utils.js +192 -0
  51. package/lib/util/blocklet/blocklet-loader.js +258 -0
  52. package/lib/util/blocklet/config-manager.js +232 -0
  53. package/lib/util/blocklet/did-document.js +240 -0
  54. package/lib/util/blocklet/environment.js +555 -0
  55. package/lib/util/blocklet/health-check.js +449 -0
  56. package/lib/util/blocklet/install-utils.js +365 -0
  57. package/lib/util/blocklet/logo.js +57 -0
  58. package/lib/util/blocklet/meta-utils.js +269 -0
  59. package/lib/util/blocklet/port-manager.js +141 -0
  60. package/lib/util/blocklet/process-manager.js +504 -0
  61. package/lib/util/blocklet/runtime-info.js +105 -0
  62. package/lib/util/blocklet/validation.js +418 -0
  63. package/lib/util/blocklet.js +98 -3066
  64. package/lib/util/wallet-app-notification.js +40 -0
  65. 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
+ };