Name

global.VANotificationActionAPI

Description

Script API to create VA notification action.

Script

var VANotificationActionAPI = Class.create();
VANotificationActionAPI.prototype = {
  TOPIC_REF_QUALIFIER: "active=true^published=true^libraryISEMPTY^ORlibrary=false^is_system_topicISEMPTY^ORis_system_topic=false",
  VA_NOTIFICATION_ACTION_TABLE: "sys_notification_va_action",

  initialize: function() {},

  /**
  * API to create VA Action for a notification.
  * @param notificationId : valid notification (sys_notification) sys_id
  * @param payload: Array of action objects. Each object contains valid required fields for creating the action. Example:
  * 		[{ 	
  			name: “topic action”, (Mandatory), 
  			topic: "sys_id of topic sys_cs_topic", (Mandatory) 
  			active: true/false, (default is true if not provided) 
  		}] 
  
  * @return {"name of action1": "sys_id of action1", "name of action2": "sys_id of action2", message: "Any error message" }
  */

  createActions: function(notificationId, payload) {
      if (!VANotificationAPIHelper.isNotificationValid(notificationId)) {
          return {
              sys_id: null,
              message: "Failed to create or update VA action for notification. Invalid notification ID"
          };
      }

      var payloadValidationResult = this._validateActionPayloadAndCreateActionObj(notificationId, payload);
      if (!payloadValidationResult.isValid) {
          return {
              sys_id: null,
              message: payloadValidationResult.message
          };
      }
      var result = this._insertActions(notificationId, payloadValidationResult.actionArr);
      result.message = "";
      return result;
  },

  /**
  * API to update VA Action for a notification.
  * @param actionId : valid VA action (sys_notification_va_action) sys_id
  * @param payload: object contains valid fields for updating the action. Example:
  * 		{ 	
  			name: “topic action”, 
  			topic: "sys_id of topic sys_cs_topic",
  			active: true/false 
  		} 
  
  * @return {sys_id: "sys_id of updated action", message: "Any error message" }
  */
  updateAction: function(actionId, payload) {

      if (!this._isActionValid(actionId)) {
          return {
              sys_id: null,
              message: "Failed to update VA action for notification. Invalid action ID"
          };
      }

      var actionObj = {};
      actionObj.sys_id = actionId;

      if (!gs.nil(payload.name)) {
          var actionGr = this._getActionGr(actionId);
          var notificationId = actionGr.getValue('notification');
          if (this._isActionExistWithSameName(payload.name, notificationId, actionId)) {
              return {
                  sys_id: null,
                  message: "Failed to update VA action for notification. Action with same name exist"
              };
          }
          actionObj.name = payload.name;
      }

      if (!gs.nil(payload.topic)) {
          if (!this._isTopicValid(payload.topic)) {
              return {
                  isValid: false,
                  message: "Failed to update VA action for notification. Invalid topic"
              };
          }
          actionObj.topic = payload.topic;
      }

      if (!gs.nil(payload.active))
          actionObj.active = payload.active;

      var actionSysId = this._updateAction(actionObj);
      return {
          sys_id: actionSysId,
          message: ""
      };

  },

  _validateActionPayloadAndCreateActionObj: function(notificationId, payload) {

      if (gs.nil(payload) || !payload.length) {
          return {
              isValid: false,
              message: "Failed to create VA action for notification. Invalid payload"
          };
      }

      var actionArr = [];
      var names = {};
      for (var i = 0; i < payload.length; i++) {
          var actionObj = {};
          if (gs.nil(payload[i].name)) {
              return {
                  isValid: false,
                  message: "Failed to create VA action for notification. Invalid name"
              };
          }
         
          if (names.hasOwnProperty(payload[i].name) || this._isActionExistWithSameName(payload[i].name, notificationId)) {
              return {
                  isValid: false,
                  message: "Failed to create VA action for notification. Duplicate name for action"
              };
          } else {
              names[payload[i].name] = true;
          }

  		actionObj.name = payload[i].name;

          if (gs.nil(payload[i].topic) || !this._isTopicValid(payload[i].topic)) {
              return {
                  isValid: false,
                  message: "Failed to create VA action for notification. Invalid topic"
              };
          }
          actionObj.topic = payload[i].topic;
          actionObj.active = gs.nil(payload[i].active) ? true : payload[i].active;
          actionArr.push(actionObj);
      }

      return {
          isValid: true,
          actionArr: actionArr
      };
  },

  _isTopicValid: function(topicId) {
      var topicGr = new GlideRecordSecure("sys_cs_topic");
      topicGr.addQuery("sys_id", topicId);
      topicGr.addEncodedQuery(this.TOPIC_REF_QUALIFIER);
      topicGr.query();
      topicGr.next();
      return topicGr.isValidRecord();
  },

  _insertActions: function(notificationId, actionArr) {
      var returnObj = {};
      actionArr.forEach(function(action) {
          var actionGr = new GlideRecordSecure(this.VA_NOTIFICATION_ACTION_TABLE);
          actionGr.initialize();
          if (action.sys_id)
              actionGr.get(action.sys_id);

          actionGr.setValue("notification", notificationId);
          for (var key in action)
              actionGr.setValue(key, action[key]);

          var sysId = actionGr.update();
          returnObj[action['name']] = sysId;
      }, this);

      return returnObj;
  },

  _updateAction: function(actionObj) {
      var actionGr = new GlideRecordSecure(this.VA_NOTIFICATION_ACTION_TABLE);
      actionGr.initialize();
      if (actionObj.sys_id)
          actionGr.get(actionObj.sys_id);

      for (var key in actionObj)
          actionGr.setValue(key, actionObj[key]);

      return actionGr.update();
  },

  _isActionValid: function(actionId) {
      var actionGr = new GlideRecordSecure(this.VA_NOTIFICATION_ACTION_TABLE);
      actionGr.get(actionId);
      return actionGr.isValidRecord();
  },

  _getActionGr: function(actionId) {
      var actionGr = new GlideRecordSecure(this.VA_NOTIFICATION_ACTION_TABLE);
      actionGr.get(actionId);
      return actionGr;
  },

  _isActionExistWithSameName: function(name, notificationId, actionId) {
      var actionGr = new GlideRecordSecure(this.VA_NOTIFICATION_ACTION_TABLE);
      actionGr.addQuery('notification', notificationId);
      actionGr.addQuery('name', name.trim());

      if (!gs.nil(actionId))
          actionGr.addQuery('sys_id', '!=', actionId);

      actionGr.query();
      return actionGr.hasNext();
  },

  type: 'VANotificationActionAPI'
};

Sys ID

4ced699c5338211031a5ddeeff7b12e6

Offical Documentation

Official Docs: