Skip to content

Commit d68ae0c

Browse files
committed
Added abilityto save sitemap
1 parent daecaec commit d68ae0c

File tree

8 files changed

+67
-20
lines changed

8 files changed

+67
-20
lines changed

LinkDotNet.Blog.Web/Pages/Admin/Sitemap.razor

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
<div class="row">
66
<button class="btn btn-primary" @onclick="CreateSitemap">Create Sitemap</button>
77

8-
@if (urlSet != null)
8+
@if (sitemapUrlSet != null)
99
{
1010
<table class="table table-striped table-hover">
1111
<tbody>
1212
<tr>
1313
<th>Url</th>
1414
<th>Last Changed</th>
1515
</tr>
16-
@foreach (var url in urlSet.Urls)
16+
@foreach (var url in sitemapUrlSet.Urls)
1717
{
1818
<tr>
1919
<td>@url.Location</td>
@@ -26,10 +26,11 @@
2626
</div>
2727

2828
@code {
29-
private UrlSet urlSet;
29+
private SitemapUrlSet sitemapUrlSet;
3030

3131
private async Task CreateSitemap()
3232
{
33-
urlSet = await sitemapService.CreateSitemapAsync();
33+
sitemapUrlSet = await sitemapService.CreateSitemapAsync();
34+
await sitemapService.SaveSitemapToFileAsync(sitemapUrlSet);
3435
}
3536
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Threading.Tasks;
2+
3+
namespace LinkDotNet.Blog.Web.Shared.Services
4+
{
5+
public interface IXmlFileWriter
6+
{
7+
Task WriteObjectToXmlFileAsync<T>(T objectToSave, string fileName);
8+
}
9+
}

LinkDotNet.Blog.Web/Shared/Services/Sitemap/ISitemapService.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ namespace LinkDotNet.Blog.Web.Shared.Services.Sitemap
44
{
55
public interface ISitemapService
66
{
7-
Task<UrlSet> CreateSitemapAsync();
7+
Task<SitemapUrlSet> CreateSitemapAsync();
8+
9+
Task SaveSitemapToFileAsync(SitemapUrlSet sitemap);
810
}
911
}

LinkDotNet.Blog.Web/Shared/Services/Sitemap/SitemapService.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,48 +12,56 @@ public class SitemapService : ISitemapService
1212
{
1313
private readonly IRepository<BlogPost> repository;
1414
private readonly NavigationManager navigationManager;
15+
private readonly IXmlFileWriter xmlFileWriter;
1516

1617
public SitemapService(
1718
IRepository<BlogPost> repository,
18-
NavigationManager navigationManager)
19+
NavigationManager navigationManager,
20+
IXmlFileWriter xmlFileWriter)
1921
{
2022
this.repository = repository;
2123
this.navigationManager = navigationManager;
24+
this.xmlFileWriter = xmlFileWriter;
2225
}
2326

24-
public async Task<UrlSet> CreateSitemapAsync()
27+
public async Task<SitemapUrlSet> CreateSitemapAsync()
2528
{
2629
const string sitemapNamespace = "http://www.sitemaps.org/schemas/sitemap/0.9";
27-
var urlSet = new UrlSet
30+
var urlSet = new SitemapUrlSet
2831
{
2932
Namespace = sitemapNamespace,
3033
};
3134

3235
var blogPosts = (await repository.GetAllAsync(f => f.IsPublished, b => b.UpdatedDate)).ToList();
3336

34-
urlSet.Urls.Add(new Url { Location = navigationManager.BaseUri });
37+
urlSet.Urls.Add(new SitemapUrl { Location = navigationManager.BaseUri });
3538
urlSet.Urls.AddRange(CreateUrlsForBlogPosts(blogPosts));
3639
urlSet.Urls.AddRange(CreateUrlsForTags(blogPosts));
3740

3841
return urlSet;
3942
}
4043

41-
private IEnumerable<Url> CreateUrlsForBlogPosts(IEnumerable<BlogPost> blogPosts)
44+
public async Task SaveSitemapToFileAsync(SitemapUrlSet sitemap)
4245
{
43-
return blogPosts.Select(b => new Url
46+
await xmlFileWriter.WriteObjectToXmlFileAsync(sitemap, "sitemap.xml");
47+
}
48+
49+
private IEnumerable<SitemapUrl> CreateUrlsForBlogPosts(IEnumerable<BlogPost> blogPosts)
50+
{
51+
return blogPosts.Select(b => new SitemapUrl
4452
{
4553
Location = $"{navigationManager.BaseUri}blogPosts/{b.Id}",
4654
LastModified = b.UpdatedDate.ToString("yyyy-MM-dd"),
4755
}).ToList();
4856
}
4957

50-
private IEnumerable<Url> CreateUrlsForTags(IEnumerable<BlogPost> blogPosts)
58+
private IEnumerable<SitemapUrl> CreateUrlsForTags(IEnumerable<BlogPost> blogPosts)
5159
{
5260
return blogPosts
5361
.SelectMany(b => b.Tags)
5462
.Select(t => t.Content)
5563
.Distinct()
56-
.Select(t => new Url
64+
.Select(t => new SitemapUrl
5765
{
5866
Location = $"{navigationManager.BaseUri}searchByTag/{Uri.EscapeDataString(t)}",
5967
});

LinkDotNet.Blog.Web/Shared/Services/Sitemap/Url.cs renamed to LinkDotNet.Blog.Web/Shared/Services/Sitemap/SitemapUrl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace LinkDotNet.Blog.Web.Shared.Services.Sitemap
44
{
55
[XmlRoot(ElementName="url")]
6-
public class Url
6+
public class SitemapUrl
77
{
88
[XmlElement(ElementName="loc")]
99
public string Location { get; set; }

LinkDotNet.Blog.Web/Shared/Services/Sitemap/UrlSet.cs renamed to LinkDotNet.Blog.Web/Shared/Services/Sitemap/SitemapUrlSet.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
namespace LinkDotNet.Blog.Web.Shared.Services.Sitemap
55
{
66
[XmlRoot(ElementName="urlset")]
7-
public class UrlSet
7+
public class SitemapUrlSet
88
{
99
[XmlElement(ElementName = "url")]
10-
public List<Url> Urls { get; set; } = new();
10+
public List<SitemapUrl> Urls { get; set; } = new();
1111

1212
[XmlAttribute(AttributeName="xmlns")]
1313
public string Namespace { get; set; }
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.IO;
2+
using System.Threading.Tasks;
3+
using System.Xml;
4+
using System.Xml.Serialization;
5+
6+
namespace LinkDotNet.Blog.Web.Shared.Services
7+
{
8+
public class XmlFileWriter : IXmlFileWriter
9+
{
10+
public async Task WriteObjectToXmlFileAsync<T>(T objectToSave, string fileName)
11+
{
12+
await using var file = File.Create(fileName);
13+
await using var xmlWriter = XmlWriter.Create(file, new XmlWriterSettings { Indent = true });
14+
var serializer = new XmlSerializer(typeof(T));
15+
serializer.Serialize(xmlWriter, objectToSave);
16+
xmlWriter.Close();
17+
file.Close();
18+
}
19+
}
20+
}

LinkDotNet.Blog.Web/Startup.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using LinkDotNet.Blog.Web.Pages.Admin;
55
using LinkDotNet.Blog.Web.RegistrationExtensions;
66
using LinkDotNet.Blog.Web.Shared.Services;
7+
using LinkDotNet.Blog.Web.Shared.Services.Sitemap;
78
using Microsoft.AspNetCore.Builder;
89
using Microsoft.AspNetCore.Hosting;
910
using Microsoft.Extensions.Configuration;
@@ -44,10 +45,7 @@ public void ConfigureServices(IServiceCollection services)
4445

4546
services.AddBlazoredToast();
4647
services.AddHeadElementHelper();
47-
services.AddScoped<ILocalStorageService, LocalStorageService>();
48-
services.AddSingleton<ISortOrderCalculator, SortOrderCalculator>();
49-
services.AddScoped<IUserRecordService, UserRecordService>();
50-
services.AddScoped<IDashboardService, DashboardService>();
48+
RegisterServices(services);
5149
}
5250

5351
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
@@ -79,5 +77,14 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
7977
endpoints.MapFallbackToPage("/_Host");
8078
});
8179
}
80+
81+
private static void RegisterServices(IServiceCollection services)
82+
{
83+
services.AddScoped<ILocalStorageService, LocalStorageService>();
84+
services.AddSingleton<ISortOrderCalculator, SortOrderCalculator>();
85+
services.AddScoped<IUserRecordService, UserRecordService>();
86+
services.AddScoped<IDashboardService, DashboardService>();
87+
services.AddScoped<ISitemapService, SitemapService>();
88+
}
8289
}
8390
}

0 commit comments

Comments
 (0)