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());
        }