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