private static Dictionary <Guid, PermissionRuleSet> CalculatePermissions(CmsPageLocationNode siteStructure, ILookup <Guid, PermissionRule> allPermissions, PermissionRuleSet defaultPermissions) { Dictionary <Guid, PermissionRuleSet> newRules = new Dictionary <Guid, PermissionRuleSet>(); var permissionsForPage = allPermissions[siteStructure.PageId].ToList(); if (!permissionsForPage.Any()) { newRules.Add(siteStructure.PageId, new PermissionRuleSet(defaultPermissions)); } else { newRules.Add(siteStructure.PageId, new PermissionRuleSet(permissionsForPage)); } foreach (var childNode in siteStructure.ChildNodes) { var subDict = CalculatePermissions(childNode, allPermissions, newRules[siteStructure.PageId]); foreach (var kvp in subDict) { newRules.Add(kvp.Key, kvp.Value); } } return(newRules); }
public void Move(CmsPage page, SitemapRelativePosition newSitemapRelativePosition) { var sqlFilter = SqlFilter.FromEntityFilter($@"{nameof(CmsPageLocationNode.PageId)} == {{{page.ContentId}}}", typeof(CmsPageLocationNode)); var newPageLocation = Orm.FindUnversionedContent <CmsPageLocationNode>(sqlFilter).Result.SingleOrDefault(); if (newPageLocation == null) { newPageLocation = new CmsPageLocationNode(); } else { AppendToRouteHistory(page); } newPageLocation.ContentId = Guid.NewGuid(); newPageLocation.PageId = page.ContentId; newPageLocation.SiteId = page.SiteId; if (newSitemapRelativePosition.ParentSitemapNodeId == null || newSitemapRelativePosition.ParentSitemapNodeId == Guid.Empty) { newSitemapRelativePosition.ParentSitemapNodeId = page.SiteId; } newPageLocation.ParentNodeId = newSitemapRelativePosition.ParentSitemapNodeId.Value; var expressionText = $"SiteId == {{{page.SiteId}}} && ParentNodeId == {{{newSitemapRelativePosition.ParentSitemapNodeId.Value}}}"; var booleanExpression = By.Condition(expressionText); var cmsPageSql = SqlTranslator.Build(booleanExpression, typeof(CmsPageLocationNode)); var sitemapNodesToUpdate = Orm.FindUnversionedContent <CmsPageLocationNode>(cmsPageSql).Result; var collection = sitemapNodesToUpdate.ToList(); var insertAt = 0; if (null != newSitemapRelativePosition.BeforeSitemapNodeId) { var beforeNode = collection.Single(x => newSitemapRelativePosition.BeforeSitemapNodeId == x.NodeId); insertAt = collection.IndexOf(beforeNode); } collection.Insert(insertAt, newPageLocation); for (int i = 0; i < collection.Count; i++) { collection[i].Order = i; Orm.Save(collection[i]); } DomainEvents.Raise(new SiteStructureChanged()); }