diff --git a/src/Pilgaard.Blog/Features/Feed/FeedApi.cs b/src/Pilgaard.Blog/Features/Feed/FeedApi.cs index 03af652..be7c9ab 100644 --- a/src/Pilgaard.Blog/Features/Feed/FeedApi.cs +++ b/src/Pilgaard.Blog/Features/Feed/FeedApi.cs @@ -1,8 +1,8 @@ using Microsoft.SyndicationFeed; -using System.Xml; using Microsoft.SyndicationFeed.Atom; using Pilgaard.Blog.Features.BlogPost; using Pilgaard.Blog.Features.SEO; +using System.Xml; namespace Pilgaard.Blog.Features.Feed; @@ -10,7 +10,7 @@ public static class FeedApi { public static WebApplication MapRssFeed(this WebApplication app) { - app.MapGet("/feed.xml", async (HttpContext context) => + app.MapGet(FeedConstants.FeedRoute, async (HttpContext context) => { context.Response.ContentType = "application/xml"; @@ -24,40 +24,9 @@ public static WebApplication MapRssFeed(this WebApplication app) var writer = new AtomFeedWriter(xmlWriter); - await writer.WriteTitle(DefaultMetadata.Title); - - var lastUpdated = BlogPostData - .AllBlogPostSeries - .SelectMany(blogPostSeries => blogPostSeries.BlogPosts.Select(blogPost => blogPost.LastUpdated)) - .Max(); + await WriteHeader(writer); - await writer.WriteUpdated(lastUpdated); - await writer.Write(new SyndicationLink(new Uri(FeedConstants.BlogUrl))); - - foreach (var blogPostSeries in BlogPostData.AllBlogPostSeries) - { - foreach (var blogPost in blogPostSeries.BlogPosts) - { - var link = $"{FeedConstants.BlogUrl}/{blogPostSeries.GetRelativePath(blogPost)}"; - var item = new SyndicationItem - { - Id = link, - Title = blogPost.Title, - Description = blogPost.Description, - Published = blogPost.PublishDate, - LastUpdated = blogPost.LastUpdated, - }; - - item.AddLink(new SyndicationLink(new Uri(link))); - item.AddContributor(new SyndicationPerson("Niels Pilgaard Grøndahl", "niels.pilgaard@hotmail.com")); - foreach (var blogPostTag in blogPost.Tags) - { - item.AddCategory(new SyndicationCategory(blogPostTag)); - } - - await writer.Write(item); - } - } + await WriteBody(writer); // This closes the element await xmlWriter.WriteEndElementAsync(); @@ -69,4 +38,47 @@ public static WebApplication MapRssFeed(this WebApplication app) return app; } + + private static async Task WriteBody(ISyndicationFeedWriter writer) + { + foreach (var blogPostSeries in BlogPostData.AllBlogPostSeries) + { + foreach (var blogPost in blogPostSeries.BlogPosts) + { + var link = $"{FeedConstants.BlogUrl}/{blogPostSeries.GetRelativePath(blogPost)}"; + var item = new SyndicationItem + { + Id = link, + Title = blogPost.Title, + Description = blogPost.Description, + Published = blogPost.PublishDate, + LastUpdated = blogPost.LastUpdated, + }; + + item.AddLink(new SyndicationLink(new Uri(link))); + item.AddContributor(new SyndicationPerson("Niels Pilgaard Grøndahl", "niels.pilgaard@hotmail.com")); + foreach (var blogPostTag in blogPost.Tags) + { + item.AddCategory(new SyndicationCategory(blogPostTag)); + } + + await writer.Write(item); + } + } + } + + private static async Task WriteHeader(AtomFeedWriter writer) + { + await writer.WriteTitle(DefaultMetadata.Title); + + var lastUpdated = BlogPostData + .AllBlogPostSeries + .SelectMany(blogPostSeries => blogPostSeries.BlogPosts.Select(blogPost => blogPost.LastUpdated)) + .Max(); + + await writer.WriteUpdated(lastUpdated); + await writer.WriteId(FeedConstants.FeedUrl); + await writer.Write(new SyndicationLink(new Uri(FeedConstants.FeedUrl), "self")); + await writer.Write(new SyndicationLink(new Uri(FeedConstants.BlogUrl), "alternate")); + } } \ No newline at end of file diff --git a/src/Pilgaard.Blog/Features/Feed/FeedConstants.cs b/src/Pilgaard.Blog/Features/Feed/FeedConstants.cs index 43597f2..8d70e14 100644 --- a/src/Pilgaard.Blog/Features/Feed/FeedConstants.cs +++ b/src/Pilgaard.Blog/Features/Feed/FeedConstants.cs @@ -3,4 +3,6 @@ internal static class FeedConstants { internal const string BlogUrl = "https://pilgaard-blog.azurewebsites.net"; + internal const string FeedRoute = "/feed.xml"; + internal const string FeedUrl = BlogUrl + FeedRoute; } \ No newline at end of file