@abtnode/core 1.16.26-beta-818ea1c5 → 1.16.26-beta-351de484

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.js CHANGED
@@ -196,6 +196,19 @@ class TeamAPI extends EventEmitter {
196
196
  return doc;
197
197
  }
198
198
 
199
+ async disconnectUserAccount({ teamDid, connectedAccount }) {
200
+ const state = await this.getUserState(teamDid);
201
+ const result = await state.disconnectUserAccount(connectedAccount);
202
+
203
+ logger.info('user disconnect account successfully', {
204
+ teamDid,
205
+ connectedAccountDid: connectedAccount.did,
206
+ connectedAccountPk: connectedAccount.pk,
207
+ connectedAccountProvider: connectedAccount.provider,
208
+ });
209
+ return result;
210
+ }
211
+
199
212
  async addUser({ teamDid, user }) {
200
213
  const state = await this.getUserState(teamDid);
201
214
 
@@ -1340,7 +1353,7 @@ class TeamAPI extends EventEmitter {
1340
1353
  }
1341
1354
 
1342
1355
  // eslint-disable-next-line no-unused-vars
1343
- async deleteStore({ teamDid, url }, context) {
1356
+ async deleteStore({ teamDid, url, projectId }, context) {
1344
1357
  logger.info('delete registry', { url });
1345
1358
  const sanitized = sanitizeUrl(url);
1346
1359
 
@@ -1350,11 +1363,9 @@ class TeamAPI extends EventEmitter {
1350
1363
  throw new Error(`Blocklet registry does not exist: ${sanitized}`);
1351
1364
  }
1352
1365
 
1353
- const settings = await this.states.blockletExtras.getSettings(teamDid);
1354
-
1355
- if (settings?.connectedStores?.length) {
1356
- settings.connectedStores = settings.connectedStores.filter((x) => x.storeUrl !== sanitized);
1357
- await this.states.blockletExtras.setSettings(teamDid, settings);
1366
+ if (projectId) {
1367
+ const { projectState } = await this.teamManager.getProjectState(teamDid);
1368
+ await projectState.deleteConnectedStore(projectId, url);
1358
1369
  }
1359
1370
 
1360
1371
  return this.teamManager.updateStoreList(
@@ -10,6 +10,7 @@ const merge = require('lodash/merge');
10
10
  const pick = require('lodash/pick');
11
11
  const isEmpty = require('lodash/isEmpty');
12
12
  const cloneDeep = require('lodash/cloneDeep');
13
+ const defaultsDeep = require('lodash/defaultsDeep');
13
14
  const { sign } = require('@arcblock/jwt');
14
15
  const { isInServerlessMode } = require('@abtnode/util/lib/serverless');
15
16
  const sleep = require('@abtnode/util/lib/sleep');
@@ -1689,7 +1690,7 @@ class DiskBlockletManager extends BaseBlockletManager {
1689
1690
 
1690
1691
  async configOAuth({ did, oauth = {} }, context) {
1691
1692
  const oldOAuth = await states.blockletExtras.getSettings(did, 'oauth', {});
1692
- const mergeConfig = { ...oldOAuth, ...JSON.parse(oauth) };
1693
+ const mergeConfig = defaultsDeep(JSON.parse(oauth), oldOAuth);
1693
1694
  await states.blockletExtras.setSettings(did, { oauth: mergeConfig });
1694
1695
  const newState = await this.getBlocklet(did);
1695
1696
  this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
@@ -2357,11 +2358,11 @@ class DiskBlockletManager extends BaseBlockletManager {
2357
2358
  }
2358
2359
 
2359
2360
  connectToStore(params) {
2360
- return connectToStore({ ...params, manager: this, blockletExtras: states.blockletExtras });
2361
+ return connectToStore({ ...params, manager: this });
2361
2362
  }
2362
2363
 
2363
2364
  publishToStore(params) {
2364
- return publishToStore({ ...params, manager: this, blockletExtras: states.blockletExtras });
2365
+ return publishToStore({ ...params, manager: this });
2365
2366
  }
2366
2367
 
2367
2368
  getSelectedResources({ did, projectId, releaseId, componentDid } = {}) {
@@ -4733,7 +4734,17 @@ class FederatedBlockletManager extends DiskBlockletManager {
4733
4734
  const { users, sites } = data;
4734
4735
  if (users && Array.isArray(users)) {
4735
4736
  safeData.users = users.map((item) =>
4736
- pick(item, ['did', 'pk', 'fullName', 'avatar', 'email', 'connectedAccount', 'action', 'sourceAppPid'])
4737
+ pick(item, [
4738
+ 'did',
4739
+ 'pk',
4740
+ 'fullName',
4741
+ 'avatar',
4742
+ 'email',
4743
+ 'connectedAccount',
4744
+ 'disconnectedAccount',
4745
+ 'action',
4746
+ 'sourceAppPid',
4747
+ ])
4737
4748
  );
4738
4749
  }
4739
4750
 
@@ -1,9 +1,9 @@
1
1
  const validUrl = require('valid-url');
2
2
 
3
3
  const { createConnect } = require('@blocklet/store');
4
- const { BlockletEvents } = require('@blocklet/constant');
4
+ const { STUDIO_CONNECTED_STORE } = require('@abtnode/constant');
5
5
 
6
- const connectToStore = async ({ did, storeName, storeId, storeUrl, blockletExtras, manager }) => {
6
+ const connectToStore = ({ did, projectId, storeName, storeId, storeUrl, manager }) => {
7
7
  if (!did) {
8
8
  throw new Error('Invalid did');
9
9
  }
@@ -11,11 +11,22 @@ const connectToStore = async ({ did, storeName, storeId, storeUrl, blockletExtra
11
11
  if (!validUrl.isWebUri(storeUrl)) {
12
12
  throw new Error('Invalid store url:', storeUrl);
13
13
  }
14
- const settings = await blockletExtras.getSettings(did);
15
14
 
16
15
  // eslint-disable-next-line no-async-promise-executor
17
16
  return new Promise(async (resolve, reject) => {
18
17
  try {
18
+ // 基于 nextWorkflow 这样的实现目前体验有些问题, 暂时还无法使用 connect-by-studio
19
+ // const fetchData = await createConnect({
20
+ // connectUrl: storeUrl,
21
+ // projectId,
22
+ // userDid,
23
+ // connectAction: 'connect-by-studio',
24
+ // enableEncrypt: true,
25
+ // openPage: (pageUrl) => {
26
+ // resolve(pageUrl);
27
+ // },
28
+ // });
29
+
19
30
  const fetchData = await createConnect({
20
31
  connectUrl: storeUrl,
21
32
  connectAction: 'connect-cli',
@@ -24,9 +35,14 @@ const connectToStore = async ({ did, storeName, storeId, storeUrl, blockletExtra
24
35
  resolve(pageUrl);
25
36
  },
26
37
  });
38
+
27
39
  const { secretKey, developerDid, name, email } = fetchData;
28
- if (!settings.connectedStores) {
29
- settings.connectedStores = [];
40
+
41
+ const { projectState } = await manager._getProjectState(did);
42
+ const project = await projectState.findOne({ id: projectId });
43
+
44
+ if (!project.connectedStores) {
45
+ project.connectedStores = [];
30
46
  }
31
47
 
32
48
  const nextStore = {
@@ -39,14 +55,14 @@ const connectToStore = async ({ did, storeName, storeId, storeUrl, blockletExtra
39
55
  developerEmail: email,
40
56
  };
41
57
 
42
- const oldStore = settings.connectedStores.find((x) => x.storeUrl === storeUrl);
58
+ const oldStore = project.connectedStores.find((x) => x.storeId === storeId);
43
59
  if (oldStore) {
44
60
  Object.assign(oldStore, nextStore);
45
61
  } else {
46
- settings.connectedStores.push(nextStore);
62
+ project.connectedStores.push(nextStore);
47
63
  }
48
64
 
49
- await blockletExtras.setSettings(did, settings);
65
+ await projectState.updateProject(projectId, project);
50
66
 
51
67
  await manager.teamManager.createNotification({
52
68
  teamDid: did,
@@ -54,12 +70,9 @@ const connectToStore = async ({ did, storeName, storeId, storeUrl, blockletExtra
54
70
  description: `You can publish your blocklet to ${storeName} now`,
55
71
  entityType: 'blocklet',
56
72
  entityId: did,
73
+ meta: { did, eventType: STUDIO_CONNECTED_STORE },
57
74
  severity: 'success',
58
75
  });
59
-
60
- manager.emit(BlockletEvents.updated, {
61
- meta: { did },
62
- });
63
76
  } catch (error) {
64
77
  reject(error);
65
78
  }
@@ -46,15 +46,20 @@ const createProject = async ({ did, type, blockletTitle, blockletDid, componentD
46
46
  return project;
47
47
  };
48
48
 
49
- const getProjects = async ({ did, manager, componentDid }) => {
49
+ const getProjects = async ({ did, manager, componentDid, showAccessToken }) => {
50
50
  const { projectState } = await manager._getProjectState(did);
51
- const projects = await projectState.getProjects({ componentDid });
51
+ const projects = await projectState.getProjects({ componentDid, showAccessToken });
52
52
  return { projects };
53
53
  };
54
54
 
55
- const getProject = async ({ did, projectId, manager }) => {
55
+ const getProject = async ({ did, projectId, manager, showAccessToken }) => {
56
56
  const { projectState } = await manager._getProjectState(did);
57
57
  const project = await projectState.findOne({ id: projectId });
58
+ if (!showAccessToken) {
59
+ project.connectedStores?.forEach((store) => {
60
+ store.accessToken = store.accessToken ? '__encrypted__' : '';
61
+ });
62
+ }
58
63
  return project;
59
64
  };
60
65
 
@@ -17,7 +17,7 @@ function getReleaseDir(blocklet, projectId, releaseId) {
17
17
  return path.join(projectDir, PROJECT.RELEASE_DIR, `${releaseId}`);
18
18
  }
19
19
 
20
- const publishToStore = async ({ did, projectId, releaseId, type, storeId, manager, blockletExtras }) => {
20
+ const publishToStore = async ({ did, projectId, releaseId, type, storeId, manager }) => {
21
21
  if (
22
22
  !did ||
23
23
  !projectId ||
@@ -30,21 +30,16 @@ const publishToStore = async ({ did, projectId, releaseId, type, storeId, manage
30
30
  throw new Error('params is failed');
31
31
  }
32
32
 
33
- const { releaseState } = await manager._getProjectState(did);
33
+ const { releaseState, projectState } = await manager._getProjectState(did);
34
34
 
35
35
  const release = await releaseState.findOne({ projectId, id: releaseId });
36
36
  if (!release) {
37
37
  throw new Error('release not found');
38
38
  }
39
39
 
40
- const settings = await blockletExtras.getSettings(did);
41
-
42
- if (!settings.connectedStores) {
43
- throw new Error('no connected stores');
44
- }
45
- const store = settings.connectedStores.find((x) => x.storeId === storeId);
40
+ const store = await projectState.getConnectedStore(projectId, storeId);
46
41
  if (!store) {
47
- throw new Error('no connected stores');
42
+ throw new Error('no find connected store');
48
43
  }
49
44
  const { storeUrl } = store;
50
45
  const { accessToken, developerDid } = store;
package/lib/index.js CHANGED
@@ -435,6 +435,7 @@ function ABTNode(options) {
435
435
  getNodeUser: (user) => teamAPI.getUser({ teamDid: options.nodeDid, user }),
436
436
  addUser: teamAPI.addUser.bind(teamAPI),
437
437
  loginUser: teamAPI.loginUser.bind(teamAPI),
438
+ disconnectUserAccount: teamAPI.disconnectUserAccount.bind(teamAPI),
438
439
  removeUser: teamAPI.removeUser.bind(teamAPI),
439
440
  updateUser: teamAPI.updateUser.bind(teamAPI),
440
441
  updateUserTags: teamAPI.updateUserTags.bind(teamAPI),
@@ -17,18 +17,26 @@ class Project extends BaseState {
17
17
  return this.insert(doc);
18
18
  }
19
19
 
20
- getProjects({ componentDid }) {
20
+ async getProjects({ componentDid, showAccessToken }) {
21
21
  const query = {};
22
22
  if (componentDid) {
23
23
  query.componentDid = componentDid;
24
24
  }
25
- return this.find(
25
+ const projects = await this.find(
26
26
  query,
27
27
  {},
28
28
  {
29
29
  createdAt: -1,
30
30
  }
31
31
  );
32
+ if (!showAccessToken) {
33
+ projects?.forEach((project) => {
34
+ project.connectedStores?.forEach((store) => {
35
+ store.accessToken = store.accessToken ? '__encrypted__' : '';
36
+ });
37
+ });
38
+ }
39
+ return projects;
32
40
  }
33
41
 
34
42
  async updateProject(id, params) {
@@ -44,6 +52,7 @@ class Project extends BaseState {
44
52
  'blockletScreenshots',
45
53
  'lastReleaseId',
46
54
  'lastReleaseFiles',
55
+ 'connectedStores',
47
56
  ]),
48
57
  (x) => !isUndefinedOrNull(x)
49
58
  );
@@ -51,6 +60,26 @@ class Project extends BaseState {
51
60
  const [, [updated]] = await this.update({ id }, { $set: _params });
52
61
  return updated;
53
62
  }
63
+
64
+ async deleteConnectedStore(id, url) {
65
+ const project = await this.findOne({ id });
66
+ if (!project) {
67
+ throw new Error('Project not found');
68
+ }
69
+ const connectedStores = (project.connectedStores || []).filter((x) => x.storeUrl !== url);
70
+ const [, [updated]] = await this.update({ id }, { $set: { connectedStores } });
71
+
72
+ return updated;
73
+ }
74
+
75
+ async getConnectedStore(id, storeId) {
76
+ const project = await this.findOne({ id });
77
+ if (!project) {
78
+ throw new Error('Project not found');
79
+ }
80
+
81
+ return project.connectedStores?.find((x) => x.storeId === storeId);
82
+ }
54
83
  }
55
84
 
56
85
  module.exports = Project;
@@ -10,18 +10,18 @@ const { updateConnectedAccount } = require('@abtnode/util/lib/user');
10
10
  const { LOGIN_PROVIDER } = require('@blocklet/constant');
11
11
 
12
12
  const { validateOwner } = require('../util');
13
- const { loginSchema } = require('../validators/user');
13
+ const { loginSchema, disconnectAccountSchema } = require('../validators/user');
14
14
  const ExtendBase = require('./base');
15
15
 
16
16
  const isNullOrUndefined = (x) => x === undefined || x === null;
17
17
 
18
18
  /**
19
19
  * Auth0Account
20
- * @typedef {Object} Auth0Account
21
- * @property {'auth0'} provider
22
- * @property {string} id - id from auth0
23
- * @property {string} did - did for auth0 account
24
- * @property {string} pk - pk for auth0 account
20
+ * @typedef {Object} OAuthAccount
21
+ * @property {'auth0'|'google'|'github'|'apple'} provider
22
+ * @property {string} id - id from oauth
23
+ * @property {string} did - did for oauth account
24
+ * @property {string} pk - pk for oauth account
25
25
  * @property {string} lastLoginAt - Last login time new Date().toISOString()
26
26
  * @property {string} firstLoginAt - First login time new Date().toISOString()
27
27
  */
@@ -48,7 +48,7 @@ const isNullOrUndefined = (x) => x === undefined || x === null;
48
48
 
49
49
  /**
50
50
  * ConnectedAccount
51
- * @typedef {(Auth0Account|WalletAccount|NFTAccount)} ConnectedAccount
51
+ * @typedef {(OAuthAccount|WalletAccount|NFTAccount)} ConnectedAccount
52
52
  */
53
53
 
54
54
  /**
@@ -420,6 +420,15 @@ class User extends ExtendBase {
420
420
  return { ...updated, _action: exist ? 'update' : 'add' };
421
421
  }
422
422
 
423
+ async disconnectUserAccount(raw) {
424
+ const { error, value: connectedAccount } = disconnectAccountSchema.validate(raw);
425
+ if (error) {
426
+ throw new Error(error);
427
+ }
428
+ const result = await this.connectedAccount.remove(connectedAccount);
429
+ return result;
430
+ }
431
+
423
432
  // eslint-disable-next-line require-await
424
433
  async getUserByDid(did) {
425
434
  return this.findOne({ did }, { did: 1, pk: 1, fullName: 1, email: 1, role: 1, approved: 1 });
@@ -48,5 +48,12 @@ const profileSchema = Joi.object({
48
48
  email: Joi.string().empty(''),
49
49
  });
50
50
 
51
+ const disconnectAccountSchema = Joi.object({
52
+ provider: Joi.string().required(),
53
+ did: Joi.DID().trim().required(),
54
+ pk: Joi.string().optional(),
55
+ });
56
+
51
57
  exports.loginSchema = loginSchema;
52
58
  exports.profileSchema = profileSchema;
59
+ exports.disconnectAccountSchema = disconnectAccountSchema;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.26-beta-818ea1c5",
6
+ "version": "1.16.26-beta-351de484",
7
7
  "description": "",
8
8
  "main": "lib/index.js",
9
9
  "files": [
@@ -19,19 +19,19 @@
19
19
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
20
20
  "license": "Apache-2.0",
21
21
  "dependencies": {
22
- "@abtnode/analytics": "1.16.26-beta-818ea1c5",
23
- "@abtnode/auth": "1.16.26-beta-818ea1c5",
24
- "@abtnode/certificate-manager": "1.16.26-beta-818ea1c5",
25
- "@abtnode/constant": "1.16.26-beta-818ea1c5",
26
- "@abtnode/cron": "1.16.26-beta-818ea1c5",
27
- "@abtnode/logger": "1.16.26-beta-818ea1c5",
28
- "@abtnode/models": "1.16.26-beta-818ea1c5",
29
- "@abtnode/queue": "1.16.26-beta-818ea1c5",
30
- "@abtnode/rbac": "1.16.26-beta-818ea1c5",
31
- "@abtnode/router-provider": "1.16.26-beta-818ea1c5",
32
- "@abtnode/static-server": "1.16.26-beta-818ea1c5",
33
- "@abtnode/timemachine": "1.16.26-beta-818ea1c5",
34
- "@abtnode/util": "1.16.26-beta-818ea1c5",
22
+ "@abtnode/analytics": "1.16.26-beta-351de484",
23
+ "@abtnode/auth": "1.16.26-beta-351de484",
24
+ "@abtnode/certificate-manager": "1.16.26-beta-351de484",
25
+ "@abtnode/constant": "1.16.26-beta-351de484",
26
+ "@abtnode/cron": "1.16.26-beta-351de484",
27
+ "@abtnode/logger": "1.16.26-beta-351de484",
28
+ "@abtnode/models": "1.16.26-beta-351de484",
29
+ "@abtnode/queue": "1.16.26-beta-351de484",
30
+ "@abtnode/rbac": "1.16.26-beta-351de484",
31
+ "@abtnode/router-provider": "1.16.26-beta-351de484",
32
+ "@abtnode/static-server": "1.16.26-beta-351de484",
33
+ "@abtnode/timemachine": "1.16.26-beta-351de484",
34
+ "@abtnode/util": "1.16.26-beta-351de484",
35
35
  "@arcblock/did": "1.18.115",
36
36
  "@arcblock/did-auth": "1.18.115",
37
37
  "@arcblock/did-ext": "^1.18.115",
@@ -42,12 +42,12 @@
42
42
  "@arcblock/pm2-events": "^0.0.5",
43
43
  "@arcblock/validator": "^1.18.115",
44
44
  "@arcblock/vc": "1.18.115",
45
- "@blocklet/constant": "1.16.26-beta-818ea1c5",
46
- "@blocklet/env": "1.16.26-beta-818ea1c5",
47
- "@blocklet/meta": "1.16.26-beta-818ea1c5",
48
- "@blocklet/resolver": "1.16.26-beta-818ea1c5",
49
- "@blocklet/sdk": "1.16.26-beta-818ea1c5",
50
- "@blocklet/store": "1.16.26-beta-818ea1c5",
45
+ "@blocklet/constant": "1.16.26-beta-351de484",
46
+ "@blocklet/env": "1.16.26-beta-351de484",
47
+ "@blocklet/meta": "1.16.26-beta-351de484",
48
+ "@blocklet/resolver": "1.16.26-beta-351de484",
49
+ "@blocklet/sdk": "1.16.26-beta-351de484",
50
+ "@blocklet/store": "1.16.26-beta-351de484",
51
51
  "@did-space/client": "^0.4.1",
52
52
  "@fidm/x509": "^1.2.1",
53
53
  "@ocap/mcrypto": "1.18.115",
@@ -103,5 +103,5 @@
103
103
  "jest": "^29.7.0",
104
104
  "unzipper": "^0.10.11"
105
105
  },
106
- "gitHead": "94aded9a2c0f4b5a57f0ca0fa2493ec417ef3339"
106
+ "gitHead": "00eba435a21506382c7823ea804abea196390a0f"
107
107
  }