Esempio n. 1
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 };
        }
Esempio n. 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
            });
        }