@abtnode/core 1.16.15-beta-f60064f3 → 1.16.15-beta-103b95c0
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 +68 -0
- package/lib/blocklet/manager/disk.js +97 -22
- package/lib/index.js +9 -0
- package/lib/router/helper.js +9 -0
- package/lib/router/index.js +4 -4
- package/lib/states/audit-log.js +16 -1
- package/lib/states/tag.js +8 -0
- package/lib/states/user.js +35 -6
- package/lib/team/manager.js +9 -0
- package/lib/util/cache.js +4 -12
- package/package.json +20 -20
package/lib/api/team.js
CHANGED
|
@@ -112,6 +112,49 @@ class TeamAPI extends EventEmitter {
|
|
|
112
112
|
this.dataDirs = dataDirs;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
// Tags
|
|
116
|
+
async createTag({ teamDid, tag }) {
|
|
117
|
+
if (!tag.title) {
|
|
118
|
+
throw new Error('Must specify tag.title to create');
|
|
119
|
+
}
|
|
120
|
+
if (!tag.color || !tag.color.match(/^#[0-9a-f]{6}$/i)) {
|
|
121
|
+
throw new Error('Must specify hex encoded tag.color to create');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const state = await this.getTagState(teamDid);
|
|
125
|
+
const doc = await state.insert(pick(tag, ['title', 'color', 'description']));
|
|
126
|
+
logger.info('tags created successfully', { teamDid, tag });
|
|
127
|
+
return doc;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async updateTag({ teamDid, tag }) {
|
|
131
|
+
if (!tag.id) {
|
|
132
|
+
throw new Error('Must specify tag.id to update');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const state = await this.getTagState(teamDid);
|
|
136
|
+
const result = await state.updateById(tag.id, pick(tag, ['title', 'color', 'description']));
|
|
137
|
+
logger.info('tags updated successfully', { teamDid, tag, result });
|
|
138
|
+
return state.findOne({ id: tag.id });
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async deleteTag({ teamDid, tag }) {
|
|
142
|
+
if (!tag.id) {
|
|
143
|
+
throw new Error('Must specify tag.id to delete');
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const state = await this.getTagState(teamDid);
|
|
147
|
+
const doc = await state.remove({ id: tag.id });
|
|
148
|
+
logger.info('tags deleted successfully', { teamDid, tag });
|
|
149
|
+
return doc;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async getTags({ teamDid, paging }) {
|
|
153
|
+
const state = await this.getTagState(teamDid);
|
|
154
|
+
const result = await state.paginate({}, { createdAt: -1 }, { pageSize: 20, ...paging });
|
|
155
|
+
return { tags: result.list, paging: result.paging };
|
|
156
|
+
}
|
|
157
|
+
|
|
115
158
|
// User && Invitation
|
|
116
159
|
|
|
117
160
|
async loginUser({ teamDid, user }) {
|
|
@@ -232,6 +275,7 @@ class TeamAPI extends EventEmitter {
|
|
|
232
275
|
'remark',
|
|
233
276
|
'avatar',
|
|
234
277
|
'locale',
|
|
278
|
+
'tags',
|
|
235
279
|
// oauth relate fields
|
|
236
280
|
'sourceProvider',
|
|
237
281
|
'connectedAccounts',
|
|
@@ -306,6 +350,26 @@ class TeamAPI extends EventEmitter {
|
|
|
306
350
|
return doc;
|
|
307
351
|
}
|
|
308
352
|
|
|
353
|
+
updateUserExtra(args) {
|
|
354
|
+
if (args.extra) {
|
|
355
|
+
try {
|
|
356
|
+
args.extra = JSON.parse(args.extra);
|
|
357
|
+
} catch (err) {
|
|
358
|
+
throw new Error('extra should be a valid json string');
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return this.updateUser({ teamDid: args.teamDid, user: pick(args, ['did', 'remark', 'extra']) });
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
async updateUserTags({ teamDid, did, tags }) {
|
|
366
|
+
const state = await this.getUserState(teamDid);
|
|
367
|
+
const doc = await state.updateTags(did, tags);
|
|
368
|
+
logger.info('user tags updated successfully', { teamDid, userDid: did, tags });
|
|
369
|
+
this.emit(EVENTS.USER_UPDATED, { teamDid, user: doc });
|
|
370
|
+
return doc;
|
|
371
|
+
}
|
|
372
|
+
|
|
309
373
|
async removeUser({ teamDid, user }) {
|
|
310
374
|
const { did } = user;
|
|
311
375
|
|
|
@@ -1232,6 +1296,10 @@ class TeamAPI extends EventEmitter {
|
|
|
1232
1296
|
return this.teamManager.getUserState(did);
|
|
1233
1297
|
}
|
|
1234
1298
|
|
|
1299
|
+
getTagState(did) {
|
|
1300
|
+
return this.teamManager.getTagState(did);
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1235
1303
|
getSessionState(did) {
|
|
1236
1304
|
return this.teamManager.getSessionState(did);
|
|
1237
1305
|
}
|
|
@@ -2963,6 +2963,7 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2963
2963
|
|
|
2964
2964
|
const dataDir = path.join(this.dataDirs.data, name);
|
|
2965
2965
|
const logsDir = path.join(this.dataDirs.logs, name);
|
|
2966
|
+
const cacheDir = path.join(this.dataDirs.cache, name);
|
|
2966
2967
|
|
|
2967
2968
|
logger.info(`clean blocklet ${blocklet.meta.did} data`, { keepData, keepLogsDir, keepConfigs });
|
|
2968
2969
|
|
|
@@ -2973,6 +2974,9 @@ class DiskBlockletManager extends BaseBlockletManager {
|
|
|
2973
2974
|
fs.removeSync(logsDir);
|
|
2974
2975
|
logger.info(`removed blocklet ${blocklet.meta.did} logs dir: ${logsDir}`);
|
|
2975
2976
|
|
|
2977
|
+
fs.removeSync(cacheDir);
|
|
2978
|
+
logger.info(`removed blocklet ${blocklet.meta.did} cache dir: ${cacheDir}`);
|
|
2979
|
+
|
|
2976
2980
|
await states.blockletExtras.remove({ did: blocklet.meta.did });
|
|
2977
2981
|
logger.info(`removed blocklet ${blocklet.meta.did} extra data`);
|
|
2978
2982
|
} else {
|
|
@@ -3594,10 +3598,14 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3594
3598
|
|
|
3595
3599
|
let data;
|
|
3596
3600
|
try {
|
|
3597
|
-
const result = await
|
|
3598
|
-
|
|
3599
|
-
|
|
3600
|
-
|
|
3601
|
+
const result = await pRetry(
|
|
3602
|
+
() =>
|
|
3603
|
+
request.post(url.href, {
|
|
3604
|
+
// 初次申请时,member 不在站点群中,不需要对数据进行加密
|
|
3605
|
+
site: memberSite,
|
|
3606
|
+
}),
|
|
3607
|
+
{ retries: 3 }
|
|
3608
|
+
);
|
|
3601
3609
|
data = result.data;
|
|
3602
3610
|
} catch (error) {
|
|
3603
3611
|
logger.error('Failed to join federated login', { error, did, url: url.href });
|
|
@@ -3617,7 +3625,7 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3617
3625
|
|
|
3618
3626
|
const newState = await this.getBlocklet(did);
|
|
3619
3627
|
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
3620
|
-
this.emit(BlockletEvents.updated,
|
|
3628
|
+
this.emit(BlockletEvents.updated, newState);
|
|
3621
3629
|
return newState;
|
|
3622
3630
|
}
|
|
3623
3631
|
|
|
@@ -3645,15 +3653,18 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3645
3653
|
const url = new URL(masterSite.appUrl);
|
|
3646
3654
|
url.pathname = `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/federated/quit`;
|
|
3647
3655
|
try {
|
|
3648
|
-
await
|
|
3649
|
-
|
|
3650
|
-
|
|
3651
|
-
|
|
3652
|
-
|
|
3653
|
-
|
|
3656
|
+
await pRetry(
|
|
3657
|
+
() =>
|
|
3658
|
+
request.post(url.href, {
|
|
3659
|
+
signer: permanentWallet.address,
|
|
3660
|
+
data: signV2(permanentWallet.address, permanentWallet.secretKey, {
|
|
3661
|
+
memberPid: blocklet.appPid,
|
|
3662
|
+
}),
|
|
3663
|
+
}),
|
|
3664
|
+
{ retries: 3 }
|
|
3665
|
+
);
|
|
3654
3666
|
} catch (error) {
|
|
3655
|
-
logger.error('Failed to quit blocklet', { error, did, url: url.href });
|
|
3656
|
-
throw error;
|
|
3667
|
+
logger.error('Failed to quit blocklet, will still quit federated by itself', { error, did, url: url.href });
|
|
3657
3668
|
}
|
|
3658
3669
|
}
|
|
3659
3670
|
|
|
@@ -3666,6 +3677,64 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3666
3677
|
return newState;
|
|
3667
3678
|
}
|
|
3668
3679
|
|
|
3680
|
+
async disbandFederatedLogin({ did }) {
|
|
3681
|
+
const blocklet = await this.getBlocklet(did);
|
|
3682
|
+
const federated = defaults(cloneDeep(blocklet.settings.federated || {}), {
|
|
3683
|
+
config: {},
|
|
3684
|
+
sites: [],
|
|
3685
|
+
});
|
|
3686
|
+
const masterSite = federated.sites[0];
|
|
3687
|
+
// 只有 Master 可以调用这个逻辑
|
|
3688
|
+
if (masterSite && masterSite.isMaster !== false && masterSite.appPid === did) {
|
|
3689
|
+
const nodeInfo = await states.node.read();
|
|
3690
|
+
const blockletInfo = getBlockletInfo(blocklet, nodeInfo.sk);
|
|
3691
|
+
const { permanentWallet } = blockletInfo;
|
|
3692
|
+
logger.info('Disband federated login', {
|
|
3693
|
+
memberSite: {
|
|
3694
|
+
appId: blocklet.appDid,
|
|
3695
|
+
appPid: blocklet.appPid,
|
|
3696
|
+
appName: blockletInfo.name,
|
|
3697
|
+
appDescription: blockletInfo.description,
|
|
3698
|
+
appUrl: blockletInfo.appUrl,
|
|
3699
|
+
},
|
|
3700
|
+
masterAppUrl: masterSite.appUrl,
|
|
3701
|
+
});
|
|
3702
|
+
|
|
3703
|
+
const disbandQueue = federated.sites
|
|
3704
|
+
.filter((item) => item.appPid !== did)
|
|
3705
|
+
.map((item) => {
|
|
3706
|
+
return limitSync(async () => {
|
|
3707
|
+
const url = new URL(item.appUrl);
|
|
3708
|
+
url.pathname = `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/federated/disband`;
|
|
3709
|
+
try {
|
|
3710
|
+
await pRetry(
|
|
3711
|
+
() =>
|
|
3712
|
+
request.post(url.href, {
|
|
3713
|
+
signer: permanentWallet.address,
|
|
3714
|
+
data: signV2(permanentWallet.address, permanentWallet.secretKey, {}),
|
|
3715
|
+
}),
|
|
3716
|
+
{ retries: 1 }
|
|
3717
|
+
);
|
|
3718
|
+
} catch (error) {
|
|
3719
|
+
logger.error('Failed to disband blocklet, will still disband federated by itself', {
|
|
3720
|
+
error,
|
|
3721
|
+
did,
|
|
3722
|
+
url: url.href,
|
|
3723
|
+
});
|
|
3724
|
+
}
|
|
3725
|
+
});
|
|
3726
|
+
});
|
|
3727
|
+
await Promise.all(disbandQueue);
|
|
3728
|
+
await states.blockletExtras.setSettings(blocklet.appPid, {
|
|
3729
|
+
federated: null,
|
|
3730
|
+
});
|
|
3731
|
+
}
|
|
3732
|
+
const newState = await this.getBlocklet(did);
|
|
3733
|
+
this.emit(BlockletInternalEvents.appSettingChanged, { appDid: did });
|
|
3734
|
+
this.emit(BlockletEvents.updated, newState);
|
|
3735
|
+
return newState;
|
|
3736
|
+
}
|
|
3737
|
+
|
|
3669
3738
|
/**
|
|
3670
3739
|
* 更改 federated 配置
|
|
3671
3740
|
* @param {object} param
|
|
@@ -3772,15 +3841,21 @@ class FederatedBlockletManager extends DiskBlockletManager {
|
|
|
3772
3841
|
});
|
|
3773
3842
|
try {
|
|
3774
3843
|
const roleList = roles.map((item) => pick(item, ['name', 'title', 'description']));
|
|
3775
|
-
await
|
|
3776
|
-
|
|
3777
|
-
|
|
3778
|
-
|
|
3779
|
-
|
|
3780
|
-
|
|
3781
|
-
|
|
3782
|
-
|
|
3783
|
-
|
|
3844
|
+
await pRetry(
|
|
3845
|
+
() =>
|
|
3846
|
+
request.post(postUrl, {
|
|
3847
|
+
signer: permanentWallet.address,
|
|
3848
|
+
data: signV2(permanentWallet.address, permanentWallet.secretKey, {
|
|
3849
|
+
masterPid: blocklet.appPid,
|
|
3850
|
+
status,
|
|
3851
|
+
delegation,
|
|
3852
|
+
roles: roleList,
|
|
3853
|
+
}),
|
|
3854
|
+
}),
|
|
3855
|
+
{
|
|
3856
|
+
retries: 3,
|
|
3857
|
+
}
|
|
3858
|
+
);
|
|
3784
3859
|
} catch (error) {
|
|
3785
3860
|
logger.error('Failed to post audit res to member-site', { error, did, url: postUrl });
|
|
3786
3861
|
throw error;
|
package/lib/index.js
CHANGED
|
@@ -263,6 +263,7 @@ function ABTNode(options) {
|
|
|
263
263
|
configOAuth: blockletManager.configOAuth.bind(blockletManager),
|
|
264
264
|
joinFederatedLogin: blockletManager.joinFederatedLogin.bind(blockletManager),
|
|
265
265
|
quitFederatedLogin: blockletManager.quitFederatedLogin.bind(blockletManager),
|
|
266
|
+
disbandFederatedLogin: blockletManager.disbandFederatedLogin.bind(blockletManager),
|
|
266
267
|
auditFederatedLogin: blockletManager.auditFederatedLogin.bind(blockletManager),
|
|
267
268
|
configFederated: blockletManager.configFederated.bind(blockletManager),
|
|
268
269
|
setFederated: blockletManager.setFederated.bind(blockletManager),
|
|
@@ -352,6 +353,8 @@ function ABTNode(options) {
|
|
|
352
353
|
loginUser: teamAPI.loginUser.bind(teamAPI),
|
|
353
354
|
removeUser: teamAPI.removeUser.bind(teamAPI),
|
|
354
355
|
updateUser: teamAPI.updateUser.bind(teamAPI),
|
|
356
|
+
updateUserTags: teamAPI.updateUserTags.bind(teamAPI),
|
|
357
|
+
updateUserExtra: teamAPI.updateUserExtra.bind(teamAPI),
|
|
355
358
|
updateUserApproval: teamAPI.updateUserApproval.bind(teamAPI),
|
|
356
359
|
updateUserRole: teamAPI.updateUserRole.bind(teamAPI),
|
|
357
360
|
getUserByDid: teamAPI.getUserByDid.bind(teamAPI),
|
|
@@ -359,6 +362,12 @@ function ABTNode(options) {
|
|
|
359
362
|
isConnectedAccount: teamAPI.isConnectedAccount.bind(teamAPI),
|
|
360
363
|
switchProfile: teamAPI.switchProfile.bind(teamAPI),
|
|
361
364
|
|
|
365
|
+
// Tagging
|
|
366
|
+
createTag: teamAPI.createTag.bind(teamAPI),
|
|
367
|
+
updateTag: teamAPI.updateTag.bind(teamAPI),
|
|
368
|
+
deleteTag: teamAPI.deleteTag.bind(teamAPI),
|
|
369
|
+
getTags: teamAPI.getTags.bind(teamAPI),
|
|
370
|
+
|
|
362
371
|
// Access Control
|
|
363
372
|
getRBAC: (did = options.nodeDid) => teamManager.getRBAC(did),
|
|
364
373
|
|
package/lib/router/helper.js
CHANGED
|
@@ -1154,6 +1154,14 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
|
|
|
1154
1154
|
return true;
|
|
1155
1155
|
};
|
|
1156
1156
|
|
|
1157
|
+
const clearBlockletRoutingCache = async (blocklet) => {
|
|
1158
|
+
const info = await nodeState.read();
|
|
1159
|
+
const provider = providers[info.routing.provider];
|
|
1160
|
+
if (provider) {
|
|
1161
|
+
await provider.clearCache(blocklet.appPid);
|
|
1162
|
+
}
|
|
1163
|
+
};
|
|
1164
|
+
|
|
1157
1165
|
/**
|
|
1158
1166
|
* Remove routing for blocklet
|
|
1159
1167
|
*
|
|
@@ -1166,6 +1174,7 @@ module.exports = function getRouterHelpers({ dataDirs, routingSnapshot, routerMa
|
|
|
1166
1174
|
siteChanged = await _removeBlockletSites(blocklet, context);
|
|
1167
1175
|
}
|
|
1168
1176
|
|
|
1177
|
+
await clearBlockletRoutingCache(blocklet);
|
|
1169
1178
|
return ruleChanged || siteChanged;
|
|
1170
1179
|
};
|
|
1171
1180
|
|
package/lib/router/index.js
CHANGED
|
@@ -174,12 +174,12 @@ class Router {
|
|
|
174
174
|
return this.provider.getLogDir();
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
-
searchCache(pattern) {
|
|
178
|
-
return this.provider.searchCache(pattern);
|
|
177
|
+
searchCache(pattern, group) {
|
|
178
|
+
return this.provider.searchCache(pattern, group);
|
|
179
179
|
}
|
|
180
180
|
|
|
181
|
-
clearCache() {
|
|
182
|
-
return this.provider.clearCache();
|
|
181
|
+
clearCache(group) {
|
|
182
|
+
return this.provider.clearCache(group);
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
|
package/lib/states/audit-log.js
CHANGED
|
@@ -132,7 +132,7 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
132
132
|
}
|
|
133
133
|
return `${actionName} component: **${getComponentNamesWithVersion(result, result.componentDids)}**`;
|
|
134
134
|
case 'deleteComponent':
|
|
135
|
-
return `removed ${result.deletedComponent.meta.title}@${result.deletedComponent.meta.version} ${
|
|
135
|
+
return `removed ${result.deletedComponent.meta.title}@${result.deletedComponent.meta.version} ${args.keepData !== false ? 'but kept its data and config' : 'and its data and config'}`; // prettier-ignore
|
|
136
136
|
case 'configBlocklet':
|
|
137
137
|
return `updated following config for ${args.did?.length > 1 ? componentOrApplicationInfo(result, [args.did[1]]) : 'application'}: ${args.configs.map(x => `*${x.key}*`).join(', ')}`; // prettier-ignore
|
|
138
138
|
case 'backupToSpaces':
|
|
@@ -151,6 +151,8 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
151
151
|
return `blocklet ${getBlockletInfo(result, info)} join federated login to ${args.appUrl}`;
|
|
152
152
|
case 'quitFederatedLogin':
|
|
153
153
|
return `blocklet ${getBlockletInfo(result, info)} quit federated login`;
|
|
154
|
+
case 'disbandFederatedLogin':
|
|
155
|
+
return `blocklet ${getBlockletInfo(result, info)} disband federated login`;
|
|
154
156
|
case 'auditFederatedLogin':
|
|
155
157
|
return `blocklet ${getBlockletInfo(result, info)} audit federated login member ${args.memberPid} with status: ${
|
|
156
158
|
args.status
|
|
@@ -207,6 +209,8 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
207
209
|
return `enabled **${passport}** passport of user ${user}`;
|
|
208
210
|
case 'updateUserApproval':
|
|
209
211
|
return `${args.user.approved ? 'enabled' : 'disabled'} user ${user}`;
|
|
212
|
+
case 'updateUserTags':
|
|
213
|
+
return `set tags to ${args.tags} for user ${user}`;
|
|
210
214
|
case 'deletePassportIssuance':
|
|
211
215
|
return `removed passport issuance ${args.sessionId}`;
|
|
212
216
|
case 'createMemberInvitation':
|
|
@@ -237,6 +241,12 @@ const getLogContent = async (action, args, context, result, info, node) => {
|
|
|
237
241
|
return `issued **${args.role}** passport to ${user}`;
|
|
238
242
|
case 'downloadLog':
|
|
239
243
|
return `download log for ${args.days} day${args.days > 1 ? 's' : ''}`;
|
|
244
|
+
case 'createTag':
|
|
245
|
+
return `create tag ${args.tag.title}`;
|
|
246
|
+
case 'updateTag':
|
|
247
|
+
return `updated tag ${args.tag.id}`;
|
|
248
|
+
case 'deleteTag':
|
|
249
|
+
return `deleted tag ${args.tag.id}`;
|
|
240
250
|
|
|
241
251
|
// accessKeys
|
|
242
252
|
case 'createAccessKey':
|
|
@@ -334,6 +344,7 @@ const getLogCategory = (action) => {
|
|
|
334
344
|
case 'backupToSpaces':
|
|
335
345
|
case 'joinFederatedLogin':
|
|
336
346
|
case 'quitFederatedLogin':
|
|
347
|
+
case 'disbandFederatedLogin':
|
|
337
348
|
case 'auditFederatedLogin':
|
|
338
349
|
case 'configFederated':
|
|
339
350
|
return 'blocklet';
|
|
@@ -358,6 +369,7 @@ const getLogCategory = (action) => {
|
|
|
358
369
|
case 'revokeUserPassport':
|
|
359
370
|
case 'enableUserPassport':
|
|
360
371
|
case 'updateUserApproval':
|
|
372
|
+
case 'updateUserTags':
|
|
361
373
|
case 'createMemberInvitation':
|
|
362
374
|
case 'deleteInvitation':
|
|
363
375
|
case 'createRole':
|
|
@@ -368,6 +380,9 @@ const getLogCategory = (action) => {
|
|
|
368
380
|
case 'delegateTransferNFT':
|
|
369
381
|
case 'createTransferInvitation':
|
|
370
382
|
case 'connectAccount':
|
|
383
|
+
case 'createTag':
|
|
384
|
+
case 'updateTag':
|
|
385
|
+
case 'deleteTag':
|
|
371
386
|
return 'team';
|
|
372
387
|
|
|
373
388
|
// accessKeys
|
package/lib/states/user.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const pickBy = require('lodash/pickBy');
|
|
2
2
|
const get = require('lodash/get');
|
|
3
3
|
const pick = require('lodash/pick');
|
|
4
|
+
const uniq = require('lodash/uniq');
|
|
4
5
|
const { isValid } = require('@arcblock/did');
|
|
5
6
|
const { PASSPORT_STATUS } = require('@abtnode/constant');
|
|
6
7
|
const { BaseState } = require('@abtnode/models');
|
|
@@ -178,7 +179,8 @@ class User extends ExtendBase {
|
|
|
178
179
|
// eslint-disable-next-line require-await
|
|
179
180
|
async getUsers({ query, sort, paging } = {}) {
|
|
180
181
|
const where = {};
|
|
181
|
-
const { approved, role, search } = query || {};
|
|
182
|
+
const { approved, role, search, tags, includeTags } = query || {};
|
|
183
|
+
const shouldIncludeTag = (tags && tags.length) || includeTags;
|
|
182
184
|
|
|
183
185
|
if (isNullOrUndefined(approved) === false) {
|
|
184
186
|
where.approved = approved;
|
|
@@ -214,18 +216,18 @@ class User extends ExtendBase {
|
|
|
214
216
|
sorting.createdAt = -1;
|
|
215
217
|
}
|
|
216
218
|
|
|
217
|
-
return this.paginate({ where }, sorting, paging);
|
|
219
|
+
return this.paginate({ where, include: shouldIncludeTag ? [this.getTagInclude(tags)] : [] }, sorting, paging);
|
|
218
220
|
}
|
|
219
221
|
|
|
220
222
|
// eslint-disable-next-line require-await
|
|
221
223
|
async getUsersByDids({ dids, query }) {
|
|
222
|
-
const { approved } = query || {};
|
|
224
|
+
const { approved, includeTags } = query || {};
|
|
223
225
|
const condition = { did: dids };
|
|
224
226
|
if (isNullOrUndefined(approved) === false) {
|
|
225
227
|
condition.approved = !!approved;
|
|
226
228
|
}
|
|
227
229
|
|
|
228
|
-
return this.find({ where: condition });
|
|
230
|
+
return this.find({ where: condition, include: includeTags ? [this.getTagInclude()] : [] });
|
|
229
231
|
}
|
|
230
232
|
|
|
231
233
|
// eslint-disable-next-line require-await
|
|
@@ -261,8 +263,8 @@ class User extends ExtendBase {
|
|
|
261
263
|
* get user by did
|
|
262
264
|
* @param {string} did user's did
|
|
263
265
|
*/
|
|
264
|
-
async getUser(did, { enableConnectedAccount = false } = {}) {
|
|
265
|
-
let user = await this.findOne({ did });
|
|
266
|
+
async getUser(did, { enableConnectedAccount = false, includeTags = false } = {}) {
|
|
267
|
+
let user = await this.findOne({ where: { did }, include: includeTags ? [this.getTagInclude()] : [] });
|
|
266
268
|
let connectedAccounts = [];
|
|
267
269
|
let passports = [];
|
|
268
270
|
|
|
@@ -375,6 +377,33 @@ class User extends ExtendBase {
|
|
|
375
377
|
const count = await this.passport.count({ id: passportId, status: PASSPORT_STATUS.VALID });
|
|
376
378
|
return count > 0;
|
|
377
379
|
}
|
|
380
|
+
|
|
381
|
+
async updateTags(did, tags) {
|
|
382
|
+
const user = await this.getUserByDid(did);
|
|
383
|
+
if (user) {
|
|
384
|
+
const instance = this.build(user);
|
|
385
|
+
await instance.setTags(uniq(tags));
|
|
386
|
+
return this.getUser(did, { includeTags: true });
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
getTagInclude(tags = []) {
|
|
393
|
+
const result = {
|
|
394
|
+
model: this.models.Tag,
|
|
395
|
+
as: 'tags',
|
|
396
|
+
through: {
|
|
397
|
+
attributes: [],
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
if (tags.length) {
|
|
402
|
+
result.where = { id: { [Op.in]: tags.filter(Boolean) } };
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
return result;
|
|
406
|
+
}
|
|
378
407
|
}
|
|
379
408
|
|
|
380
409
|
module.exports = User;
|
package/lib/team/manager.js
CHANGED
|
@@ -31,6 +31,7 @@ const States = {
|
|
|
31
31
|
Passport: require('../states/passport'),
|
|
32
32
|
ConnectedAccount: require('../states/connect-account'),
|
|
33
33
|
Session: require('../states/session'),
|
|
34
|
+
Tag: require('../states/tag'),
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
const getDefaultTeamState = () => ({
|
|
@@ -39,6 +40,7 @@ const getDefaultTeamState = () => ({
|
|
|
39
40
|
passport: null,
|
|
40
41
|
connectedAccount: null,
|
|
41
42
|
session: null,
|
|
43
|
+
tag: null,
|
|
42
44
|
});
|
|
43
45
|
|
|
44
46
|
class TeamManager extends EventEmitter {
|
|
@@ -90,6 +92,7 @@ class TeamManager extends EventEmitter {
|
|
|
90
92
|
this.cache[this.nodeDid] = {
|
|
91
93
|
rbac: await createRBAC({ storage: new MemoryStorage(), data: RBAC_CONFIG }),
|
|
92
94
|
user: await this.createState(this.nodeDid, 'User'),
|
|
95
|
+
tag: await this.createState(this.nodeDid, 'Tag'),
|
|
93
96
|
passport: await this.createState(this.nodeDid, 'Passport'),
|
|
94
97
|
connectedAccount: await this.createState(this.nodeDid, 'ConnectedAccount'),
|
|
95
98
|
session: await this.createState(this.nodeDid, 'Session'),
|
|
@@ -100,6 +103,10 @@ class TeamManager extends EventEmitter {
|
|
|
100
103
|
return this.getState(teamDid, 'user');
|
|
101
104
|
}
|
|
102
105
|
|
|
106
|
+
getTagState(teamDid) {
|
|
107
|
+
return this.getState(teamDid, 'tag');
|
|
108
|
+
}
|
|
109
|
+
|
|
103
110
|
getPassportState(teamDid) {
|
|
104
111
|
return this.getState(teamDid, 'passport');
|
|
105
112
|
}
|
|
@@ -317,6 +324,7 @@ class TeamManager extends EventEmitter {
|
|
|
317
324
|
|
|
318
325
|
const rbac = await this.getRBAC(did);
|
|
319
326
|
const user = await this.createState(did, 'User');
|
|
327
|
+
const tag = await this.createState(did, 'Tag');
|
|
320
328
|
const passport = await this.createState(did, 'Passport');
|
|
321
329
|
const connectedAccount = await this.createState(did, 'ConnectedAccount');
|
|
322
330
|
const session = await this.createState(did, 'Session');
|
|
@@ -324,6 +332,7 @@ class TeamManager extends EventEmitter {
|
|
|
324
332
|
this.cache[did] = {
|
|
325
333
|
rbac,
|
|
326
334
|
user,
|
|
335
|
+
tag,
|
|
327
336
|
session,
|
|
328
337
|
passport,
|
|
329
338
|
connectedAccount,
|
package/lib/util/cache.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
const fs = require('fs-extra');
|
|
2
2
|
const path = require('path');
|
|
3
|
-
const { forEachComponentV2 } = require('@blocklet/meta/lib/util');
|
|
4
3
|
const { getAppImageCacheDir, getAppOgCacheDir } = require('@abtnode/util/lib/blocklet');
|
|
5
4
|
|
|
6
5
|
const clearCacheDir = (dir) => {
|
|
@@ -25,7 +24,7 @@ const clearCache = async (params, node, blockletManager) => {
|
|
|
25
24
|
const info = await node.getNodeInfo({ useCache: true });
|
|
26
25
|
const provider = node.getRouterProvider(info.routing.provider);
|
|
27
26
|
if (params.pattern) {
|
|
28
|
-
const files = await provider.searchCache(params.pattern);
|
|
27
|
+
const files = await provider.searchCache(params.pattern, params.teamDid);
|
|
29
28
|
files.forEach((x) => fs.rmSync(x, { force: true }));
|
|
30
29
|
return files.map((x) => x.replace(baseDir, ''));
|
|
31
30
|
}
|
|
@@ -52,17 +51,10 @@ const clearCache = async (params, node, blockletManager) => {
|
|
|
52
51
|
clearCacheDir(x);
|
|
53
52
|
removed.push(x);
|
|
54
53
|
});
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const files = await provider.searchCache(component.meta.did);
|
|
59
|
-
files.forEach((x) => fs.rmSync(x, { force: true }));
|
|
60
|
-
removed.push(...files);
|
|
61
|
-
},
|
|
62
|
-
{ parallel: true, sync: true }
|
|
63
|
-
);
|
|
54
|
+
// reset blocklet router cache
|
|
55
|
+
const result = await provider.clearCache(params.teamDid);
|
|
56
|
+
removed.push(...result);
|
|
64
57
|
|
|
65
|
-
// FIXME: @wangshijun can we bust cache for image-filter in nginx?
|
|
66
58
|
return removed.map((x) => x.replace(baseDir, ''));
|
|
67
59
|
};
|
|
68
60
|
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "1.16.15-beta-
|
|
6
|
+
"version": "1.16.15-beta-103b95c0",
|
|
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.15-beta-
|
|
23
|
-
"@abtnode/auth": "1.16.15-beta-
|
|
24
|
-
"@abtnode/certificate-manager": "1.16.15-beta-
|
|
25
|
-
"@abtnode/constant": "1.16.15-beta-
|
|
26
|
-
"@abtnode/cron": "1.16.15-beta-
|
|
27
|
-
"@abtnode/logger": "1.16.15-beta-
|
|
28
|
-
"@abtnode/models": "1.16.15-beta-
|
|
29
|
-
"@abtnode/queue": "1.16.15-beta-
|
|
30
|
-
"@abtnode/rbac": "1.16.15-beta-
|
|
31
|
-
"@abtnode/router-provider": "1.16.15-beta-
|
|
32
|
-
"@abtnode/static-server": "1.16.15-beta-
|
|
33
|
-
"@abtnode/timemachine": "1.16.15-beta-
|
|
34
|
-
"@abtnode/util": "1.16.15-beta-
|
|
22
|
+
"@abtnode/analytics": "1.16.15-beta-103b95c0",
|
|
23
|
+
"@abtnode/auth": "1.16.15-beta-103b95c0",
|
|
24
|
+
"@abtnode/certificate-manager": "1.16.15-beta-103b95c0",
|
|
25
|
+
"@abtnode/constant": "1.16.15-beta-103b95c0",
|
|
26
|
+
"@abtnode/cron": "1.16.15-beta-103b95c0",
|
|
27
|
+
"@abtnode/logger": "1.16.15-beta-103b95c0",
|
|
28
|
+
"@abtnode/models": "1.16.15-beta-103b95c0",
|
|
29
|
+
"@abtnode/queue": "1.16.15-beta-103b95c0",
|
|
30
|
+
"@abtnode/rbac": "1.16.15-beta-103b95c0",
|
|
31
|
+
"@abtnode/router-provider": "1.16.15-beta-103b95c0",
|
|
32
|
+
"@abtnode/static-server": "1.16.15-beta-103b95c0",
|
|
33
|
+
"@abtnode/timemachine": "1.16.15-beta-103b95c0",
|
|
34
|
+
"@abtnode/util": "1.16.15-beta-103b95c0",
|
|
35
35
|
"@arcblock/did": "1.18.89",
|
|
36
36
|
"@arcblock/did-auth": "1.18.89",
|
|
37
37
|
"@arcblock/did-ext": "^1.18.89",
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"@arcblock/pm2-events": "^0.0.5",
|
|
43
43
|
"@arcblock/validator": "^1.18.89",
|
|
44
44
|
"@arcblock/vc": "1.18.89",
|
|
45
|
-
"@blocklet/constant": "1.16.15-beta-
|
|
46
|
-
"@blocklet/env": "1.16.15-beta-
|
|
47
|
-
"@blocklet/meta": "1.16.15-beta-
|
|
48
|
-
"@blocklet/resolver": "1.16.15-beta-
|
|
49
|
-
"@blocklet/sdk": "1.16.15-beta-
|
|
45
|
+
"@blocklet/constant": "1.16.15-beta-103b95c0",
|
|
46
|
+
"@blocklet/env": "1.16.15-beta-103b95c0",
|
|
47
|
+
"@blocklet/meta": "1.16.15-beta-103b95c0",
|
|
48
|
+
"@blocklet/resolver": "1.16.15-beta-103b95c0",
|
|
49
|
+
"@blocklet/sdk": "1.16.15-beta-103b95c0",
|
|
50
50
|
"@did-space/client": "^0.2.165",
|
|
51
51
|
"@fidm/x509": "^1.2.1",
|
|
52
52
|
"@ocap/mcrypto": "1.18.89",
|
|
@@ -100,5 +100,5 @@
|
|
|
100
100
|
"jest": "^27.5.1",
|
|
101
101
|
"unzipper": "^0.10.11"
|
|
102
102
|
},
|
|
103
|
-
"gitHead": "
|
|
103
|
+
"gitHead": "ba3bbf1566e9c3d62dbdf93d2ede8a1d4249c407"
|
|
104
104
|
}
|