public void AddRelatedAdminUsers(Workgroup workgroup) { if (!workgroup.Administrative) { //if this isn't admin, we want to check if we should add users from admin workgroups var parentWorkgroupIds = GetParentWorkgroups(workgroup.Id); foreach (var parentWorkgroupId in parentWorkgroupIds) { var parentWorkgroup = _repositoryFactory.WorkgroupRepository.Queryable.Single(a => a.Id == parentWorkgroupId); foreach (var workgroupPermission in parentWorkgroup.Permissions) { if (!_workgroupPermissionRepository.Queryable.Any(a => a.Workgroup == workgroup && a.Role == workgroupPermission.Role && a.User == workgroupPermission.User && a.ParentWorkgroup == parentWorkgroup)) { Check.Require(workgroupPermission.Role.Id != Role.Codes.Requester); var wp = new WorkgroupPermission(); wp.Role = workgroupPermission.Role; wp.User = workgroupPermission.User; wp.Workgroup = workgroup; wp.IsAdmin = true; wp.IsFullFeatured = parentWorkgroup.IsFullFeatured; wp.ParentWorkgroup = parentWorkgroup; _workgroupPermissionRepository.EnsurePersistent(wp); } } } var workgroupPermissionsThatMightNeedToBeRemoved = _workgroupPermissionRepository.Queryable.Where(a => a.Workgroup == workgroup && a.IsAdmin && !parentWorkgroupIds.Contains(a.ParentWorkgroup.Id)).ToList(); foreach (var workgroupPermission in workgroupPermissionsThatMightNeedToBeRemoved) { _workgroupPermissionRepository.Remove(workgroupPermission); } } else { var wp = _workgroupPermissionRepository.Queryable.Where(a => a.Workgroup == workgroup).ToList(); if (wp.Count > 0) { var wpActions = _workgroupPermissionRepository.Queryable.Where(a => a.ParentWorkgroup == workgroup).Select( b => new WorkgroupPermissionActions(b, WorkgroupPermissionActions.Actions.Delete)).ToList(); var ids = GetChildWorkgroups(workgroup.Id); foreach (var adminWP in wp) //Go through each permission in the workgroup { Check.Require(adminWP.Role.Id != Role.Codes.Requester); foreach (var childid in ids) { var wpAction = wpActions.SingleOrDefault( a => a.WorkgroupPermission.Workgroup.Id == childid && a.WorkgroupPermission.User == adminWP.User && a.WorkgroupPermission.Role == adminWP.Role); if (wpAction != null) { wpAction.Action = WorkgroupPermissionActions.Actions.Nothing; } else { wpAction = new WorkgroupPermissionActions(new WorkgroupPermission(), WorkgroupPermissionActions.Actions.Add); wpAction.WorkgroupPermission.Role = adminWP.Role; wpAction.WorkgroupPermission.User = adminWP.User; wpAction.WorkgroupPermission.Workgroup = _workgroupRepository.Queryable.Single(a => a.Id == childid); wpAction.WorkgroupPermission.IsAdmin = true; wpAction.WorkgroupPermission.IsFullFeatured = workgroup.IsFullFeatured; wpAction.WorkgroupPermission.ParentWorkgroup = workgroup; wpActions.Add(wpAction); } } } foreach (var wpAction in wpActions) { switch (wpAction.Action) { case WorkgroupPermissionActions.Actions.Delete: _workgroupPermissionRepository.Remove(wpAction.WorkgroupPermission); break; case WorkgroupPermissionActions.Actions.Add: _workgroupPermissionRepository.EnsurePersistent(wpAction.WorkgroupPermission); break; default: break; } } } } }