Name

sn_reacf.RemedialActionEngineSNC

Description

No description available

Script

var RemedialActionEngineSNC = Class.create();
RemedialActionEngineSNC.prototype = {
  initialize: function() {
  	this.remedialActionHelper = new RemedialActionHelper();
  },

  TABLES: {
  	REMEDIAL_ACTION: "sn_reacf_remedial_action",
  	ACTION_EXECUTION: "sn_reacf_remedial_action_execution",
  },

  FIELDS: {
  	ACTION: {
  		ACTION: "action_id",
  		ACTION_TABLE: "action_table"
  	},
  	ACTION_EXECUTION: {
  		ACTION: "remedial_action",
  		TARGET_TABLE: "target_table",
  		MATCH_TARGET_EXTENSIONS: "match_target_extensions",
  		TARGET_CONDITIONS: "target_conditions",
  		TARGET_RECORD_ID: "target_record_id",
  		ACTION_RECORD_TABLE: "action_record_table",
  		ACTION_RECORD_ID: "action_record_id",
  	},
  	SYS_DOMAIN: "sys_domain",
  	MODEL: "model",
  	ELEMENT: "element",
  },

  STATES: {
  	FAILED: "failed",
  	IN_PROGRESS: "in_progress"
  },

  beginRemediation: function(remedialAction, parentTable, parentRecord, actionParams, targetRecord, originRecord) {
  	if (!remedialAction) {
  		gs.error("[RemedialActionEngine]: provide either the GlideRecord reference or sys_id or internal_name of the remedial action record");
  		return;
  	} else if (typeof remedialAction === 'string') {
  		if (this.remedialActionHelper.isSysId(remedialAction)) {
  			remedialAction = this.remedialActionHelper.getGlideRecord(this.TABLES.REMEDIAL_ACTION, remedialAction);
  		} else {
  			remedialAction = this.remedialActionHelper.getGlideRecordByInternalName(this.TABLES.REMEDIAL_ACTION, remedialAction);
  		}
  	}

  	if (!remedialAction || !remedialAction.isValidRecord()) {
  		gs.error("[RemedialActionEngine]: Provided remedial action is not a valid record");
  		return;
  	}

  	var targetTable = remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.TARGET_TABLE);

  	if (targetTable && typeof targetRecord === 'string') {
  		targetRecord = this.remedialActionHelper.getGlideRecord(targetTable, targetRecord);
  	}

  	if (targetTable && (!targetRecord || !targetRecord.isValidRecord())) {
  		gs.error("[RemedialActionEngine]: TargetRecord is missing or not valid");
  		return;
  	}

  	if (!parentTable) {
  		gs.error("[RemedialActionEngine]: provide the table name of the parent record from where the remedial action is initiated");
  		return;
  	}

  	if (!parentRecord) {
  		gs.error("[RemedialActionEngine]: provide the sys id of the parent record from where the remedial action is initiated");
  		return;
  	}

  	if (targetTable) {
  		if (remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.MATCH_TARGET_EXTENSIONS) == 1) {
  			var allowedTables = new GlideTableHierarchy(targetTable).getAllExtensions();
  		} else {
  			allowedTables = [targetTable];
  		}

  		var targetConditions = remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.TARGET_CONDITIONS);
  		if ((allowedTables.indexOf(targetRecord.getTableName() + "") == -1) ||
  			(!gs.nil(targetConditions) && !GlideFilter.checkRecord(targetRecord, targetConditions))) {
  			gs.error("[RemedialActionEngine]: Target table or conditions don't match with the remedial action definition");
  			return;
  		}
  	}

  	if (typeof actionParams === 'string') {
  		try {
  			actionParams = JSON.parse(actionParams);
  		} catch (ex) {
  			gs.error("[RemedialActionEngine]: Invalid actionParams Error: " + ex.message);
  			return;
  		}
  	} else {
  		actionParams = actionParams || {};
  	}

  	if (!this.remedialActionHelper.isActionParamsValid(remedialAction, actionParams, true)) {
  		gs.error("[RemedialActionEngine]: Action parameters missing or not valid for remedial action " + remedialAction.getDisplayValue());
  		return;
  	}

  	var matchingImplementation = this.remedialActionHelper.getExtensionPointImplementation(remedialAction);
  	if (gs.nil(matchingImplementation)) {
  		gs.error("[RemedialActionEngine]: Unable to find a matching implementation for  " + remedialAction.getDisplayValue());
  		return;
  	}

  	if (!matchingImplementation.isAuthorized(this._getTargetAction(remedialAction), remedialAction)) {
  		gs.error("[RemedialActionEngine]: Unauthorized execution request for " + remedialAction.getDisplayValue());
  		return;
  	}

  	var actionExecutionRequestId;
  	try {
  		var createActionExecutionRequestInputs = {};
  		createActionExecutionRequestInputs['remedial_action_sys_id'] = remedialAction.getUniqueValue();
  		createActionExecutionRequestInputs['action_parameters'] = actionParams;
  		createActionExecutionRequestInputs['parent_table'] = parentTable;
  		createActionExecutionRequestInputs['parent_record_sys_id'] = parentRecord;
  		if (targetTable) {
  			createActionExecutionRequestInputs['target_sys_id'] = targetRecord.getUniqueValue();
  		}
  		if (originRecord) {
  			if (originRecord instanceof GlideRecord && originRecord.isValidRecord()) {
  				createActionExecutionRequestInputs['origin_sys_id'] = originRecord.getUniqueValue();
  			} else {
  				createActionExecutionRequestInputs['origin_sys_id'] = originRecord;
  			}
  		}

  		var result = sn_fd.FlowAPI.getRunner()
  			.action('sn_reacf.create_remedial_action_execution_record')
  			.inForeground()
  			.withInputs(createActionExecutionRequestInputs)
  			.run();

  		var outputs = result.getOutputs();
  		actionExecutionRequestId = outputs['remedial_action_sys_id'];
  	} catch (ex) {
  		gs.error("[RemedialActionEngine]: Error while creating action request record with inputs " + JSON.stringify(createActionExecutionRequestInputs) + ". Error: " + ex.message);
  		return;
  	}

  	if (!actionExecutionRequestId) {
  		gs.error("[RemedialActionEngine]: Could not create action execution request record for " + remedialAction.getDisplayValue());
  		return;
  	}

  	return actionExecutionRequestId;
  },

  executeRemedialAction: function(remedialActionExecution) {
  	if (!remedialActionExecution) {
  		gs.error("[RemedialActionEngine]: provide either the GlideRecord reference or sys_id of the remedial action execution record");
  		return;
  	} else if (typeof remedialActionExecution === 'string') {
  		remedialActionExecution = this.remedialActionHelper.getGlideRecord(this.TABLES.ACTION_EXECUTION, remedialActionExecution);
  	}

  	if (!remedialActionExecution || !remedialActionExecution.isValidRecord()) {
  		gs.error("[RemedialActionEngine]: Provided remedial action execution is not a valid record");
  		return;
  	}

  	var remedialAction = remedialActionExecution[this.FIELDS.ACTION_EXECUTION.ACTION].getRefRecord();
  	if (remedialAction.isValidRecord()) {
  		var matchingImplementation = this.remedialActionHelper.getExtensionPointImplementation(remedialAction);

  		if (gs.nil(matchingImplementation)) {
  			gs.error("[RemedialActionEngine]: Unable to find a matching implementation for  " + remedialAction.getDisplayValue());
  			return;
  		}
  		if (!matchingImplementation.isAuthorized(this._getTargetAction(remedialAction), remedialAction)) {
  			gs.error("[RemedialActionEngine]: Unauthorized execution request for " + remedialAction.getDisplayValue());
  			return;
  		}

  		try {
  			//actionGr, targetRecordGr, actionParams
  			var targetActionGr = this._getTargetAction(remedialAction);
  			var targetRecordGr = remedialActionExecution[this.FIELDS.ACTION_EXECUTION.TARGET_RECORD_ID] ? remedialActionExecution[this.FIELDS.ACTION_EXECUTION.TARGET_RECORD_ID].getRefRecord() : null;
  			var actionParams = this.remedialActionHelper.getActionParams(remedialActionExecution);
  			var response = matchingImplementation.execute(targetActionGr, targetRecordGr, actionParams);
  			if (response) {
  				this.remedialActionHelper.updateRemedialActionExecutionRequest(remedialActionExecution, this.STATES.IN_PROGRESS, response.action_execution_table, response.action_execution_id);
  			}
  			return response;
  		} catch (ex) {
  			this.remedialActionHelper.updateRemedialActionExecutionRequest(remedialActionExecution, this.STATES.FAILED);
  			gs.error("[RemedialActionEngine]: Error while executing action  " + remedialAction.getDisplayValue() + ". Error: " + ex.message);
  			return;
  		}
  	} else {
  		gs.error("[RemedialActionEngine]: Unable to determine the remedial action from execution record");
  	}

  },

  getRemedialActionOutput: function(remedialActionExecution) {
  	if (!remedialActionExecution) {
  		gs.error("[RemedialActionEngine]: provide either the GlideRecord reference or sys_id of the remedial action execution record");
  		return;
  	} else if (typeof remedialActionExecution === 'string') {
  		remedialActionExecution = this.remedialActionHelper.getGlideRecord(this.TABLES.ACTION_EXECUTION, remedialActionExecution);
  	}

  	if (!remedialActionExecution || !remedialActionExecution.isValidRecord()) {
  		gs.error("[RemedialActionEngine]: Provided remedial action execution is not a valid record");
  		return;
  	}

  	var remedialAction = remedialActionExecution[this.FIELDS.ACTION_EXECUTION.ACTION].getRefRecord();
  	if (remedialAction.isValidRecord()) {
  		var matchingImplementation = this.remedialActionHelper.getExtensionPointImplementation(remedialAction);
  		return matchingImplementation.getOutput(this._getTargetActionRequest(remedialActionExecution));
  	}
  },

  isAuthorized: function(remedialAction) {
  	if (!remedialAction) {
  		gs.error("[RemedialActionEngine]: provide either the GlideRecord reference or sys_id or internal_name of the remedial action record");
  		return;
  	} else if (typeof remedialAction === 'string') {
  		if (this.remedialActionHelper.isSysId(remedialAction)) {
  			remedialAction = this.remedialActionHelper.getGlideRecord(this.TABLES.REMEDIAL_ACTION, remedialAction);
  		} else {
  			remedialAction = this.remedialActionHelper.getGlideRecordByInternalName(this.TABLES.REMEDIAL_ACTION, remedialAction);
  		}
  	}

  	if (!remedialAction || !remedialAction.isValidRecord()) {
  		gs.error("[RemedialActionEngine]: Provided remedial action is not a valid record");
  		return;
  	}

  	var matchingImplementation = this.remedialActionHelper.getExtensionPointImplementation(remedialAction);
  	return matchingImplementation.isAuthorized(this._getTargetAction(remedialAction), remedialAction);
  },
  
  isApplicable: function(remedialAction, targetRecord) {
  	if (!remedialAction) {
  		return;
  	} else if (typeof remedialAction === 'string') {
  		if (this.remedialActionHelper.isSysId(remedialAction)) {
  			remedialAction = this.remedialActionHelper.getGlideRecord(this.TABLES.REMEDIAL_ACTION, remedialAction);
  		} else {
  			remedialAction = this.remedialActionHelper.getGlideRecordByInternalName(this.TABLES.REMEDIAL_ACTION, remedialAction);
  		}
  	}
  	
  	if (!remedialAction || !remedialAction.isValidRecord()) {
  		return;
  	}
  	
  	var targetTable = remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.TARGET_TABLE);

  	if (targetTable && typeof targetRecord === 'string') {
  		targetRecord = this.remedialActionHelper.getGlideRecord(targetTable, targetRecord);
  	}

  	if (targetTable && (!targetRecord || !targetRecord.isValidRecord())) {
  		return;
  	}
  	
  	if (targetTable) {
  		var allowedTables = null;
  		if (remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.MATCH_TARGET_EXTENSIONS) == 1) {
  			allowedTables = new GlideTableHierarchy(targetTable).getAllExtensions();
  		} else {
  			allowedTables = [targetTable];
  		}

  		var targetConditions = remedialAction.getValue(this.FIELDS.ACTION_EXECUTION.TARGET_CONDITIONS);	
  		return (allowedTables.indexOf(targetRecord.getTableName() + "") != -1) && (gs.nil(targetConditions) || GlideFilter.checkRecord(targetRecord, targetConditions));
  	}
  	
  	return false;
  	
  },

  _getTargetAction: function(remedialAction) {
  	var actionTable = remedialAction.getValue(this.FIELDS.ACTION.ACTION_TABLE);
  	var actionId = remedialAction.getValue(this.FIELDS.ACTION.ACTION);
  	return this.remedialActionHelper.getGlideRecord(actionTable, actionId);
  },

  _getTargetActionRequest: function(remedialActionExecutionGr) {
  	var actionRequestTable = remedialActionExecutionGr.getValue(this.FIELDS.ACTION_EXECUTION.ACTION_RECORD_TABLE);
  	var actionRequestId = remedialActionExecutionGr.getValue(this.FIELDS.ACTION_EXECUTION.ACTION_RECORD_ID);
  	return this.remedialActionHelper.getGlideRecord(actionRequestTable, actionRequestId);
  },

  type: 'RemedialActionEngineSNC'
};

Sys ID

97b7620443f06110cd5b8beeaab8f20f

Offical Documentation

Official Docs: