diff --git a/Oqtane.Server/Pages/Sitemap.cshtml.cs b/Oqtane.Server/Pages/Sitemap.cshtml.cs index 16fb3299..7a7684c1 100644 --- a/Oqtane.Server/Pages/Sitemap.cshtml.cs +++ b/Oqtane.Server/Pages/Sitemap.cshtml.cs @@ -6,6 +6,7 @@ using System.Xml; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Oqtane.Enums; using Oqtane.Infrastructure; @@ -28,8 +29,9 @@ namespace Oqtane.Pages private readonly IUserPermissions _userPermissions; private readonly ILogManager _logger; private readonly Alias _alias; + private readonly IMemoryCache _memoryCache; - public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, ISettingRepository settings, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager) + public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, ISettingRepository settings, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager, IMemoryCache memoryCache) { _serviceProvider = serviceProvider; _pages = pages; @@ -39,77 +41,83 @@ namespace Oqtane.Pages _userPermissions = userPermissions; _logger = logger; _alias = tenantManager.GetAlias(); + _memoryCache = memoryCache; } public IActionResult OnGet() { - var sitemap = new List(); - - // build site map - var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); - var pageModules = _pageModules.GetPageModules(_alias.SiteId); - foreach (var page in _pages.GetPages(_alias.SiteId)) + if (!_memoryCache.TryGetValue("Sitemap", out string sitemapXml)) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) - { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); + var sitemap = new List(); - foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) + // build site map + var moduleDefinitions = _moduleDefinitions.GetModuleDefinitions(_alias.SiteId).ToList(); + var pageModules = _pageModules.GetPageModules(_alias.SiteId); + foreach (var page in _pages.GetPages(_alias.SiteId)) + { + if (_userPermissions.IsAuthorized(null, PermissionNames.View, page.PermissionList) && page.IsNavigation) { - if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + Utilities.NavigateUrl(_alias.Path, page.Path, ""), ModifiedOn = page.ModifiedOn }); + + foreach (var pageModule in pageModules.Where(item => item.PageId == page.PageId)) { - var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); - if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") + if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.PermissionList)) { - Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); - if (moduletype != null && moduletype.GetInterface("ISitemap") != null) + var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); + if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") { - try + Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); + if (moduletype != null && moduletype.GetInterface("ISitemap") != null) { - pageModule.Module.Settings = _settings.GetSettings(EntityNames.Module, pageModule.ModuleId).ToDictionary(x => x.SettingName, x => x.SettingValue); - var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); - var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); - foreach (var url in urls) + try { - sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); + pageModule.Module.Settings = _settings.GetSettings(EntityNames.Module, pageModule.ModuleId).ToDictionary(x => x.SettingName, x => x.SettingValue); + var moduleobject = ActivatorUtilities.CreateInstance(_serviceProvider, moduletype); + var urls = ((ISitemap)moduleobject).GetUrls(_alias.Path, page.Path, pageModule.Module); + foreach (var url in urls) + { + sitemap.Add(new Sitemap { Url = _alias.Protocol + _alias.Name + url.Url, ModifiedOn = url.ModifiedOn }); + } + } + catch (Exception ex) + { + _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); } - } - catch (Exception ex) - { - _logger.Log(LogLevel.Error, this, LogFunction.Other, ex, "Error Retrieving SiteMap For {Name} Module", moduleDefinition.Name); } } } } } } - } - // write XML - XmlWriterSettings settings = new XmlWriterSettings(); - settings.Indent = true; - settings.IndentChars = (" "); - settings.CloseOutput = true; - settings.OmitXmlDeclaration = true; - settings.WriteEndDocumentOnClose = true; + // write XML + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.IndentChars = (" "); + settings.CloseOutput = true; + settings.OmitXmlDeclaration = true; + settings.WriteEndDocumentOnClose = true; - StringBuilder builder = new StringBuilder(); - using (XmlWriter writer = XmlWriter.Create(builder, settings)) - { - writer.WriteStartDocument(); - writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); - - foreach (var url in sitemap) + StringBuilder builder = new StringBuilder(); + using (XmlWriter writer = XmlWriter.Create(builder, settings)) { - writer.WriteStartElement("url"); - writer.WriteElementString("loc", url.Url); - writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); - writer.WriteEndElement(); - } - writer.Close(); - } + writer.WriteStartDocument(); + writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); - return Content(builder.ToString()); + foreach (var url in sitemap) + { + writer.WriteStartElement("url"); + writer.WriteElementString("loc", url.Url); + writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); + writer.WriteEndElement(); + } + writer.Close(); + } + // Cache the sitemap XML + sitemapXml = builder.ToString(); + _memoryCache.Set("Sitemap", sitemapXml, TimeSpan.FromHours(1)); + } + return Content(sitemapXml, "application/xml"); } } }