Name

global.DataPrivacyAttributeUtils

Description

No description available

Script

var DataPrivacyAttributeUtils = Class.create();
DataPrivacyAttributeUtils.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
  MAX_USER_SOURCE_HARD_LIMIT: 1000,
  LEFT_SLUSH_END_MARKER: '==END==',
  USER_SOURCES: {
      'sys_user': 'users',
      'sys_user_group': 'groups'
  },
  setItemWithTableData: function() {
      var jobId = this.getParameter('sysparm_job_id');
      var prefix = this.getParameter('sysparm_prefix');
      var rightChoiceMap = {};
      var exclusionValues = '';
      if (prefix == null) {
          var valueReferenceTable = this.getParameter('sysparm_value_reference_table');
          var currentAttrGr = this.getDpJobAttributes(jobId, valueReferenceTable);
          while (currentAttrGr.next()) {
              rightChoiceMap[currentAttrGr.getValue('value_reference')] = currentAttrGr['value_reference'].name;
          }
      } else {
          var values = this.getParameter('sysparm_right_choice_values');
          if (!values) {
              values = '';
          }
          var arr = values.split(',');
          for (var x in arr) {
              rightChoiceMap[arr[x]] = true;
          }
      }
      exclusionValues = (Object.keys(rightChoiceMap)).join(',');
      var leftKey = this.getParameter('sysparm_leftKey');
      var textField = this.getParameter('sysparm_textField');
      var leftSlushRecords = this._getLeftSlushRecords(this.getParameter('sysparm_left_table'), prefix, exclusionValues);
      this._populateSlushLeftRightValues(leftSlushRecords, rightChoiceMap, leftKey, textField);
  },
  editTargetTables: function() {
      var response = {};
      var values = this.getParameter('sysparm_right_choice_values');
      var privacyJobId = this.getParameter('sysparm_job_id');
      var valueReferenceTable = this.getParameter('sysparm_value_reference_table');
      if (!privacyJobId || !valueReferenceTable) {
          return this._returnErrorResponse('Invalid job parameters');
      }
      if (!values) {
          values = '';
      }
      var maxUserSourceLimit = this._getMaxUserSourceLimit();
      var arr = values.split(',');
      // Hard limit of users being added to attribute list
      if (arr.length > maxUserSourceLimit) {
          return this._returnMaxUserSourceLimitError(valueReferenceTable);
      }
      var computedValues = this._computeAttributesToInsert(arr, privacyJobId);
      var newAttributes = Object.keys(computedValues.valuesToInsert);
      if (values == '' || newAttributes.length == 0) {
          response.status = 'success';
          return JSON.stringify(response);
      }
      if (computedValues.currentAttributeCount + newAttributes.length > maxUserSourceLimit) {
          return this._returnMaxUserSourceLimitError(valueReferenceTable);
      }
      return this.insertAttributeValues(privacyJobId, valueReferenceTable, newAttributes);
  },
  /**
   * Insert list of value references to dp_job_attribute.
   * 
   * @param jobId		sys_id of dp_job
   * @param valueReferenceTable	User Source table - for ex. sys_user, sys_user_group
   * @param valueReferences	List of references of @param valueReferenceTable
   * @return JSON string of response
   */
  insertAttributeValues: function(jobId, valueReferenceTable, valueReferences) {
      var response = {};
      if (!jobId || !valueReferenceTable || !valueReferences) {
          return this._returnErrorResponse('Invalid job parameters');
      }
      if (valueReferences.length > this._getMaxUserSourceLimit()) {
          return this._returnMaxUserSourceLimitError(valueReferenceTable);
      }
      var attibuteRecord = new GlideRecord('dp_job_attribute');
      for (var item in valueReferences) {
          attibuteRecord.newRecord();
          attibuteRecord.setValue('name', 'USER_SOURCE_INPUT'); // Constant for data_privacy attributes
          attibuteRecord.setValue('job_table', 'dp_job'); // Constant for data_privacy attributes
          attibuteRecord.setValue('job', jobId);
          attibuteRecord.setValue('value_reference_table', valueReferenceTable);
          attibuteRecord.setValue('value_reference', valueReferences[item]);
          attibuteRecord.insert();
      }
      response.status = 'success';
      return JSON.stringify(response);
  },
  /**
   * @param jobId  sys_id of dp_job
   * @param @nullable valueReferenceTable reference table add filter
   * @return GlideRecord all attributes if @param valueReferenceTable is null
   * 			or attributes beloning to @param valueReferenceTable
   */
  getDpJobAttributes: function(jobId, valueReferenceTable) {
      var gr = new GlideRecord('dp_job_attribute');
      gr.addQuery('job_table', 'dp_job');
      gr.addQuery('job', jobId);
      if (valueReferenceTable && this.USER_SOURCES[valueReferenceTable]) {
          gr.addQuery('value_reference_table', valueReferenceTable);
      }
      gr.query();
      return gr;
  },
  _returnMaxUserSourceLimitError: function(userSource) {
      var message = gs.getMessage("You can pick maximum {0} {1} per job.",
          [this._getMaxUserSourceLimit(), this.USER_SOURCES[userSource]]);
      return this._returnErrorResponse(message);
  },
  _returnErrorResponse: function(message) {
      var response = {};
      response.status = 'error';
      response.message = message;
      return JSON.stringify(response);
  },
  _getMaxUserSourceLimit: function() {
      // We have a hard limit of Max - 1000 as supported by backend.
      var userSetProperty = parseInt(gs.getProperty('dp.job.usersource.input.limit'));
      if (isNaN(userSetProperty)) {
          return this.MAX_USER_SOURCE_HARD_LIMIT;
      }
      return Math.min(userSetProperty, this.MAX_USER_SOURCE_HARD_LIMIT);
  },
  _getLeftSlushRecords: function(table, prefix, exclusionValues) {
      var gr = new GlideRecord(table);
      if (prefix) {
          gr.addQuery('name', "STARTSWITH", prefix);
      }
      if (exclusionValues) {
          gr.addQuery('sys_id', "NOT IN", exclusionValues);
      }
      gr.setLimit(this._getMaxUserSourceLimit());
      gr.orderBy('name');
      gr.query();
      return gr;
  },
  _populateSlushLeftRightValues: function(leftSlushRecords, rightChoiceMap, leftKey, textField) {
      var item;
      while (leftSlushRecords.next()) {
          if (!rightChoiceMap[leftSlushRecords.getValue(leftKey)]) {
              item = this.newItem(); // Save response data in Ajax element
              item.setAttribute('value', leftSlushRecords.getValue(leftKey));
              item.setAttribute('text', leftSlushRecords.getValue(textField));
          }
      }
      item = this.newItem(); // Save response data in Ajax element
      item.setAttribute('value', this.LEFT_SLUSH_END_MARKER);
      var keys = Object.keys(rightChoiceMap);
      for (var i = 0; i < keys.length; i++) {
          item = this.newItem(); // Save response data in Ajax element
          item.setAttribute('value', keys[i]);
          item.setAttribute('text', rightChoiceMap[keys[i]]);
      }
  },
  _computeAttributesToInsert: function(slushRightValues, jobId) {
      var valueReferenceField = 'value_reference';
      var rightChoiceMap = {};
      for (var i in slushRightValues) {
          rightChoiceMap[slushRightValues[i]] = true;
      }
      var existingAttributes = this.getDpJobAttributes(jobId, null); // Get all attributes
      var persistedAttributeCount = existingAttributes.getRowCount();
      while (existingAttributes.next()) {
          if (rightChoiceMap[existingAttributes.getValue(valueReferenceField)]) {
              // Skip items which are already in attribute table
              delete rightChoiceMap[existingAttributes.getValue(valueReferenceField)];
          } else {
              // Remove other attributes from table which are not selected by user
              existingAttributes.deleteRecord();
              --persistedAttributeCount;
          }
      }
      return {
          currentAttributeCount: persistedAttributeCount,
          valuesToInsert: rightChoiceMap
      };
  },
  type: 'DataPrivacyAttributeUtils'
});

Sys ID

ce39496aa3312110c1c5109246fcdacc

Offical Documentation

Official Docs: