@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,186 @@
1
+ const dayjs = require('@abtnode/util/lib/dayjs');
2
+ const logger = require('@abtnode/logger')('@abtnode/core:api:team:org-resource');
3
+ const { NOTIFICATION_SEND_CHANNEL } = require('@abtnode/constant');
4
+ const { getBlockletAppIdList } = require('@blocklet/meta/lib/util');
5
+
6
+ const { getBlocklet } = require('../../util/blocklet');
7
+ const { checkPushChannelAvailable, getNotificationPushState } = require('../../util/notification');
8
+
9
+ /**
10
+ * Get org resource
11
+ * @param {Object} api - TeamAPI instance
12
+ * @param {Object} params
13
+ * @param {string} params.teamDid - Team DID
14
+ * @param {string} params.orgId - Org ID
15
+ * @param {string} params.resourceId - Resource ID
16
+ * @param {Object} context
17
+ * @returns {Promise<Object>}
18
+ */
19
+ async function getOrgResource(api, { teamDid, orgId, resourceId }, context) {
20
+ try {
21
+ const state = await api.getOrgState(teamDid);
22
+ return state.getOrgResource({ orgId, resourceId }, context);
23
+ } catch (err) {
24
+ logger.error('Get org resource failed', { err, teamDid, orgId, resourceId });
25
+ throw err;
26
+ }
27
+ }
28
+
29
+ /**
30
+ * Add org resource
31
+ * @param {Object} api - TeamAPI instance
32
+ * @param {Object} params
33
+ * @param {string} params.teamDid - Team DID
34
+ * @param {string} params.orgId - Org ID
35
+ * @param {Array} params.resourceIds - Resource IDs
36
+ * @param {string} params.type - Type
37
+ * @param {Object} params.metadata - Metadata
38
+ * @param {Object} context
39
+ * @returns {Promise<Object>}
40
+ */
41
+ async function addOrgResource(api, { teamDid, orgId, resourceIds, type, metadata }, context) {
42
+ try {
43
+ const state = await api.getOrgState(teamDid);
44
+ return state.addOrgResource({ orgId, resourceIds, type, metadata }, context);
45
+ } catch (err) {
46
+ logger.error('Add org resource failed', { err, teamDid, orgId, resourceIds, type, metadata });
47
+ throw err;
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Remove org resource
53
+ * @param {Object} api - TeamAPI instance
54
+ * @param {Object} params
55
+ * @param {string} params.teamDid - Team DID
56
+ * @param {string} params.orgId - Org ID
57
+ * @param {Array} params.resourceIds - Resource IDs
58
+ * @param {Object} context
59
+ * @returns {Promise<Object>}
60
+ */
61
+ async function removeOrgResource(api, { teamDid, orgId, resourceIds }, context) {
62
+ try {
63
+ const state = await api.getOrgState(teamDid);
64
+ return state.removeOrgResource({ orgId, resourceIds }, context);
65
+ } catch (err) {
66
+ logger.error('Remove org resource failed', { err, teamDid, orgId, resourceIds });
67
+ throw err;
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Migrate org resource
73
+ * @param {Object} api - TeamAPI instance
74
+ * @param {Object} params
75
+ * @param {string} params.teamDid - Team DID
76
+ * @param {string} params.from - From org ID
77
+ * @param {string} params.to - To org ID
78
+ * @param {Array} params.resourceIds - Resource IDs
79
+ * @param {Object} context
80
+ * @returns {Promise<Object>}
81
+ */
82
+ async function migrateOrgResource(api, { teamDid, from, to, resourceIds }, context) {
83
+ try {
84
+ const state = await api.getOrgState(teamDid);
85
+ return state.migrateOrgResource({ from, to, resourceIds }, context);
86
+ } catch (err) {
87
+ logger.error('Migrate org resource failed', { err, teamDid, from, to, resourceIds });
88
+ throw err;
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Get notification stats
94
+ * @param {Object} api - TeamAPI instance
95
+ * @param {Object} params
96
+ * @param {string} params.teamDid - Team DID
97
+ * @param {string} params.since - Since time (e.g., '1h')
98
+ * @returns {Promise<Object>}
99
+ */
100
+ async function getNotificationStats(api, { teamDid, since = '1h' }) {
101
+ let startTime = dayjs().subtract(1, 'hours').toDate();
102
+
103
+ if (since && typeof since === 'string') {
104
+ const sinceMatch = since.match(/^(\d+)h$/);
105
+ if (sinceMatch) {
106
+ let hours = parseInt(sinceMatch[1], 10);
107
+ if (hours < 1 || hours > 24) {
108
+ hours = Math.min(Math.max(hours, 1), 24);
109
+ }
110
+ startTime = dayjs().subtract(hours, 'hours').toDate();
111
+ }
112
+ }
113
+
114
+ try {
115
+ const state = await api.getNotificationState(teamDid);
116
+ const isServer = api.teamManager.isNodeTeam(teamDid);
117
+ const blocklet = isServer ? {} : await getBlocklet({ did: teamDid, states: api.states, dataDirs: api.dataDirs });
118
+ const channelsAvailable = checkPushChannelAvailable(blocklet, isServer);
119
+ const results = await state.getNotificationsBySince({ since });
120
+
121
+ if (results.length === 0) {
122
+ return {
123
+ healthy: true,
124
+ message: `There have been no push records since ${startTime}. Please choose another time range`,
125
+ since: startTime,
126
+ channels: channelsAvailable,
127
+ };
128
+ }
129
+
130
+ const pushState = getNotificationPushState(results, channelsAvailable, isServer);
131
+
132
+ let teamDids = [teamDid];
133
+ if (isServer) {
134
+ const nodeInfo = await api.node.read();
135
+ teamDids = [nodeInfo.did];
136
+ } else {
137
+ teamDids = getBlockletAppIdList(blocklet);
138
+ }
139
+
140
+ const pendingResult = await api.states.job.getPendingNotifications({
141
+ teamDids,
142
+ isServer,
143
+ channels: Object.keys(channelsAvailable),
144
+ createdAt: startTime,
145
+ });
146
+
147
+ // pushState 的 key 与 pendingResult 的 key 映射关系
148
+ const channelKeyMap = {
149
+ pushKit: NOTIFICATION_SEND_CHANNEL.PUSH,
150
+ wallet: NOTIFICATION_SEND_CHANNEL.WALLET,
151
+ email: NOTIFICATION_SEND_CHANNEL.EMAIL,
152
+ webhook: NOTIFICATION_SEND_CHANNEL.WEBHOOK,
153
+ };
154
+
155
+ // 合并 pending 数量到对应的 channel
156
+ const channels = Object.entries(pushState).reduce((acc, [key, value]) => {
157
+ const pendingKey = channelKeyMap[key] || key;
158
+ acc[key] = {
159
+ ...value,
160
+ pending: pendingResult[pendingKey] || 0,
161
+ };
162
+ return acc;
163
+ }, {});
164
+
165
+ return {
166
+ healthy: true,
167
+ since: startTime,
168
+ channels,
169
+ };
170
+ } catch (err) {
171
+ logger.error('Get notification service health failed', err, { teamDid });
172
+ return {
173
+ healthy: false,
174
+ error: err.message,
175
+ since: startTime,
176
+ };
177
+ }
178
+ }
179
+
180
+ module.exports = {
181
+ getOrgResource,
182
+ addOrgResource,
183
+ removeOrgResource,
184
+ migrateOrgResource,
185
+ getNotificationStats,
186
+ };