예제 #1
0
        public async Task <IActionResult> Create(string sitemapId, string sourceType)
        {
            if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageSitemaps))
            {
                return(Forbid());
            }

            var sitemap = await _sitemapManager.GetSitemapAsync(sitemapId);

            if (sitemap == null)
            {
                return(NotFound());
            }

            var source = _factories.FirstOrDefault(x => x.Name == sourceType)?.Create();

            if (source == null)
            {
                return(NotFound());
            }

            var model = new CreateSourceViewModel
            {
                SitemapId         = sitemapId,
                SitemapSource     = source,
                SitemapSourceId   = source.Id,
                SitemapSourceType = sourceType,
                Editor            = await _displayManager.BuildEditorAsync(source, updater : _updateModelAccessor.ModelUpdater, isNew : true)
            };

            model.Editor.SitemapSource = source;

            return(View(model));
        }
예제 #2
0
        public async Task <IActionResult> Display(string sitemapId)
        {
            if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageSitemaps))
            {
                return(Forbid());
            }

            var sitemap = await _sitemapManager.GetSitemapAsync(sitemapId);

            if (sitemap == null)
            {
                return(NotFound());
            }

            var items = new List <dynamic>();

            foreach (var source in sitemap.SitemapSources)
            {
                dynamic item = await _displayManager.BuildDisplayAsync(source, _updateModelAccessor.ModelUpdater, "SummaryAdmin");

                item.SitemapId     = sitemap.SitemapId;
                item.SitemapSource = source;
                items.Add(item);
            }

            var thumbnails = new Dictionary <string, dynamic>();

            foreach (var factory in _sourceFactories)
            {
                var     source    = factory.Create();
                dynamic thumbnail = await _displayManager.BuildDisplayAsync(source, _updateModelAccessor.ModelUpdater, "Thumbnail");

                thumbnail.SitemapSource     = source;
                thumbnail.SitemapSourceType = factory.Name;
                thumbnail.Sitemap           = sitemap;
                thumbnails.Add(factory.Name, thumbnail);
            }

            var model = new DisplaySitemapViewModel
            {
                Sitemap    = sitemap,
                Items      = items,
                Thumbnails = thumbnails,
            };

            return(View(model));
        }
        public async Task <IActionResult> Edit(string sitemapId)
        {
            if (!await _authorizationService.AuthorizeAsync(User, Permissions.ManageSitemaps))
            {
                return(Forbid());
            }

            var sitemap = (await _sitemapManager.GetSitemapAsync(sitemapId)) as SitemapIndex;

            if (sitemap == null)
            {
                return(NotFound());
            }

            var sitemaps = await _sitemapManager.GetSitemapsAsync();

            var indexSource = sitemap.SitemapSources.FirstOrDefault() as SitemapIndexSource;

            var containableSitemaps = sitemaps
                                      .Where(s => s.GetType() != typeof(SitemapIndex))
                                      .Select(s => new ContainableSitemapEntryViewModel
            {
                SitemapId = s.SitemapId,
                Name      = s.Name,
                IsChecked = indexSource.ContainedSitemapIds.Any(id => id == s.SitemapId)
            })
                                      .OrderBy(s => s.Name)
                                      .ToArray();

            var model = new EditSitemapIndexViewModel
            {
                SitemapId           = sitemap.SitemapId,
                Name                = sitemap.Name,
                Enabled             = sitemap.Enabled,
                Path                = sitemap.Path,
                SitemapIndexSource  = indexSource,
                ContainableSitemaps = containableSitemaps
            };

            return(View(model));
        }
예제 #4
0
        public async Task <IActionResult> Index(CancellationToken cancellationToken, string sitemapId)
        {
            var sitemap = await _sitemapManager.GetSitemapAsync(sitemapId);

            if (sitemap == null || !sitemap.Enabled)
            {
                return(NotFound());
            }

            var fileResolver = await _sitemapCacheProvider.GetCachedSitemapAsync(sitemap.Path);

            if (fileResolver != null)
            {
                // When multiple requests occur for the same sitemap it
                // may still be building, so we wait for it to complete.
                if (Workers.TryGetValue(sitemap.Path, out var writeTask))
                {
                    await writeTask.Value;
                }

                // File result will dispose of stream.
                var stream = await fileResolver.OpenReadStreamAsync();

                return(File(stream, "application/xml"));
            }
            else
            {
                var work = await Workers.GetOrAdd(sitemap.Path, x => new Lazy <Task <Stream> >(async() =>
                {
                    try
                    {
                        var siteSettings = await _siteService.GetSiteSettingsAsync();

                        var context = new SitemapBuilderContext()
                        {
                            HostPrefix = siteSettings.BaseUrl,
                            UrlHelper  = Url
                        };

                        var document = await _sitemapBuilder.BuildAsync(sitemap, context);

                        if (document == null)
                        {
                            return(null);
                        }

                        document.Declaration = new XDeclaration("1.0", "utf-8", null);

                        var stream = new MemoryStream();
                        await document.SaveAsync(stream, SaveOptions.None, cancellationToken);

                        if (stream.Length >= _errorLength)
                        {
                            _logger.LogError("Sitemap 50MB maximum length limit exceeded");
                        }
                        else if (stream.Length >= _warningLength)
                        {
                            _logger.LogWarning("Sitemap nearing 50MB length limit");
                        }

                        await _sitemapCacheProvider.SetSitemapCacheAsync(stream, sitemap.Path, cancellationToken);

                        return(stream);
                    }
                    finally
                    {
                        Workers.TryRemove(sitemap.Path, out var writeCacheTask);
                    }
                }, LazyThreadSafetyMode.ExecutionAndPublication)).Value;

                if (work == null)
                {
                    return(NotFound());
                }

                work.Position = 0;

                // File result will dispose of stream.
                return(File(work, "application/xml"));
            }
        }