@abtnode/core 1.7.26 → 1.8.1
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/node.js +14 -1
- package/lib/api/team.js +54 -22
- package/lib/blocklet/manager/disk.js +378 -99
- package/lib/cert.js +10 -5
- package/lib/event.js +8 -0
- package/lib/index.js +8 -1
- package/lib/router/helper.js +2 -1
- package/lib/router/index.js +2 -5
- package/lib/router/manager.js +0 -34
- package/lib/states/audit-log.js +6 -1
- package/lib/states/session.js +7 -1
- package/lib/states/user.js +41 -5
- package/lib/team/manager.js +34 -4
- package/lib/util/blocklet.js +2 -22
- package/lib/util/index.js +4 -1
- package/package.json +17 -16
package/lib/api/node.js
CHANGED
|
@@ -7,6 +7,7 @@ const isGitpod = require('@abtnode/util/lib/is-gitpod');
|
|
|
7
7
|
const getFolderSize = require('@abtnode/util/lib/get-folder-size');
|
|
8
8
|
const canPackageReadWrite = require('@abtnode/util/lib/can-pkg-rw');
|
|
9
9
|
const { toDelegateAddress } = require('@arcblock/did-util');
|
|
10
|
+
const { STORE_DETAIL_PAGE_PATH_PREFIX } = require('@abtnode/constant');
|
|
10
11
|
|
|
11
12
|
const logger = require('@abtnode/logger')('@abtnode/core:api:node');
|
|
12
13
|
|
|
@@ -40,7 +41,19 @@ class NodeAPI {
|
|
|
40
41
|
// eslint-disable-next-line no-unused-vars
|
|
41
42
|
async addRegistry({ url }, context) {
|
|
42
43
|
logger.info('add registry', { url });
|
|
43
|
-
|
|
44
|
+
|
|
45
|
+
const urlObj = new URL(url);
|
|
46
|
+
let newUrl = urlObj.origin;
|
|
47
|
+
|
|
48
|
+
// if the pathname is store blocklet list or blocklet detail
|
|
49
|
+
if (urlObj.pathname?.includes(STORE_DETAIL_PAGE_PATH_PREFIX)) {
|
|
50
|
+
const lastIndex = urlObj.pathname.lastIndexOf(STORE_DETAIL_PAGE_PATH_PREFIX);
|
|
51
|
+
const pathnamePrefix = urlObj.pathname.substring(0, lastIndex);
|
|
52
|
+
newUrl = `${newUrl}${pathnamePrefix || ''}`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const sanitized = sanitizeUrl(newUrl);
|
|
56
|
+
|
|
44
57
|
const info = await this.state.read();
|
|
45
58
|
const exist = info.blockletRegistryList.find((x) => x.url === sanitized);
|
|
46
59
|
if (exist) {
|
package/lib/api/team.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
const { EventEmitter } = require('events');
|
|
2
2
|
const pick = require('lodash/pick');
|
|
3
3
|
const logger = require('@abtnode/logger')('@abtnode/core:api:team');
|
|
4
|
-
const { ROLES, genPermissionName, EVENTS, WHO_CAN_ACCESS } = require('@abtnode/constant');
|
|
4
|
+
const { ROLES, genPermissionName, EVENTS, WHO_CAN_ACCESS, PASSPORT_STATUS } = require('@abtnode/constant');
|
|
5
5
|
const { isValid: isValidDid } = require('@arcblock/did');
|
|
6
6
|
const { BlockletEvents } = require('@blocklet/meta/lib/constants');
|
|
7
7
|
const { validateTrustedPassportIssuers } = require('../validators/trusted-passport');
|
|
8
8
|
const { validateCreateRole, validateUpdateRole } = require('../validators/role');
|
|
9
9
|
const { validateCreatePermission, validateUpdatePermission } = require('../validators/permission');
|
|
10
10
|
|
|
11
|
+
const MAX_USER_PAGE_SIZE = 100;
|
|
12
|
+
|
|
11
13
|
const validateReservedRole = (role) => {
|
|
12
14
|
if (Object.values(ROLES).includes(role)) {
|
|
13
15
|
throw new Error(`The role ${role} is reserved`);
|
|
@@ -68,29 +70,37 @@ class TeamAPI extends EventEmitter {
|
|
|
68
70
|
return doc;
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
async getUsers({ teamDid }) {
|
|
73
|
+
async getUsers({ teamDid, query, paging: inputPaging, sort }) {
|
|
72
74
|
const state = await this.getUserState(teamDid);
|
|
73
75
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
76
|
+
if (inputPaging?.pageSize > MAX_USER_PAGE_SIZE) {
|
|
77
|
+
throw new Error(`Length of users should not exceed ${MAX_USER_PAGE_SIZE} per page`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const { list, paging } = await state.getUsers({ query, sort, paging: { pageSize: 20, ...inputPaging } });
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
users: list.map(
|
|
84
|
+
(d) =>
|
|
85
|
+
pick(d, [
|
|
86
|
+
'did',
|
|
87
|
+
'pk',
|
|
88
|
+
'role',
|
|
89
|
+
'email',
|
|
90
|
+
'fullName',
|
|
91
|
+
'approved',
|
|
92
|
+
'createdAt',
|
|
93
|
+
'updatedAt',
|
|
94
|
+
'passports',
|
|
95
|
+
'firstLoginAt',
|
|
96
|
+
'lastLoginAt',
|
|
97
|
+
'remark',
|
|
98
|
+
'avatar',
|
|
99
|
+
])
|
|
100
|
+
// eslint-disable-next-line function-paren-newline
|
|
101
|
+
),
|
|
102
|
+
paging,
|
|
103
|
+
};
|
|
94
104
|
}
|
|
95
105
|
|
|
96
106
|
async getUsersCount({ teamDid }) {
|
|
@@ -99,6 +109,28 @@ class TeamAPI extends EventEmitter {
|
|
|
99
109
|
return state.count();
|
|
100
110
|
}
|
|
101
111
|
|
|
112
|
+
async getUsersCountPerRole({ teamDid }) {
|
|
113
|
+
const roles = await this.getRoles({ teamDid });
|
|
114
|
+
|
|
115
|
+
const state = await this.getUserState(teamDid);
|
|
116
|
+
|
|
117
|
+
const res = [];
|
|
118
|
+
|
|
119
|
+
const all = await state.count();
|
|
120
|
+
res.push({ key: '$all', value: all });
|
|
121
|
+
|
|
122
|
+
for (const { name } of roles) {
|
|
123
|
+
// eslint-disable-next-line no-await-in-loop
|
|
124
|
+
const count = await state.count({ passports: { $elemMatch: { name, status: PASSPORT_STATUS.VALID } } });
|
|
125
|
+
res.push({ key: name, value: count });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const none = await state.count({ passports: { $size: 0 } });
|
|
129
|
+
res.push({ key: '$none', value: none });
|
|
130
|
+
|
|
131
|
+
return res;
|
|
132
|
+
}
|
|
133
|
+
|
|
102
134
|
async getUser({ teamDid, user }) {
|
|
103
135
|
const state = await this.getUserState(teamDid);
|
|
104
136
|
|