Name

global.CSMResponsibilityModelUtil

Description

No description available

Script

var CSMResponsibilityModelUtil = Class.create();
CSMResponsibilityModelUtil.prototype = {
  initialize: function() {
  },

  type: 'CSMResponsibilityModelUtil'
};

CSMResponsibilityModelUtil._getResponsibilitiesFromTargetEntityParents = function(relationship, accessLevel, targetEntity) {
  var responsibilities = null;
  var tu = new global.TableUtils(targetEntity);
  var targetEntityParentTables = j2js(tu.getTables());
  //first entry in targetEntityParentTables will be the target entity itself.
  for (var j = 1; j < targetEntityParentTables.length; j++) {
      responsibilityPath = [relationship, targetEntityParentTables[j], accessLevel];
      responsibilities = global.CSMRelationshipUtils.prototype.getSafely(global.CSMRelationshipConstants.RELATIONSHIPS, responsibilityPath);
      if (!gs.nil(responsibilities)) {
          break;
      }
  }
  return responsibilities;
};

CSMResponsibilityModelUtil.getResponsibilities = function(relationship, accessLevel, accessRoles, skipRoleCheck, targetEntity, applicableTo, restrictAccessTo) {
  // If accessLevel is not passed, default it to READ
  accessLevel = accessLevel || global.CSMRelationshipConstants.ACCESS.READ;
  
  var respCacheUtil = new global.ResponsibilityAccessConfigCacheUtil();
  
  // Return responsibilities based on responsibility access configuration if record(s) exist
  if (respCacheUtil.hasAccessConfigRecord(relationship, accessLevel, targetEntity) == true) {
  	return respCacheUtil.getResponsibilitiesFromCache(relationship, accessLevel, targetEntity, applicableTo, restrictAccessTo, skipRoleCheck);
  }
  
  // Fallback to existing CSMRelationshipConstants for responsibility access configuration
  var responsibilityPath = [];
  var relationshipHasTargetEntity = !gs.nil(targetEntity)? global.CSMRelationshipUtils.prototype.getSafely(global.CSMRelationshipConstants.RELATIONSHIPS, [relationship, global.CSMRelationshipConstants.HAS_TARGET_ENTITY]) : false;

  if (gs.nil(targetEntity))
  	responsibilityPath = [relationship, accessLevel];
  else if (relationshipHasTargetEntity)
  	responsibilityPath = [relationship, targetEntity, accessLevel];
  else
  	return [];

  var responsibilities = global.CSMRelationshipUtils.prototype.getSafely(global.CSMRelationshipConstants.RELATIONSHIPS, responsibilityPath);
  if (gs.nil(responsibilities) && !gs.nil(targetEntity) && relationshipHasTargetEntity){
  	//current target entity did not have any configuration set, so falling back to it's parents.
  	responsibilities = CSMResponsibilityModelUtil._getResponsibilitiesFromTargetEntityParents(relationship, accessLevel, targetEntity); 
  }
  if (gs.nil(responsibilities)) {
  	return [];
  }
  if(gs.nil(accessRoles))
  	accessRoles = {};
  accessRoles.list = [];
  var qualifiedResp = [];
  var respToRoles = global.CSMRelationshipConstantsSNC.RESPONSIBILITY_ROLES[relationship];
  
  //TODO: FIXME: Remove this check and return statement once roles are added to all the relationship types.
  if(gs.nil(respToRoles) || Object.keys(respToRoles).length == 0)
  	return responsibilities;
  
  for(var i=0, l= responsibilities.length; i < l; i++ ){
  	var responsibility = responsibilities[i];
  	var roles = respToRoles[responsibility];
  	if(gs.nil(roles))
  		continue;

  	accessRoles.list = accessRoles.list.concat(roles);
  	for(var p=0, q=roles.length; p < q; p++) {
  		var role = roles[p];
  		if(!gs.nil(role) && gs.hasRole(role)) {
  			qualifiedResp.push(responsibility);
  			break;
  		}
  	}
  }

  // Not returning early if skipRoleCheck is true to populate accessRoles, accessRoles might be used by the caller
  return (skipRoleCheck) ? responsibilities : qualifiedResp;
};

Sys ID

74d4df1a773a3010d3ef07dc7d5a9929

Offical Documentation

Official Docs: