@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 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
- const sanitized = sanitizeUrl(url);
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
- const list = await state.getUsers();
75
-
76
- return list.map(
77
- (d) =>
78
- pick(d, [
79
- 'did',
80
- 'pk',
81
- 'role',
82
- 'email',
83
- 'fullName',
84
- 'approved',
85
- 'createdAt',
86
- 'updatedAt',
87
- 'passports',
88
- 'firstLoginAt',
89
- 'lastLoginAt',
90
- 'remark',
91
- ])
92
- // eslint-disable-next-line function-paren-newline
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