Name

sn_grc.ItemGenerationV2ActionQueueProcessor

Description

No description available

Script

var ItemGenerationV2ActionQueueProcessor = Class.create();
ItemGenerationV2ActionQueueProcessor.prototype = {
  type: 'ItemGenerationV2ActionQueueProcessor'
};

var DEFAULT_MAX_RECORDS = 5000;

ItemGenerationV2ActionQueueProcessor.insertAction = function(actionParms) {
      if (!actionParms || !actionParms.action || !actionParms.source || !actionParms.table) {
          return;
      }

      if (actionParms.groupId) {
          this.generateBulkActionRecords(actionParms);
      } else {
          return this.generateActionRecord(actionParms);
      }
  },

  ItemGenerationV2ActionQueueProcessor.generateActionRecord = function(actionParms, batchProcessingIds) {
      var action = new GlideRecord('sn_grc_item_generation_action_event_queue');
      action.setValue('action', actionParms.action);
      action.setValue('state', 'ready');
      action.setValue('source', actionParms.source);
      action.setValue('table', actionParms.table);
      if (actionParms.name) {
          action.setValue('name', actionParms.name);
      }
      if (actionParms.contentId) {
          action.setValue('content_id', actionParms.contentId);
      }
      if (actionParms.entityTypeId) {
          action.setValue('entity_type_id', actionParms.entityTypeId);
      }
      if (actionParms.documentId) {
          action.setValue('document_id', actionParms.documentId);
      }
      if (actionParms.processingActivityId) {
          action.setValue('processing_activity_id', actionParms.processingActivityId);
      }
      if (actionParms.entityId) {
          action.setValue('entity_id', actionParms.entityId);
      }
      if (actionParms.itemId) {
          action.setValue('item_id', actionParms.itemId);
      }
      if (batchProcessingIds) {
          action.setValue('batch_processing_ids', batchProcessingIds.toString());
          action.setValue('group_id', actionParms.groupId);
      }
      return action.insert();
  },

  ItemGenerationV2ActionQueueProcessor.generateBulkActionRecords = function(actionParms) {
      // Get Downstream Records
      var downstreamRecords = new GlideRecord(actionParms.batchProcessingIdTable);
      downstreamRecords.addEncodedQuery(actionParms.batchProcessingIdQuery);
      downstreamRecords.query();
      batchProcessingIds = [];
      var maxRecords = gs.getProperty('sn_grc.item_generation_max_records', DEFAULT_MAX_RECORDS);
      while (downstreamRecords.next()) {
          for (i = 0; i < maxRecords && downstreamRecords.hasNext(); i++) {
              if (!downstreamRecords.hasNext() || i + 1 == maxRecords) {
                  batchProcessingIds.push(downstreamRecords.getValue(actionParms.batchProcessingIdField));
              } else {
                  batchProcessingIds.push(downstreamRecords.getValue(actionParms.batchProcessingIdField));
                  downstreamRecords.next();
              }
          }

          if (i == maxRecords || !downstreamRecords.hasNext()) {
              if (i != maxRecords) {
                  //Catches a single remaining record
                  batchProcessingIds.push(downstreamRecords.getValue(actionParms.batchProcessingIdField));
              }
              this.generateActionRecord(actionParms, batchProcessingIds);
              batchProcessingIds = [];
              i = 0;
          }
      }
      return 'group_id=' + actionParms.groupId;
  };

ItemGenerationV2ActionQueueProcessor.updateActionState = function(action, expectedState) {
      action.setValue('state', expectedState);
      action.update();
  },

  ItemGenerationV2ActionQueueProcessor.updateActionErrorTrace = function(action, err) {
      action.setValue('error_trace', err);
      action.update();
  },

  ItemGenerationV2ActionQueueProcessor.updateActionProcessedTime = function(action) {
      action.setValue('processed', new GlideDateTime());
      action.update();
  },

  ItemGenerationV2ActionQueueProcessor.updateActionProcessingDuration = function(action) {
      var processedTime = new GlideDateTime(action.processed).getNumericValue();
      var now = new GlideDateTime().getNumericValue();
      action.setValue('processing_duration', now - processedTime);
      action.update();
  },

  ItemGenerationV2ActionQueueProcessor.isActionProcessingInQueue = function() {
      var action = new GlideAggregate('sn_grc_item_generation_action_event_queue');
      action.addQuery('state', 'running');
      action.addAggregate('COUNT');
      action.query();
      action.next();

      return action.getAggregate('COUNT') > 0;
  };

ItemGenerationV2ActionQueueProcessor.getOldestReadyActionFromQueue = function() {
      // Check if previous processed action was part of a group. If so, search for next in the group and process
      var action = '';
      var checkAction = new GlideRecord('sn_grc_item_generation_action_event_queue');
      checkAction.orderByDesc('processed');
      checkAction.addQuery('state', 'processed');
      checkAction.addNotNullQuery('group_id');
      checkAction.setLimit(1);
      checkAction.query();
      if (checkAction.next()) {
          action = new GlideRecord('sn_grc_item_generation_action_event_queue');
          action.orderBy('sys_created_on');
          action.addQuery('state', 'ready');
          action.addQuery('group_id', checkAction.getValue('group_id'));
          action.query();
          if (action.next()) {
              return action;
          } else {
              action = this.getNextActionFromQueue();
          }
      } else {
          action = this.getNextActionFromQueue();
      }

      if (action) {
          return action;
      }

      return null;
  },

  ItemGenerationV2ActionQueueProcessor.getNextActionFromQueue = function() {
      action = new GlideRecord('sn_grc_item_generation_action_event_queue');
      action.orderBy('sys_created_on');
      action.addQuery('state', 'ready');
      action.setLimit(1);
      action.query();
      if (action.next()) {
          return action;
      }
      return null;
  };

Sys ID

40970d6307922010bbc77f04a9d30070

Offical Documentation

Official Docs: