Name

sn_grc.IGEntityTypeActionHandler

Description

No description available

Script

var IGEntityTypeActionHandler = Class.create();
IGEntityTypeActionHandler.prototype = {
  initialize: function(action) {
      this.actionType = String(action.action);
      this.source = String(action.source);
      this.sourceTable = String(action.table);
      this.entityTypeId = String(action.entity_type_id);
  },
  execute: function() {
      if (gs.nil(this.entityTypeId) || gs.nil(this.actionType) || gs.nil(this.source) || gs.nil(this.sourceTable)) {
          return;
      }

      switch (this.actionType) {
          case 'delete_entity_type':
              this._deleteReliantAssociationsForEntityType();
              this._deleteRelatedItemsForEntityType();
              break;
          case 'deactivate_entity_type':
              return this._deactivateEntityType();
          case 'activate_entity_type':
              return this._activateEntityType();
      }
  },

  _deleteRelatedItemsForEntityType: function() {
      var entityType = new GlideRecord(this.sourceTable);
      if (!entityType.get(this.source)) {
          return;
      }

      var relatedContentIds = new ItemGenerationV2Utils().deletePTRelationships(entityType, 'sn_grc_m2m_content_profile_type', 'sn_grc_content', 'document');
      for (var relatedContentId in relatedContentIds) {
          var itemTables = new ItemInheritance().getChildrenOfItemTable();
          for (var i = 0; i < itemTables.length; i++) {
              var item = new GlideRecord(itemTables[i]);
              item.addQuery('content', relatedContentId);
              item.addQuery('instance', 'true');
              item.addQuery('source', 'CONTAINS', this.entityTypeId);
              item.query();

              while (item.next()) {
                  new ItemGenerationV2Utils().deleteSourceInItem(item, this.entityTypeId);
              }
          }
      }

      new GRCUtils().checkProfilesForDeactivation(entityType);
  },

  _deactivateEntityType: function() {
      var entityType = new GlideRecord(this.sourceTable);
      if (!entityType.get(this.source)) {
          return;
      }

      new GRCUtils().checkProfilesForDeactivation(entityType);

      //If individually added is false and all source entity types are inactive, we deactivate the item to entity m2m
      this._updateItemEntityM2m(false);
  },

  _activateEntityType: function() {
      var entityType = new GlideRecord(this.sourceTable);
      if (!entityType.get(this.source)) {
          return;
      }

      new GRCUtils().checkProfilesForActivation(entityType);
      /* If individualy added is false and at least 1 source entity types are active and reliant entity and item are also active 
       * and no standard item or reliant association to a common item exists for this entity type, 
       * we activate the item to entity m2m
       */
      this._updateItemEntityM2m(true);
  },

  _deleteReliantAssociationsForEntityType: function() {
      //Delete common item to entity type associations
      var itemToEntityType = new GlideRecord('sn_grc_m2m_item_entity_type');
      itemToEntityType.addQuery('entity_type', this.entityTypeId);
      itemToEntityType.setWorkflow(false);
      itemToEntityType.deleteMultiple();

      //Delete item to entity records or just remove entity type from source
      var itemToEntityTables = new ItemInheritance().getChildrenOfItemToEntityTable();
      for (var j = 0; j < itemToEntityTables.length; j++) {
          var itemToEntity = new GlideRecord(itemToEntityTables[j]);
          itemToEntity.addQuery('source_entity_types', 'CONTAINS', this.entityTypeId);
          itemToEntity.query();
          while (itemToEntity.next()) {
              new ItemGenerationV2Utils().deleteOrUpdateSourceInItemEntityM2m(itemToEntity, 'source_entity_types', this.entityTypeId, true);
          }
      }
  },

  _updateItemEntityM2m: function(activateM2m) {
      var itemToEntityTables = new ItemInheritance().getChildrenOfItemToEntityTable();
      for (var j = 0; j < itemToEntityTables.length; j++) {
          var itemEntityGr = new GlideRecord(itemToEntityTables[j]);
          itemEntityGr.addQuery('individually_added', 'false');
          itemEntityGr.addQuery('active', !activateM2m);
          if (activateM2m) {
              itemEntityGr.addQuery('item.active', true);
              itemEntityGr.addQuery('entity.active', true);
          }
          itemEntityGr.addQuery('source_entity_types', 'CONTAINS', this.entityTypeId);
          itemEntityGr.query();

          var strategy;
          var activeEntityTypesGr = new GlideRecord('sn_grc_profile_type');
          var inheritanceUtils = new sn_grc.ItemInheritance();
          var action;
          while (itemEntityGr.next()) {
              activeEntityTypesGr.initialize();
              activeEntityTypesGr.addActiveQuery();
              activeEntityTypesGr.addQuery('sys_id', 'IN', itemEntityGr.getValue('source_entity_types'));
              activeEntityTypesGr.setLimit(1);
              activeEntityTypesGr.query();

              if ((activateM2m && !activeEntityTypesGr.hasNext()) || (!activateM2m && activeEntityTypesGr.hasNext())) {
                  continue;
              }

              if (activateM2m) {
                  var entity = itemEntityGr.getValue('entity');
                  var item = itemEntityGr.getValue('item');
                  if (inheritanceUtils.isImplementedAsItem(entity, item) || inheritanceUtils.isAddedUnderDifferentItem(entity, item)) {
                      continue;
                  }
                  action = 'activate_entity_to_item';
              } else {
                  action = 'deactivate_entity_to_item';
              }

              strategy = new ItemGenerationV2Utils().getStrategy(itemEntityGr.item.sys_class_name + '');
              itemEntityGr.setValue('active', activateM2m);
              itemEntityGr.skipInsertActionToQueue = true;
              itemEntityGr.update();


              var actionParams = {
                  'action': action,
                  'source': itemEntityGr.getUniqueValue(),
                  'table': itemEntityGr.getTableName(),
                  'entity_id': itemEntityGr.entity + '',
                  'item_id': itemEntityGr.item + ''
              };

              new sn_grc.IGItemToEntityActionHandler(actionParams, strategy).execute();
          }
      }
  },

  type: 'IGEntityTypeActionHandler'
};

Sys ID

8fefa50e532620104f3eddeeff7b1243

Offical Documentation

Official Docs: