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