/// <summary> /// Puts the specified request. /// </summary> /// <param name="request">The request.</param> /// <returns> /// <c>PutNodeResponse</c> with create or updated node id. /// </returns> public PutNodeResponse Put(PutNodeRequest request) { var sitemapFuture = repository.AsQueryable <Module.Pages.Models.Sitemap>(e => e.Id == request.SitemapId) .FetchMany(f => f.AccessRules) .ToFuture(); var node = repository.AsQueryable <SitemapNode>(e => e.Sitemap.Id == request.SitemapId && e.Id == request.Id) .FetchMany(n => n.Translations) .ToFuture() .ToList() .FirstOrDefault(); var sitemap = sitemapFuture.ToList().FirstOne(); if (cmsConfiguration.Security.AccessControlEnabled) { accessControlService.DemandAccess(sitemap, securityService.GetCurrentPrincipal(), AccessLevel.ReadWrite); } var isNew = node == null; if (isNew) { node = new SitemapNode { Id = request.Id.GetValueOrDefault(), Translations = new List <Module.Pages.Models.SitemapNodeTranslation>() }; } else if (request.Data.Version > 0) { node.Version = request.Data.Version; } unitOfWork.BeginTransaction(); sitemapService.ArchiveSitemap(sitemap.Id); node.Sitemap = sitemap; node.Title = request.Data.Title; if (request.Data.PageId.GetValueOrDefault() != default(Guid)) { node.Page = repository.AsProxy <PageProperties>(request.Data.PageId.GetValueOrDefault()); node.Url = null; node.UrlHash = null; } else { node.Page = null; node.Url = request.Data.Url; node.UrlHash = node.Url.UrlHash(); } node.ParentNode = request.Data.ParentId.GetValueOrDefault() != default(Guid) ? repository.AsProxy <SitemapNode>(request.Data.ParentId.GetValueOrDefault()) : null; node.DisplayOrder = request.Data.DisplayOrder; node.Macro = request.Data.Macro; node.UsePageTitleAsNodeTitle = request.Data.UsePageTitleAsNodeTitle; repository.Save(node); UpdateTranslations(node, request.Data); unitOfWork.Commit(); // Fire events. if (isNew) { Events.SitemapEvents.Instance.OnSitemapNodeCreated(node); } else { Events.SitemapEvents.Instance.OnSitemapNodeUpdated(node); } Events.SitemapEvents.Instance.OnSitemapUpdated(sitemap); return(new PutNodeResponse { Data = node.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 }); }