Name

sn_dp_store_app.AppDataPrivacyValidator

Description

No description available

Script

var AppDataPrivacyValidator = Class.create();
AppDataPrivacyValidator.prototype = {
  /**
   * Pre-validate only Selective replace technique parameters.
   * Validate all technique parameters using ScriptableValidator.java, except when both
   * start_index and end_index are being edited.
   * @return JSON with error, success or validationError.
   *         success.PRE_VALIDATION_SKIP to skip pre-validation
   *         success.PRE_VALIDATION_SUCCESS to skip validation
   */
  preValidateTechniqueParams: function(technique, updateDiff) {
      var gr = new GlideRecord('dp_technique_with_params');
      if (!gr.get(technique)) {
          return {
              'error': 'Technique not found.'
          };
      }
      if (gr.getValue('technique') !== 'aa46d2240f313010895c6b82ff767eea') {
          return {
              'success': 'PRE_VALIDATION_SKIP' // Skip technique other than Selective replace
          };
      }

      // (sys_id <-> parameter) mapping of start_index and end_index from dp_technique_parameter.list
      var indexIDs = {
          'f6714d9173313010fb1d1f877bf6a7ed': 'end_index',
          '12d00d9173313010fb1d1f877bf6a7b3': 'start_index'
      };
      var indexData = {};
      var updateIDs = Object.keys(updateDiff);
      var validatorApi = new global.DataProtectionValidator();
      var failureResponse = {};
      var savedParams = new GlideRecord('dp_technique_parameter_value');
      savedParams.addQuery('sys_id', 'IN', updateIDs);
      savedParams.query();

      while (savedParams.next()) {
          var parameterID = savedParams.getValue('sys_id');
          var parameterName = savedParams.getValue('technique_parameter');
          if (indexIDs.hasOwnProperty(parameterName)) {
              indexData[indexIDs[parameterName]] = {
                  sysId: parameterID,
                  newValue: updateDiff[parameterID]
              };
          } else {
              var result = validatorApi.validateParameterValues(parameterID, updateDiff[parameterID]);
              if (result) {
                  failureResponse[parameterID] = result; // Continue loop to get all error messages
              }
          }
      }

      // If both start_index and end_index are edited, validate here, else use scriptable validator.
      if (indexData.hasOwnProperty('start_index') && indexData.hasOwnProperty('end_index')) {
          var hasValidStartIndex = false;
          if (!indexData.start_index.newValue) {
              // Mandatory field which defaults to 1. Ref. MaskTechniqueParameters.java
              indexData.start_index.newValue = '1';
          }
          if (!this._isInteger(indexData.start_index.newValue)) {
              failureResponse[indexData.start_index.sysId] =
                  gs.getMessage("'start_index' parameter must be configured with an integer value.");
          } else {
              hasValidStartIndex = parseInt(indexData.start_index.newValue) > 0;
              if (!hasValidStartIndex) {
                  failureResponse[indexData.start_index.sysId] = gs.getMessage("Invalid start index.");
              }
          }

          if (indexData.end_index.newValue) { // end_index is optional
              if (!this._isInteger(indexData.end_index.newValue)) {
                  failureResponse[indexData.end_index.sysId] =
                      gs.getMessage("'end_index' parameter must be configured with an integer value.");
              } else if (hasValidStartIndex) {
                  if (parseInt(indexData.start_index.newValue) > parseInt(indexData.end_index.newValue)) {
                      failureResponse[indexData.start_index.sysId] =
                          gs.getMessage("End index must be greater than or equal to start index.");
                  }
              }
          }
      } else {
          var apiResponse = null;
          var errorId = null;
          if (indexData.hasOwnProperty('start_index')) {
              apiResponse = validatorApi.validateParameterValues(
                  indexData.start_index.sysId, indexData.start_index.newValue);
              errorId = indexData.start_index.sysId;
          }
          if (indexData.hasOwnProperty('end_index')) {
              apiResponse = validatorApi.validateParameterValues(
                  indexData.end_index.sysId, indexData.end_index.newValue);
              errorId = indexData.end_index.sysId;
          }
          if (apiResponse) {
              failureResponse[errorId] = apiResponse;
          }
      }

      if (Object.keys(failureResponse).length > 0) {
          return {
              'validationError': failureResponse
          };
      }

      return {
          'success': "PRE_VALIDATION_SUCCESS"
      };
  },

  _isInteger: function(value) {
      var number = parseInt(value);
      return !isNaN(number) && number >= -2147483648 && number <= 2147483647; // Java Integer range
  },

  type: 'AppDataPrivacyValidator'
};

Sys ID

af4f6b9b77231110840cac1d5b5a99c1

Offical Documentation

Official Docs: