public string ExportUserSecurity() { var jsonPayLoad = ""; try { var userProfiles = new UserSecurityProfileList(); foreach (var user in this._users) { var disabled = user.GetAttributeValue <bool>("isdisabled"); if (!disabled) { //build object var userProfile = new UserSecurityProfile() { emails = new List <string>() { user.GetAttributeValue <string>("domainname") } }; userProfile.businessUnit = user.GetAttributeValue <EntityReference>("businessunitid").Name; var userRoles = GetUserSecurityRoles(user.Id); userProfile.roles = userRoles.Select(entity => entity.GetAttributeValue <string>("name")).ToList(); userProfile.roles.Sort(); //need to exclude from list var userTeams = GetUserTeams(user.Id); userProfile.teams = userTeams.Select(entity => entity.GetAttributeValue <string>("name")).ToList(); userProfile.teams.Sort(); //need to exclude from list - do.where.select var userQueues = GetUserQueues(user.Id); userProfile.queues = userQueues .Where(item => item.GetAttributeValue <AliasedValue>("team.name") == null && item.GetAttributeValue <EntityReference>("ownerid").Id != user.Id) .Select(entity => entity.GetAttributeValue <string>("name")).ToList(); userProfile.queues.Sort(); if (userProfiles.Where <UserSecurityProfile>(profile => user.GetAttributeValue <EntityReference>("businessunitid").Name == profile.businessUnit && userProfile.roles.SequenceEqual(profile.roles) && userProfile.teams.SequenceEqual(profile.teams) && userProfile.queues.SequenceEqual(profile.queues)) .FirstOrDefault() != null) { userProfiles.Where <UserSecurityProfile>(profile => user.GetAttributeValue <EntityReference>("businessunitid").Name == profile.businessUnit && userProfile.roles.SequenceEqual(profile.roles) && userProfile.teams.SequenceEqual(profile.teams) && userProfile.queues.SequenceEqual(profile.queues)) .FirstOrDefault().emails.Add(userProfile.emails[0]); } else { userProfiles.Add(userProfile); } } } jsonPayLoad = JsonConvert.SerializeObject(userProfiles); } catch (Exception e) { Console.WriteLine($"Failure to process Team security roles: {e.Message}"); } return(jsonPayLoad); }
public void ConfigureUser(UserSecurityProfile userModel) { foreach (var payloadUserEmail in userModel.emails) { var currentUser = this._users.FirstOrDefault(entity => entity.GetAttributeValue <string>("domainname").ToLower() == payloadUserEmail.ToLower()); if (currentUser != null) { var disabled = currentUser.GetAttributeValue <bool>("isdisabled"); if (!disabled) { //business unit //business units are unique var userBusinessUnitId = currentUser.GetAttributeValue <EntityReference>("businessunitid").Id; var userBusinessUnitName = this._businessUnits.FirstOrDefault(entity => entity.Id == userBusinessUnitId) ?.GetAttributeValue <string>("name"); var moveToBusinessUnit = this._businessUnits.FirstOrDefault(bu => bu.GetAttributeValue <string>("name") == userModel.businessUnit); //# assign user to business unit if (moveToBusinessUnit != null && moveToBusinessUnit.Id != userBusinessUnitId) { SetCrmUserBusinessUnit(currentUser.Id, moveToBusinessUnit.Id); currentUser["businessunitid"] = moveToBusinessUnit.Id; userBusinessUnitId = moveToBusinessUnit.Id; } else if (moveToBusinessUnit == null) { // Could not confirm user's expected business unit. } var userRoles = GetUserSecurityRoles(currentUser.Id); //roles //security roles have unique names var rolesToRemove = userRoles.Where(item => userModel.roles.Contains(item.GetAttributeValue <string>("name")) == false).Distinct(); foreach (var role in rolesToRemove) { RemoveSecurityRoleFromUser(currentUser, role.Id); } var rolesToAdd = userModel.roles.Where(item => userRoles.FirstOrDefault(entity => item == entity.GetAttributeValue <string>("name")) == null).Distinct(); foreach (var role in rolesToAdd) { var roleId = this._roles.Where(item => item.GetAttributeValue <string>("name") == role && item.GetAttributeValue <EntityReference>("businessunitid").Id == userBusinessUnitId).Distinct(); AddSecurityRoleToUser(currentUser, roleId.First <Entity>().Id); } var userTeams = GetUserTeams(currentUser.Id); //teams var teamsToRemove = userTeams.Where(item => userModel.teams.Contains(item.GetAttributeValue <string>("name")) == false).Distinct(); foreach (var team in teamsToRemove) { RemoveUserFromTeam(currentUser, team.Id); } var teamsToAdd = userModel.teams.Where(item => userTeams.FirstOrDefault(entity => item == entity.GetAttributeValue <string>("name")) == null).Distinct(); foreach (var team in teamsToAdd) { var teamId = this._teams.Where(item => item.GetAttributeValue <string>("name") == team).Distinct(); AddUserToTeam(currentUser, teamId.First <Entity>().Id); } //need to get queues, but not include any where they are the owner (personal queues) //also need to exclude queues that are attached to a default business unit var userQueues = GetUserQueues(currentUser.Id); var queuesToAdd = userModel.queues.Where(item => userQueues.FirstOrDefault(entity => item == entity.GetAttributeValue <string>("name")) == null).Distinct(); foreach (var queue in queuesToAdd) { var queueId = this._queues.Where(item => item.GetAttributeValue <string>("name") == queue).Distinct(); AddUserToQueue(currentUser, queueId.First <Entity>().Id); } var queuesToRemove = userQueues.Where(item => userModel.queues.Contains(item.GetAttributeValue <string>("name")) == false && item.GetAttributeValue <AliasedValue>("team.name") == null && item.GetAttributeValue <EntityReference>("ownerid").Id != currentUser.Id ).Distinct(); foreach (var queue in queuesToRemove) { RemoveUserFromQueue(currentUser, queue.Id); } } else { //can we still remove all security roles etc in case they get reactivated? } } else { //couldnt find user } } }