Name

sn_itom_integ_app.IntegrationLaunchpadApi

Description

Integration launchpad APIs to return JSON based response to be consumed by UI.

Script

var IntegrationLaunchpadApi = Class.create();
IntegrationLaunchpadApi.prototype = {

  TABLE_HOB_DEFINITION_DETAILS: "sn_em_ai_hob_definition_details",
  UNKNOWN: "Unknown",
  SUCCESS: "success",
  ERROR: "error",

  TILE_TYPE_INDIVIDUAL: "individual",
  TILE_TYPE_PARENT: "parent",
  TILE_TYPE_CHILD: "child",

  initialize: function() {
      this.mappingDict = {
          "reference_table_instance": {
              "em_connector_definition": "em_connector_instance",
              "sn_em_connector_listener": "sn_em_connector_push_instance"
          },
          "reference_id_field": {
              "em_connector_instance": "connector_definition",
              "sn_em_connector_push_instance": "push_connector_definition"
          }
      };
  },

  getLandingPagePayload: function() {

      var result;
      try {
          result = this._generateResponse(this.SUCCESS, this._buildLandingPageData(), null);
      } catch (e) {
          var msg = gs.getMessage("Server error while generating landing page response due to {0}", [e.toString()]);
          gs.error("Error: " + msg);
          result = this._generateResponse(this.ERROR, null, msg);
      }
      return result;

  },

  getInstructionByHobDefinition: function(hobDefinitionId) {

      var result;
      try {
          result = this._generateResponse(this.SUCCESS, this._fetchInstructions(hobDefinitionId), null);
      } catch (e) {
          var msg = gs.getMessage("Server error while fetching instructions by id '{0}' due to {1} ", [hobDefinitionId, e.toString()]);
          gs.error("Error: " + msg);
          result = this._generateResponse(this.ERROR, " ", msg);
      }
      return result;
  },

  getMidServerWithAtleastOneEventListener: function() {
  	var responseObject = [];
  	var gr = new GlideRecord('ecc_agent');
  	gr.addQuery('status', 'Up');
  	gr.addQuery('validated', true);
  	var gr1 = gr.addJoinQuery('ecc_agent_ext_context_event', 'sys_id', 'executing_on');
  	gr1.addCondition('status','Started');
  	gr.query();
  	while(gr.next()) {
  		var data = {};
  		data.id = gr.getValue('sys_id');
  		data.name = gr.getValue('name');
  		responseObject.push(data);
  	}
  	return responseObject;
  },

  _fetchInstructions: function(hobDefinitionId) {

      var hobDefinitionGr = new GlideRecord(this.TABLE_HOB_DEFINITION_DETAILS);
      if (hobDefinitionGr.get(hobDefinitionId))
          return hobDefinitionGr.getValue('instructions');

      throw new Error("Invalid health onboarding defination id - " + hobDefinitionId);

  },

  _buildLandingPageData: function() {

      var data = {};
      var tiles = this._buildTiles();

      data['count'] = tiles.length;
      data['tiles'] = tiles;
      data['mappings'] = this.mappingDict;

      return data;

  },

  _buildTiles: function() {

      var groupDetailsMap = this._getGroupDetails();

      var groupConnectorMap = groupDetailsMap['groupConnectorMap'];
      var groupImageMap = groupDetailsMap['groupImageMap'];

      var tiles = [];

      // Connectors with empty groupId will be represented in separate tile.
      this._handleNonGroupedConenctors(tiles, groupConnectorMap[this.UNKNOWN], this.TILE_TYPE_INDIVIDUAL);
      delete groupConnectorMap[this.UNKNOWN];

      for (var groupId in groupConnectorMap) {
          var connectorList = groupConnectorMap[groupId];
          if (connectorList && connectorList.length) {
              var image = groupImageMap[groupId];
              image = image ? image : connectorList[0]['image'];
              tiles.push(this._buildGroupDictionary(groupId, image, connectorList, this._isAnyOfTheConnectorPopular(connectorList), this.TILE_TYPE_PARENT));
          }

          // Add child as separate tile
          this._handleNonGroupedConenctors(tiles, connectorList, this.TILE_TYPE_CHILD);

      }

      return tiles;
  },

  _getGroupDetails: function() {

      var groupConnectorMap = {};
      var groupImageMap = {};

      // default group
      groupConnectorMap[this.UNKNOWN] = [];

      var hobGr = this._getHOBDefinationGr();
      while (hobGr.next()) {

          var groupId = this.UNKNOWN;
          var groupImage = null;

          if (hobGr.group) {
              groupId = hobGr.group.name;
              groupImage = hobGr.group.image ? "" + hobGr.group.image.name : null;

              // initialize connector list for group
              if (!groupConnectorMap[groupId])
                  groupConnectorMap[groupId] = [];

              // set image when present and not null
              if (!groupImageMap[groupId] && groupImage)
                  groupImageMap[groupId] = groupImage;
          }

          var connectorDetails = {};
          connectorDetails['name'] = hobGr.getValue('title');
          connectorDetails['sys_id'] = hobGr.getValue('sys_id');
          connectorDetails['active'] = this._getBooleanValue(hobGr.getDisplayValue('active'));
          connectorDetails['category_display_value'] = hobGr.getDisplayValue('category');
          connectorDetails['category'] = hobGr.getValue('category');
          connectorDetails['type_display_value'] = hobGr.getDisplayValue('type');
          connectorDetails['type'] = hobGr.getValue('type');
          connectorDetails['reference_table'] = hobGr.getValue('reference_table');
          connectorDetails['reference_id'] = hobGr.getValue('reference_id');
          connectorDetails['image'] = hobGr.getDisplayValue('image');
          connectorDetails['source'] = hobGr.getValue('source');
          connectorDetails['is_popular'] = this._getBooleanValue(hobGr.getDisplayValue('is_popular'));

          // if source is null, set it to empty string
          connectorDetails['source'] = connectorDetails['source'] ? connectorDetails['source'] : "";

          groupConnectorMap[groupId].push(connectorDetails);

      }
      return {
          "groupConnectorMap": groupConnectorMap,
          "groupImageMap": groupImageMap
      };

  },

  _handleNonGroupedConenctors: function(tiles, connectorList, tileType) {

      if (connectorList && connectorList.length) {
          for (var i in connectorList) {
              var groupId = connectorList[i]['name'];
              var image = connectorList[i]['image'];
              var isPopular = connectorList[i]['is_popular'];

              tiles.push(this._buildGroupDictionary(groupId, image, [connectorList[i]], isPopular, tileType));
          }
      }

  },

  _buildGroupDictionary: function(groupId, image, connectorList, isPopular, tileType) {
      var groupDict = {};
      groupDict['group_id'] = groupId;
      groupDict['image'] = image;
      groupDict['is_popular'] = isPopular;
      groupDict['tile_type'] = tileType;
      groupDict['connector_count'] = connectorList.length;
      groupDict['connectors'] = connectorList;
      return groupDict;
  },

  _isAnyOfTheConnectorPopular: function(connectorList) {

      if (connectorList && connectorList.length) {
          for (var i in connectorList) {
              if (connectorList[i]['is_popular'])
                  return true;
          }
      }
      return false;
  },

  _getHOBDefinationGr: function() {

      var hobDefinationGr = new GlideRecord(this.TABLE_HOB_DEFINITION_DETAILS);
      hobDefinationGr.addActiveQuery();
      // include only integrations that are set to visible on launchpad
      hobDefinationGr.addQuery("visible_in_launchpad", true);


      // For now, we will not be supporting "Bi Directional Connector" types so, exclude these connector types from the result
      // TODO: Remove this filter condition when these connector types are to be supported.
      // note: we don't support "Mid Push Connector" before Vancouver so we should return this type only for Vancouver onwards.
      var gr_sys_properties = new GlideRecord('sys_properties');
      var midPushConnectorSupport = gr_sys_properties.get('name', 'evt_mgmt.mid_pushconnector_instance_availability') && gr_sys_properties.getValue('value');
      midPushConnectorSupport == true || midPushConnectorSupport == 'true'
      	? hobDefinationGr.addEncodedQuery("typeNOT IN3^ORtype=")
      	: hobDefinationGr.addEncodedQuery("typeNOT IN3,5^ORtype=");
      hobDefinationGr.orderBy('category');
      hobDefinationGr.query();
      return hobDefinationGr;

  },

  _generateResponse: function(status, data, message) {

      var result = {};

      result['status'] = status;
      result['data'] = data ? data : {};
      if (message)
          result['error_message'] = message;

      return result;

  },

  _getBooleanValue: function(strValue) {
      return strValue == "true";
  },

  type: 'IntegrationLaunchpadApi'
};

Sys ID

e0a8720943082110a86b78114bb8f295

Offical Documentation

Official Docs: