/// <summary> /// Saves the child nodes. /// </summary> /// <param name="sitemap">The sitemap.</param> /// <param name="parentNode">The parent node.</param> /// <param name="nodesToSave">The nodes to save.</param> /// <param name="currentNodes">The current nodes.</param> /// <param name="createdNodes">The created nodes.</param> /// <param name="updatedNodes">The sitemap nodes.</param> /// <param name="deletedNodes">The deleted nodes.</param> private void SaveChildNodes( Module.Pages.Models.Sitemap sitemap, SitemapNode parentNode, IEnumerable <SaveSitemapNodeModel> nodesToSave, IList <SitemapNode> currentNodes, ref IList <SitemapNode> createdNodes, ref IList <SitemapNode> updatedNodes, ref IList <SitemapNode> deletedNodes) { if (nodesToSave == null) { return; } foreach (var nodeModel in nodesToSave) { var nodeToSave = currentNodes.FirstOrDefault(n => n.Id == nodeModel.Id && !n.IsDeleted); var isNew = nodeToSave == null; if (isNew) { nodeToSave = new SitemapNode { Id = nodeModel.Id.GetValueOrDefault(), Sitemap = sitemap, Translations = new List <Module.Pages.Models.SitemapNodeTranslation>() }; } else if (nodeModel.Version > 0) { nodeToSave.Version = nodeModel.Version; } nodeToSave.Page = nodeModel.PageId.HasValue ? repository.AsProxy <PageProperties>(nodeModel.PageId.Value) : null; nodeToSave.UsePageTitleAsNodeTitle = nodeModel.UsePageTitleAsNodeTitle; nodeToSave.Title = nodeModel.Title; nodeToSave.Url = nodeModel.Url; nodeToSave.UrlHash = !string.IsNullOrWhiteSpace(nodeModel.Url) ? nodeModel.Url.UrlHash() : null; nodeToSave.DisplayOrder = nodeModel.DisplayOrder; nodeToSave.Macro = nodeModel.Macro; nodeToSave.ParentNode = parentNode; repository.Save(nodeToSave); SaveTranslations(nodeModel, nodeToSave); if (isNew) { createdNodes.Add(nodeToSave); } else { updatedNodes.Add(nodeToSave); } SaveChildNodes(sitemap, nodeToSave, nodeModel.Nodes, currentNodes, ref createdNodes, ref updatedNodes, ref deletedNodes); } }
/// <summary> /// Saves the nodes. /// </summary> /// <param name="sitemap">The sitemap.</param> /// <param name="nodeModels">The node models.</param> /// <param name="currentNodes">The existing nodes.</param> /// <param name="createdNodes">The created nodes.</param> /// <param name="updatedNodes">The sitemap nodes.</param> /// <param name="deletedNodes">The deleted nodes.</param> private void SaveNodes(Module.Pages.Models.Sitemap sitemap, IList <SaveSitemapNodeModel> nodeModels, List <SitemapNode> currentNodes, ref IList <SitemapNode> createdNodes, ref IList <SitemapNode> updatedNodes, ref IList <SitemapNode> deletedNodes) { var removeAll = nodeModels.IsEmpty(); foreach (var existingNode in currentNodes) { if (removeAll || !NodeExist(nodeModels, existingNode.Id)) { repository.Delete(existingNode); deletedNodes.Add(existingNode); } } if (removeAll) { return; } SaveChildNodes(sitemap, null, nodeModels, currentNodes, ref createdNodes, ref updatedNodes, ref deletedNodes); }
/// <summary> /// Puts the sitemap specified in request. /// </summary> /// <param name="request">The request.</param> /// <returns> /// <c>PutSitemapsResponse</c> with updated sitemap data. /// </returns> public PutSitemapResponse Put(PutSitemapRequest request) { IEnumerable<SitemapNode> nodesFuture = null; if (request.Data.Nodes != null) { nodesFuture = repository.AsQueryable<SitemapNode>() .Where(node => node.Sitemap.Id == request.Id && !node.IsDeleted) .FetchMany(node => node.Translations) .ToFuture(); } var sitemap = repository.AsQueryable<Module.Pages.Models.Sitemap>(e => e.Id == request.Id.GetValueOrDefault()) .FetchMany(f => f.AccessRules) .ToFuture() .ToList() .FirstOrDefault(); var isNew = sitemap == null; if (isNew) { sitemap = new Module.Pages.Models.Sitemap { Id = request.Id.GetValueOrDefault(), AccessRules = new List<AccessRule>() }; } else if (request.Data.Version > 0) { sitemap.Version = request.Data.Version; } if (cmsConfiguration.Security.AccessControlEnabled) { accessControlService.DemandAccess(sitemap, securityService.GetCurrentPrincipal(), AccessLevel.ReadWrite); } unitOfWork.BeginTransaction(); if (!isNew) { sitemapService.ArchiveSitemap(sitemap.Id); } sitemap.Title = request.Data.Title; IList<Tag> newTags = null; if (request.Data.Tags != null) { tagService.SaveTags(sitemap, request.Data.Tags, out newTags); } if (request.Data.AccessRules != null) { sitemap.AccessRules.RemoveDuplicateEntities(); var accessRules = request.Data.AccessRules.Select( r => (IAccessRule)new AccessRule { AccessLevel = (AccessLevel)(int)r.AccessLevel, Identity = r.Identity, IsForRole = r.IsForRole }) .ToList(); accessControlService.UpdateAccessControl(sitemap, accessRules); } repository.Save(sitemap); var createdNodes = (IList<SitemapNode>)new List<SitemapNode>(); var updatedNodes = (IList<SitemapNode>)new List<SitemapNode>(); var deletedNodes = (IList<SitemapNode>)new List<SitemapNode>(); if (request.Data.Nodes != null) { SaveNodes(sitemap, request.Data.Nodes, nodesFuture != null ? nodesFuture.ToList() : new List<SitemapNode>(), ref createdNodes, ref updatedNodes, ref deletedNodes); } unitOfWork.Commit(); // Fire events. Events.RootEvents.Instance.OnTagCreated(newTags); foreach (var node in createdNodes) { Events.SitemapEvents.Instance.OnSitemapNodeCreated(node); } foreach (var node in updatedNodes) { Events.SitemapEvents.Instance.OnSitemapNodeUpdated(node); } foreach (var node in deletedNodes) { Events.SitemapEvents.Instance.OnSitemapNodeDeleted(node); } if (isNew) { Events.SitemapEvents.Instance.OnSitemapCreated(sitemap); } else { Events.SitemapEvents.Instance.OnSitemapUpdated(sitemap); } return new PutSitemapResponse { Data = sitemap.Id }; }
/// <summary> /// Puts the sitemap specified in request. /// </summary> /// <param name="request">The request.</param> /// <returns> /// <c>PutSitemapsResponse</c> with updated sitemap data. /// </returns> public PutSitemapResponse Put(PutSitemapRequest request) { IEnumerable <SitemapNode> nodesFuture = null; if (request.Data.Nodes != null) { nodesFuture = repository.AsQueryable <SitemapNode>() .Where(node => node.Sitemap.Id == request.Id && !node.IsDeleted) .FetchMany(node => node.Translations) .ToFuture(); } var sitemap = repository.AsQueryable <Module.Pages.Models.Sitemap>(e => e.Id == request.Id.GetValueOrDefault()) .FetchMany(f => f.AccessRules) .ToFuture() .ToList() .FirstOrDefault(); var isNew = sitemap == null; if (isNew) { sitemap = new Module.Pages.Models.Sitemap { Id = request.Id.GetValueOrDefault(), AccessRules = new List <AccessRule>() }; } else if (request.Data.Version > 0) { sitemap.Version = request.Data.Version; } if (cmsConfiguration.Security.AccessControlEnabled) { accessControlService.DemandAccess(sitemap, securityService.GetCurrentPrincipal(), AccessLevel.ReadWrite); } unitOfWork.BeginTransaction(); if (!isNew) { sitemapService.ArchiveSitemap(sitemap.Id); } sitemap.Title = request.Data.Title; IList <Tag> newTags = null; if (request.Data.Tags != null) { tagService.SaveTags(sitemap, request.Data.Tags, out newTags); } if (request.Data.AccessRules != null) { sitemap.AccessRules.RemoveDuplicateEntities(); var accessRules = request.Data.AccessRules.Select( r => (IAccessRule) new AccessRule { AccessLevel = (AccessLevel)(int)r.AccessLevel, Identity = r.Identity, IsForRole = r.IsForRole }) .ToList(); accessControlService.UpdateAccessControl(sitemap, accessRules); } repository.Save(sitemap); var createdNodes = (IList <SitemapNode>) new List <SitemapNode>(); var updatedNodes = (IList <SitemapNode>) new List <SitemapNode>(); var deletedNodes = (IList <SitemapNode>) new List <SitemapNode>(); if (request.Data.Nodes != null) { SaveNodes(sitemap, request.Data.Nodes, nodesFuture != null ? nodesFuture.ToList() : new List <SitemapNode>(), ref createdNodes, ref updatedNodes, ref deletedNodes); } unitOfWork.Commit(); // Fire events. Events.RootEvents.Instance.OnTagCreated(newTags); foreach (var node in createdNodes) { Events.SitemapEvents.Instance.OnSitemapNodeCreated(node); } foreach (var node in updatedNodes) { Events.SitemapEvents.Instance.OnSitemapNodeUpdated(node); } foreach (var node in deletedNodes) { Events.SitemapEvents.Instance.OnSitemapNodeDeleted(node); } if (isNew) { Events.SitemapEvents.Instance.OnSitemapCreated(sitemap); } else { Events.SitemapEvents.Instance.OnSitemapUpdated(sitemap); } return(new PutSitemapResponse { Data = sitemap.Id }); }