-
Notifications
You must be signed in to change notification settings - Fork 543
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add sitemap generator which outputs all public pages and also include…
…s an ISitemap interface for modules
- Loading branch information
Showing
7 changed files
with
160 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
using System.Collections.Generic; | ||
using Oqtane.Models; | ||
|
||
namespace Oqtane.Modules | ||
{ | ||
public interface ISitemap | ||
{ | ||
// You Must Set The "ServerManagerType" In Your IModule Interface | ||
|
||
List<Sitemap> GetUrls(string alias, string path, Module module); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
@page "/pages/sitemap.xml" | ||
@namespace Oqtane.Pages | ||
@model Oqtane.Pages.SitemapModel |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Text; | ||
using System.Xml; | ||
using Microsoft.AspNetCore.Authorization; | ||
using Microsoft.AspNetCore.Mvc; | ||
using Microsoft.AspNetCore.Mvc.RazorPages; | ||
using Microsoft.Extensions.DependencyInjection; | ||
using Oqtane.Enums; | ||
using Oqtane.Infrastructure; | ||
using Oqtane.Models; | ||
using Oqtane.Modules; | ||
using Oqtane.Repository; | ||
using Oqtane.Security; | ||
using Oqtane.Shared; | ||
|
||
namespace Oqtane.Pages | ||
{ | ||
[AllowAnonymous] | ||
public class SitemapModel : PageModel | ||
{ | ||
private readonly IServiceProvider _serviceProvider; | ||
private readonly IPageRepository _pages; | ||
private readonly IPageModuleRepository _pageModules; | ||
private readonly IModuleDefinitionRepository _moduleDefinitions; | ||
private readonly IUserPermissions _userPermissions; | ||
private readonly ILogManager _logger; | ||
private readonly Alias _alias; | ||
|
||
public SitemapModel(IServiceProvider serviceProvider, IPageRepository pages, IPageModuleRepository pageModules, IModuleDefinitionRepository moduleDefinitions, IUserPermissions userPermissions, IUrlMappingRepository urlMappings, ISyncManager syncManager, ILogManager logger, ITenantManager tenantManager) | ||
{ | ||
_serviceProvider = serviceProvider; | ||
_pages = pages; | ||
_pageModules = pageModules; | ||
_moduleDefinitions = moduleDefinitions; | ||
_userPermissions = userPermissions; | ||
_logger = logger; | ||
_alias = tenantManager.GetAlias(); | ||
} | ||
|
||
public IActionResult OnGet() | ||
{ | ||
var sitemap = new List<Sitemap>(); | ||
|
||
// 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.Permissions)) | ||
{ | ||
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)) | ||
{ | ||
if (_userPermissions.IsAuthorized(null, PermissionNames.View, pageModule.Module.Permissions)) | ||
{ | ||
var moduleDefinition = moduleDefinitions.Where(item => item.ModuleDefinitionName == pageModule.Module.ModuleDefinitionName).FirstOrDefault(); | ||
if (moduleDefinition != null && moduleDefinition.ServerManagerType != "") | ||
{ | ||
Type moduletype = Type.GetType(moduleDefinition.ServerManagerType); | ||
if (moduletype != null && moduletype.GetInterface("ISitemap") != null) | ||
{ | ||
try | ||
{ | ||
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); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
// 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) | ||
{ | ||
writer.WriteStartElement("url"); | ||
writer.WriteElementString("loc", url.Url); | ||
writer.WriteElementString("lastmod", url.ModifiedOn.ToString("yyyy-MM-dd")); | ||
writer.WriteEndElement(); | ||
} | ||
writer.Close(); | ||
} | ||
|
||
return Content(builder.ToString()); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
using System; | ||
|
||
namespace Oqtane.Models | ||
{ | ||
/// <summary> | ||
/// Describes a Sitemap | ||
/// </summary> | ||
public class Sitemap | ||
{ | ||
/// <summary> | ||
/// Url | ||
/// </summary> | ||
public string Url { get; set; } | ||
|
||
/// <summary> | ||
/// Url | ||
/// </summary> | ||
public DateTime ModifiedOn { get; set; } | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters