Name

global.RESTVariableBusinessRuleChecker

Description

Checks if any associated business rules have all of the REST variables configured.

Script

var RESTVariableBusinessRuleChecker = Class.create();
RESTVariableBusinessRuleChecker.prototype = {
  businessRuleDisplayCount: 3,
  
  initialize: function(businessRuleDisplayCount) {
  	if (businessRuleDisplayCount != undefined && businessRuleDisplayCount > 0)
  		this.businessRuleDisplayCount = businessRuleDisplayCount;
  },

  check: function(grMessage, restMethod) {				
  	this._checkAssociatedBusinessRules(grMessage, restMethod);
  },

  _checkAssociatedBusinessRules: function(grMessage, restMethod) {		
  	// Get all available Http methods for this rest message		
  	grMethod = new GlideRecord('sys_rest_message_fn');
  	grMethod.addQuery('rest_message', grMessage.sys_id);
  			
  	if (restMethod != undefined)
  		grMethod.addQuery('function_name', restMethod);
  		
  	grMethod.query();
  			
  	while (grMethod.next()) {
  		// Get all rest variables for this rest method
  		var restClient = new sn_ws.RESTMessageV2(grMessage.name, grMethod.function_name);
  		var restVariables = restClient.getVariables();			

  		// Get any business rules that are attached to this rest message & method
  		var grBusinessRule = new GlideRecord('sys_script');	
  		grBusinessRule.addQuery('rest_service', grMessage.sys_id);
  		grBusinessRule.addQuery('rest_method', grMethod.sys_id);
  		grBusinessRule.query();

  		// Evaluate each business rule to see if it contains all of the rest variables
  		var exceptionList = [];
  		var arrayUtil = new ArrayUtil();
  		
  		while (grBusinessRule.next()) {				
  			var operators = [ 'EQUALTO', 'SAMEAS' ];
  			var brVariableNames = [];			
  			var brVariables = grBusinessRule.rest_variables.split('^');
  			
  			// Parse business rule variable names
  			for(var i = 0; i < brVariables.length; i++ ) {
  				var brv = brVariables[i];

  				for (var j = 0; j < operators.length; j++) {
  					var opIndex = brv.indexOf(operators[j]);

  					if (opIndex == -1)
  						continue;

  					brVariableNames.push(brv.substring(0, opIndex));
  				}
  			}
  			
  			for (var k = 0; k < restVariables.length; k++) {
  				if (!arrayUtil.contains(brVariableNames, restVariables[k])) {
  					exceptionList.push({ sys_id: grBusinessRule.getValue('sys_id'), name: grBusinessRule.getValue('name') });
  					break;
  				}
  			}				
  		}

  		// If needed, display any exceptions found
  		var businessRuleCount = grBusinessRule.getRowCount();
  		if (exceptionList.length > 0) {
  			var exceptionMessage = '';			
  			
  			for (var l = 0; l < exceptionList.length; l++) {
  				exceptionMessage += (exceptionMessage != '' ? ', ' : '');
  				
  				// Only display the specified number of business rules
  				if (l >= this.businessRuleDisplayCount) {
  					exceptionMessage += '(' 
  									 + (businessRuleCount - this.businessRuleDisplayCount)
  									 + ' ' + gs.getMessage('more') + ')';
  					break;
  				}
  				
  				exceptionMessage += '<a href="sys_script.do?sys_id=' 
  								 + exceptionList[l].sys_id + '">' 
  								 + exceptionList[l].name
  								 + '</a>';			
  			}
  			
  			gs.addInfoMessage(gs.getMessage('RESTVariableBusinessRuleChecker.UnmatchedBusinessRules', 
  											 [grMethod.function_name, grMessage.name])
  							   + ' ' + exceptionMessage);
  		}	
  	}		
  },
  
  type: 'RESTVariableBusinessRuleChecker'
};

Sys ID

2b394b925333020048ae0f0c36dc3424

Offical Documentation

Official Docs: