Name

global.KnowledgeSecurityManagerSNC

Description

Granting knowledge_manager role to newly added managers. Revoking knowledge_manager role for users who are no longer managers. Customers should not change this class directly This class is never called directly.

Script

var KnowledgeSecurityManagerSNC = Class.create();
KnowledgeSecurityManagerSNC.prototype = {
  initialize: function() {
  },
  
  updateKnowledgeManagers: function(currentManagers, previousManagers){
  	var manager_role = new GlideRecord("sys_user_role");
  	manager_role.get("name", "knowledge_manager");
  	
  	// Grant knowledge_manager role to currently selected managers if needed
  	for(var i = 0; i < currentManagers.length; i ++)
  		this.addRole(currentManagers[i], manager_role.getUniqueValue());
  	
  	// Revoke knowledge_manager role from previously selected managers if needed
  	for(var i = 0; i < previousManagers.length; i ++)
  		this.removeRole(previousManagers[i], manager_role.getUniqueValue());
  },
  
  addRole: function(userId, roleId){
  	// Skip this elelemnt if empty
  	if(JSUtil.nil(userId))
  		return;
  	
  	// Check if the user has knowledge_manager role
  	var role = new GlideRecord("sys_user_has_role");
  	role.addQuery("user", userId);
  	role.addQuery("role", roleId);
  	role.addQuery("granted_by","not-applicable").addOrCondition("granted_by","");
  	role.query();
  	
  	// return if the user already has the knowledge_manager role
  	if(role.hasNext())
  		return;
  	
  	// otherwise grant the knowledge_manager role to the user
  	role.initialize();
  	role.user = userId;
  	role.role = roleId;
  	role.state = "active";
  	role.insert();
  	
  	// and add info message indicating what has happened
  	var msgArray = new Array();
  	msgArray.push(role.role.name + "");
  	msgArray.push(role.user.name + "");
  	gs.addInfoMessage(gs.getMessage('Adding role {0} to {1}', msgArray));
  },
  
  removeRole: function(userId, roleId){
  	if(JSUtil.nil(userId) || JSUtil.nil(roleId))
  		return;
  	
  	// Make sure that the user is not a manager of another KB 
  	// before revoking the knowledge_manager role
  	var encodedQuery = "kb_managersLIKE" + userId + "^ORowner=" + userId;
  	var isManager = new GlideRecord("kb_knowledge_base");
  	isManager.addEncodedQuery(encodedQuery);
  	isManager.query();
  	
  	if(isManager.hasNext())
  		return;
  	
  	// Revoke the knowledge_manager role
  	var userHasRole = new GlideRecord("sys_user_has_role");
  	userHasRole.addQuery("user", userId);
  	userHasRole.addQuery("role", roleId);
  	userHasRole.addQuery("granted_by","not-applicable").addOrCondition("granted_by","");
  	userHasRole.deleteMultiple();
  	
  	// and add info message indicating what has happened
  	var msgArray = new Array();
  	msgArray.push(userHasRole.role.name + "");
  	msgArray.push(userHasRole.user.name + "");
  	gs.addInfoMessage(gs.getMessage('Removing role {0} from {1}', msgArray));
  },
  
  type: 'KnowledgeSecurityManagerSNC'
}

Sys ID

6bf2247bb712230026778d78ee11a9fb

Offical Documentation

Official Docs: