@abtnode/core 1.16.52-beta-20251003-083412-fdfc4e36 → 1.16.52-beta-20251008-091027-c46c73e3

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.
@@ -10,6 +10,7 @@ const isArray = require('lodash/isArray');
10
10
  const isString = require('lodash/isString');
11
11
  const mapValues = require('lodash/mapValues');
12
12
  const map = require('lodash/map');
13
+ const omit = require('lodash/omit');
13
14
  const { joinURL } = require('ufo');
14
15
  const { Op } = require('sequelize');
15
16
  const { getDisplayName } = require('@blocklet/meta/lib/util');
@@ -273,13 +274,15 @@ const getLogContent = async (action, args, context, result, info, node) => {
273
274
  expandSite(args.id, info, node),
274
275
  expandUser(
275
276
  args.teamDid,
276
- args.userDid || get(args, 'user.did') || args.ownerDid || args.did,
277
+ args.userDid || get(args, 'user.did') || args.ownerDid || args.did || context.user.did,
277
278
  args.passportId,
278
279
  info,
279
280
  node
280
281
  ),
281
282
  ]);
282
283
 
284
+ const prefix = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';
285
+
283
286
  switch (action) {
284
287
  // blocklets
285
288
  case 'installBlocklet':
@@ -684,7 +687,6 @@ const getLogContent = async (action, args, context, result, info, node) => {
684
687
  case 'followUser':
685
688
  case 'unfollowUser':
686
689
  const followerUser = await node.getUser({ teamDid: args.teamDid, user: { did: args.followerDid } });
687
- const prefix = process.env.NODE_ENV === 'production' ? info.routing.adminPath : '';
688
690
  return `[${followerUser.fullName}](${joinURL(prefix, '/team/members')}) ${action === 'followUser' ? 'followed' : 'unfollowed'} user ${user}`;
689
691
 
690
692
  // connect to aigne
@@ -693,6 +695,49 @@ const getLogContent = async (action, args, context, result, info, node) => {
693
695
  case 'disconnectToAigne':
694
696
  return `Disconnect to Aigne(${args.url})`;
695
697
 
698
+ // org 相关
699
+ case 'createOrg':
700
+ return `${user} created an org(${args.name})`;
701
+ case 'deleteOrg':
702
+ return `${user} deleted the org(${args.id})`;
703
+ case 'updateOrg':
704
+ return `${user} updated the org(${args.org.name}): \n${Object.keys(omit(args.org, ['id']))
705
+ .map((x) => `- ${x}: ${args.org[x]}`)
706
+ .join('\n')}`;
707
+ case 'removeOrgMember': {
708
+ const [member, org, operator] = await Promise.all([
709
+ node.getUser({ teamDid: args.teamDid, user: { did: args.userDid } }),
710
+ node.getOrg({ teamDid: args.teamDid, id: args.orgId }, context),
711
+ node.getUser({ teamDid: args.teamDid, user: { did: context.user.did } }),
712
+ ]);
713
+ return `[${operator.fullName}](${joinURL(prefix, '/team/members')}) removed a member([${member.fullName}](${joinURL(prefix, '/team/members')})) from the org(${org.name})`;
714
+ }
715
+ case 'inviteMembersToOrg': {
716
+ const [operator, joinedOrg] = await Promise.all([
717
+ node.getUser({ teamDid: args.teamDid, user: { did: context.user.did } }),
718
+ node.getOrg({ teamDid: args.teamDid, id: args.orgId }, context),
719
+ ]);
720
+ if (args.inviteType === 'internal') {
721
+ const dids = args.userDids || [];
722
+ const { users } = await node.getUsers({ teamDid: args.teamDid, dids: dids.slice(0, 5) });
723
+ const invitedMembers = users.length < dids.length ? [...users, '...'] : users;
724
+ return `[${operator.fullName}](${joinURL(prefix, '/team/members')}) invited ${dids.length} ${dids.length > 1 ? 'members' : 'member'} to join the org(${joinedOrg.name}): \n${invitedMembers.map((x) => (x.fullName ? `- [${x.fullName}](${joinURL(prefix, '/team/members')})` : `- ${x}`)).join('\n')}`;
725
+ }
726
+ return `[${operator.fullName}](${joinURL(prefix, '/team/members')}) invited members to join the org(${joinedOrg.name})`;
727
+ }
728
+ case 'addOrgResource': {
729
+ const org = await node.getOrg({ teamDid: args.teamDid, id: args.orgId }, context);
730
+ const resourceIds = (args.resourceIds || []).slice(0, 5);
731
+ const displayResourceIds = resourceIds.length < args.resourceIds.length ? [...resourceIds, '...'] : resourceIds;
732
+ return `${user} added ${resourceIds.length} ${resourceIds.length > 1 ? 'resources' : 'resource'} to the org(${org.name}): \n${displayResourceIds.map((x) => `- ${x}`).join('\n')}`;
733
+ }
734
+ case 'migrateOrgResource': {
735
+ const org = await node.getOrg({ teamDid: args.teamDid, id: args.to }, context);
736
+ const resourceIds = (args.resourceIds || []).slice(0, 5);
737
+ const displayResourceIds = resourceIds.length < args.resourceIds.length ? [...resourceIds, '...'] : resourceIds;
738
+ return `${user} migrated ${resourceIds.length} ${resourceIds.length > 1 ? 'resources' : 'resource'} to the org(${org.name}): \n${displayResourceIds.map((x) => `- ${x}`).join('\n')}`;
739
+ }
740
+
696
741
  default:
697
742
  return action;
698
743
  }
@@ -797,6 +842,13 @@ const getLogCategory = (action) => {
797
842
  case 'updateUserInfo':
798
843
  case 'followUser':
799
844
  case 'unfollowUser':
845
+ case 'createOrg':
846
+ case 'updateOrg':
847
+ case 'deleteOrg':
848
+ case 'removeOrgMember':
849
+ case 'inviteMembersToOrg':
850
+ case 'addOrgResource':
851
+ case 'migrateOrgResource':
800
852
  return 'team';
801
853
 
802
854
  // accessKeys
@@ -198,7 +198,10 @@ class BlockletState extends BaseState {
198
198
 
199
199
  async getBlockletStatus(did) {
200
200
  const doc = await this.getBlocklet(did);
201
- return doc ? doc.status : null;
201
+ if (!doc) {
202
+ return null;
203
+ }
204
+ return doc.status;
202
205
  }
203
206
 
204
207
  async hasBlocklet(did) {
@@ -469,7 +472,7 @@ class BlockletState extends BaseState {
469
472
  /**
470
473
  * refresh ports for blocklet if occupied during starting workflow
471
474
  */
472
- async refreshBlockletPorts(did, componentDids = []) {
475
+ async refreshBlockletPorts(did, componentDids = [], isGreen = false) {
473
476
  const blocklet = await this.getBlocklet(did);
474
477
  if (!blocklet) {
475
478
  throw new CustomError(404, `Blocklet does not exist on refresh: ${did}`);
@@ -479,7 +482,11 @@ class BlockletState extends BaseState {
479
482
 
480
483
  await forEachComponentV2(blocklet, async (component) => {
481
484
  if (!shouldSkipComponent(component.meta.did, componentDids)) {
482
- component.ports = await refreshPorts(component.ports, {
485
+ let oldPorts = component[isGreen ? 'greenPorts' : 'ports'];
486
+ if (!oldPorts || Object.keys(oldPorts).length === 0) {
487
+ oldPorts = component.ports;
488
+ }
489
+ component[isGreen ? 'greenPorts' : 'ports'] = await refreshPorts(oldPorts, {
483
490
  blackList: [...occupiedExternalPorts.keys(), ...occupiedInternalPorts.keys()],
484
491
  });
485
492
  }
@@ -556,7 +563,11 @@ class BlockletState extends BaseState {
556
563
  * componentDids?: Array<Did>
557
564
  * }}
558
565
  */
559
- async setBlockletStatus(did, status, { componentDids, operator = 'daemon' } = {}) {
566
+ async setBlockletStatus(
567
+ did,
568
+ status,
569
+ { componentDids, operator = 'daemon', isGreen = false, isGreenAndBlue = false } = {}
570
+ ) {
560
571
  logger.info('setBlockletStatus', { did, status, componentDids, operator });
561
572
  if (typeof status === 'undefined') {
562
573
  throw new Error('Unsupported blocklet status');
@@ -589,7 +600,11 @@ class BlockletState extends BaseState {
589
600
  return;
590
601
  }
591
602
 
592
- component.status = status;
603
+ component[isGreen ? 'greenStatus' : 'status'] = status;
604
+ if (isGreenAndBlue) {
605
+ component.greenStatus = status;
606
+ component.status = status;
607
+ }
593
608
  if (status === BlockletStatus.running) {
594
609
  component.startedAt = new Date();
595
610
  component.stoppedAt = null;
@@ -602,7 +617,8 @@ class BlockletState extends BaseState {
602
617
  component.inProgressStart = Date.now();
603
618
  });
604
619
 
605
- const updateData = pick(doc, ['status', 'children']);
620
+ const isSetStatus = status === BlockletStatus.downloading || status === BlockletStatus.waiting;
621
+ const updateData = isSetStatus ? pick(doc, ['status', 'children']) : pick(doc, ['children']);
606
622
  updateData.operator = operator;
607
623
 
608
624
  const res = await this.updateBlocklet(did, updateData);
@@ -18,6 +18,7 @@ const BackupState = require('./backup');
18
18
  const TrafficInsightState = require('./traffic-insight');
19
19
  const RuntimeInsightState = require('./runtime-insight');
20
20
  const BlacklistState = require('./blacklist');
21
+ const OrgState = require('./org');
21
22
 
22
23
  const { getDbFilePath } = require('../util');
23
24
 
@@ -46,6 +47,7 @@ const init = (dataDirs, config = {}) => {
46
47
  const trafficInsight = new TrafficInsightState(models.TrafficInsight, config);
47
48
  const runtimeInsight = new RuntimeInsightState(models.RuntimeInsight, { ...config, maxPageSize: 8640 });
48
49
  const blacklistState = new BlacklistState(models.Blacklist, config);
50
+ const orgState = new OrgState(models.Org, config, models);
49
51
 
50
52
  return {
51
53
  node: nodeState,
@@ -64,6 +66,7 @@ const init = (dataDirs, config = {}) => {
64
66
  trafficInsight,
65
67
  runtimeInsight,
66
68
  blacklist: blacklistState,
69
+ org: orgState,
67
70
  };
68
71
  };
69
72