Skip to content

Commit

Permalink
Merge pull request #2606 from sbwalker/dev
Browse files Browse the repository at this point in the history
add sitemap generator which outputs all public pages and also includes an ISitemap interface for modules
  • Loading branch information
sbwalker authored Feb 20, 2023
2 parents d1d00e6 + 8c6c66f commit da48ca8
Show file tree
Hide file tree
Showing 7 changed files with 160 additions and 8 deletions.
7 changes: 1 addition & 6 deletions Oqtane.Client/Modules/ModuleBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -190,12 +190,7 @@ public string ImageUrl(int fileid, int width, int height, string mode, string po

public string AddUrlParameters(params object[] parameters)
{
var url = "";
for (var i = 0; i < parameters.Length; i++)
{
url += "/" + parameters[i].ToString();
}
return url;
return Utilities.AddUrlParameters(parameters);
}

// template is in the form of a standard route template ie. "/{id}/{name}" and produces dictionary of key/value pairs
Expand Down
4 changes: 2 additions & 2 deletions Oqtane.Server/Modules/IPortable.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
using Oqtane.Models;
using Oqtane.Models;

namespace Oqtane.Modules
{
public interface IPortable
{
// You Must Set The "ServerAssemblyName" In Your IModule Interface
// You Must Set The "ServerManagerType" In Your IModule Interface

string ExportModule(Module module);

Expand Down
12 changes: 12 additions & 0 deletions Oqtane.Server/Modules/ISitemap.cs
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);
}
}
3 changes: 3 additions & 0 deletions Oqtane.Server/Pages/Sitemap.cshtml
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
112 changes: 112 additions & 0 deletions Oqtane.Server/Pages/Sitemap.cshtml.cs
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());
}
}
}
20 changes: 20 additions & 0 deletions Oqtane.Shared/Models/Sitemap.cs
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; }
}
}
10 changes: 10 additions & 0 deletions Oqtane.Shared/Shared/Utilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,16 @@ public static string TenantUrl(Alias alias, string url)
return $"{alias?.BaseUrl}{url}";
}

public static string AddUrlParameters(params object[] parameters)
{
var url = "";
for (var i = 0; i < parameters.Length; i++)
{
url += "/" + parameters[i].ToString();
}
return url;
}

public static string FormatContent(string content, Alias alias, string operation)
{
var aliasUrl = (alias != null && !string.IsNullOrEmpty(alias.Path)) ? "/" + alias.Path : "";
Expand Down

0 comments on commit da48ca8

Please sign in to comment.