public static bool RenameMemberGroupRoleRules(this IPublicAccessService publicAccessService, string?oldRolename, string?newRolename) { var hasChange = false; if (oldRolename == newRolename) { return(false); } IEnumerable <PublicAccessEntry> allEntries = publicAccessService.GetAll(); foreach (PublicAccessEntry entry in allEntries) { // get rules that match IEnumerable <PublicAccessRule> roleRules = entry.Rules .Where(x => x.RuleType == Constants.Conventions.PublicAccess.MemberRoleRuleType) .Where(x => x.RuleValue == oldRolename); var save = false; foreach (PublicAccessRule roleRule in roleRules) { // a rule is being updated so flag this entry to be saved roleRule.RuleValue = newRolename ?? string.Empty; save = true; } if (save) { hasChange = true; publicAccessService.Save(entry); } } return(hasChange); }
public IActionResult PostPublicAccess(int contentId, [FromQuery(Name = "groups[]")] string[] groups, [FromQuery(Name = "usernames[]")] string[] usernames, int loginPageId, int errorPageId) { if ((groups == null || groups.Any() == false) && (usernames == null || usernames.Any() == false)) { return(BadRequest()); } var content = _contentService.GetById(contentId); var loginPage = _contentService.GetById(loginPageId); var errorPage = _contentService.GetById(errorPageId); if (content == null || loginPage == null || errorPage == null) { return(BadRequest()); } var isGroupBased = groups != null && groups.Any(); var candidateRuleValues = isGroupBased ? groups : usernames; var newRuleType = isGroupBased ? Constants.Conventions.PublicAccess.MemberRoleRuleType : Constants.Conventions.PublicAccess.MemberUsernameRuleType; var entry = _publicAccessService.GetEntryForContent(content); if (entry == null || entry.ProtectedNodeId != content.Id) { entry = new PublicAccessEntry(content, loginPage, errorPage, new List <PublicAccessRule>()); if (candidateRuleValues is not null) { foreach (var ruleValue in candidateRuleValues) { entry.AddRule(ruleValue, newRuleType); } } } else { entry.LoginNodeId = loginPage.Id; entry.NoAccessNodeId = errorPage.Id; var currentRules = entry.Rules.ToArray(); var obsoleteRules = currentRules.Where(rule => rule.RuleType != newRuleType || candidateRuleValues?.Contains(rule.RuleValue) == false ); var newRuleValues = candidateRuleValues?.Where(group => currentRules.Any(rule => rule.RuleType == newRuleType && rule.RuleValue == group ) == false ); foreach (var rule in obsoleteRules) { entry.RemoveRule(rule); } if (newRuleValues is not null) { foreach (var ruleValue in newRuleValues) { entry.AddRule(ruleValue, newRuleType); } } } return(_publicAccessService.Save(entry).Success ? Ok() : Problem()); }