/// <summary> /// Adds the staff handler. /// </summary> /// <param name="request">The request.</param> /// <param name="response">The response.</param> /// <returns></returns> public AddStaffProfileResponse AddStaffHandler(AddStaffProfileRequest request, AddStaffProfileResponse response) { ValidateStaffProfile(request); var user = CreateUser(request); using (var context = _entityContextFactory.CreateEntityContext()) { var staffProfile = new StaffProfile { UserId = user.Id, PrimaryOrgUnitId = request.PrimaryOrgUnitId, Title = request.Title }; if (request.OrgUnitIds != null) { foreach (int orgUnitId in request.OrgUnitIds) { var staffProfileOrgUnit = new StaffProfileOrgUnit { OrgUnitId = orgUnitId }; if (request.Permissions != null) { foreach (var permission in request.Permissions.Where(p => p.OrgUnitId == orgUnitId)) { staffProfileOrgUnit.StaffProfileOrgUnitPermissions.Add(new StaffProfileOrgUnitPermission { AppliesToDescendants = permission.AppliesToDescendants, IsGranted = permission.IsGranted, StaffPermissionValue = permission.StaffPermissionValue }); } } staffProfile.StaffProfileOrgUnits.Add(staffProfileOrgUnit); } } context.EntitySet<StaffProfile>().Add(staffProfile); context.SaveChanges(); if (!request.IsBulkUpdateMode) { // Update the org unit entity association data to reflect newly added staff user PublishOrgUnitAssociationsHelper.PublishOrgUnitEntityAssociations(context.ObjectContext, "StaffProfiles", staffProfile.Id); } if(!request.DisableCacheRefresh) UpdateStaffPermissionsCache(user.Id); response.StaffProfileId = staffProfile.Id; response.UserId = user.Id; } return response; }
/// <summary> /// Returns the ID of all org units assocaited to the specified staff profile that are also /// associated to the specified domain URL. /// </summary> /// <param name="staffProfile">The staff profile.</param> /// <param name="rootDomainUrl">A root domain URL.</param> /// <returns></returns> public IEnumerable<int> GetStaffOrgUnitIdsForDomain(StaffProfile staffProfile, string rootDomainUrl) { if (!string.IsNullOrEmpty(rootDomainUrl)) { using (var context = _entityContextFactory.CreateEntityContext()) { if (staffProfile == null) return new int[]{}; var sqlText = string.Format(CultureInfo.InvariantCulture, "exec GetStaffOrgUnitsForDomain @UserId={0}, @RootDomainUrl='{1}'", staffProfile.UserId, rootDomainUrl); return context.ObjectContext.ExecuteStoreQuery<int>(sqlText).ToArray(); } } else { return staffProfile.StaffProfileOrgUnits.Select(o => o.OrgUnitId); } }
private static void UpdateRoles(IEntityContext context, UpdateStaffProfileRequest request, StaffProfile staffProfile) { List<int> newRoleIds = null; if (request.RoleIds != null) { newRoleIds = request.RoleIds.ToList(); EnsureStaffRoleAdded(context, newRoleIds); } if (newRoleIds != null) { var userRoleSet = context.EntitySet<UserRole>(); var existingRoleIds = staffProfile.User.UserRoles.Select(ur => ur.Role.Id).ToList(); foreach (var existingRoleId in existingRoleIds) { if (!newRoleIds.Contains(existingRoleId)) { var existingUserRole = staffProfile.User.UserRoles.Single(ur => ur.Role.Id == existingRoleId); staffProfile.User.UserRoles.Remove(existingUserRole); userRoleSet.Remove(existingUserRole); } } foreach (var newRoleId in newRoleIds) { if (!existingRoleIds.Contains(newRoleId)) { var newRole = context.EntitySet<Role>().Find(newRoleId); staffProfile.User.AddRole(newRole); } } } }
private static void UpdatePermissions(IEntityContext context, UpdateStaffProfileRequest request, StaffProfile staffProfile) { if (request.Permissions == null) return; var permissionSet = context.EntitySet<StaffProfileOrgUnitPermission>(); foreach (var staffProfileOrgUnit in staffProfile.StaffProfileOrgUnits) { var permissionsForOrgUnit = request.Permissions.Where(p => p.OrgUnitId == staffProfileOrgUnit.OrgUnitId); if (!permissionsForOrgUnit.Any()) { foreach (var permissionToRemove in staffProfileOrgUnit.StaffProfileOrgUnitPermissions.ToList()) { permissionSet.Remove(permissionToRemove); } continue; } foreach (var existingPermission in staffProfileOrgUnit.StaffProfileOrgUnitPermissions.ToList()) { if (!permissionsForOrgUnit.Select(p => p.StaffPermissionValue).Contains(existingPermission.StaffPermissionValue)) { permissionSet.Remove(existingPermission); } else { var updatedPermission = permissionsForOrgUnit.Single(p => p.StaffPermissionValue == existingPermission.StaffPermissionValue); existingPermission.IsGranted = updatedPermission.IsGranted; existingPermission.AppliesToDescendants = updatedPermission.AppliesToDescendants; } } var permissionsToAdd = permissionsForOrgUnit.Where(p => !staffProfileOrgUnit.StaffProfileOrgUnitPermissions.Select(ep => ep.StaffPermissionValue).Contains(p.StaffPermissionValue)); foreach (var newPermission in permissionsToAdd) { var staffProfileOrgUnitPermission = new StaffProfileOrgUnitPermission { AppliesToDescendants = newPermission.AppliesToDescendants, IsGranted = newPermission.IsGranted, StaffPermissionValue = newPermission.StaffPermissionValue }; staffProfileOrgUnit.StaffProfileOrgUnitPermissions.Add(staffProfileOrgUnitPermission); } } }
private static void UpdateOrgUnits(IEntityContext context, UpdateStaffProfileRequest request, StaffProfile staffProfile) { if (request.OrgUnitIds != null) { var staffProfileOrgUnitObjectSet = context.EntitySet<StaffProfileOrgUnit>(); var staffProfileOrgUnitPermissionsObjectSet = context.EntitySet<StaffProfileOrgUnitPermission>(); var existingOrgUnits = staffProfile.StaffProfileOrgUnits.ToList(); foreach (var orgUnit in existingOrgUnits) { if (!request.OrgUnitIds.Any(o => o == orgUnit.OrgUnitId)) { var permissions = orgUnit.StaffProfileOrgUnitPermissions.ToList(); foreach (var permission in permissions) { orgUnit.StaffProfileOrgUnitPermissions.Remove(permission); staffProfileOrgUnitPermissionsObjectSet.Remove(permission); } staffProfile.StaffProfileOrgUnits.Remove(orgUnit); staffProfileOrgUnitObjectSet.Remove(orgUnit); } } foreach (int id in request.OrgUnitIds) { if (!staffProfile.StaffProfileOrgUnits.Any(o => o.OrgUnitId == id)) { staffProfile.StaffProfileOrgUnits.Add(new StaffProfileOrgUnit { OrgUnitId = id, StaffProfileId = staffProfile.Id }); } } } }