示例#1
0
        /// <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);
            }
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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 };
        }
示例#4
0
        /// <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
            });
        }