Example #1
0
        /// <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
            });
        }
Example #2
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
            });
        }