🐛 Fix sitemap and rss still respond all types of posts

This commit is contained in:
2025-11-22 18:55:29 +08:00
parent 9b26a2a7eb
commit aeef16495f
2 changed files with 42 additions and 29 deletions

View File

@@ -9,7 +9,10 @@ using Microsoft.AspNetCore.Mvc;
namespace DysonNetwork.Zone.SEO; namespace DysonNetwork.Zone.SEO;
[ApiController] [ApiController]
public class RssController(PostService.PostServiceClient postClient, MarkdownConverter markdownConverter) : ControllerBase public class RssController(
PostService.PostServiceClient postClient,
MarkdownConverter markdownConverter
) : ControllerBase
{ {
[HttpGet("rss")] [HttpGet("rss")]
[Produces("application/rss+xml")] [Produces("application/rss+xml")]
@@ -29,9 +32,11 @@ public class RssController(PostService.PostServiceClient postClient, MarkdownCon
{ {
OrderBy = "date", OrderBy = "date",
OrderDesc = true, OrderDesc = true,
PageSize = 20 // Get top 20 recent posts PageSize = 20, // Get top 20 recent posts
}; };
request.Types_.Add(Shared.Proto.PostType.Article);
var response = await postClient.ListPostsAsync(request); var response = await postClient.ListPostsAsync(request);
if (response?.Posts != null) if (response?.Posts != null)
@@ -43,15 +48,18 @@ public class RssController(PostService.PostServiceClient postClient, MarkdownCon
var item = new SyndicationItem( var item = new SyndicationItem(
post.Title, post.Title,
post.Content is not null ? markdownConverter.ToHtml(post.Content!) : "No content", // Convert Markdown to HTML post.Content is not null
? markdownConverter.ToHtml(post.Content!)
: "No content", // Convert Markdown to HTML
new Uri(postUrl), new Uri(postUrl),
post.Id.ToString(), post.Id.ToString(),
post.EditedAt?.ToDateTimeOffset() ?? post.EditedAt?.ToDateTimeOffset()
post.PublishedAt?.ToDateTimeOffset() ?? post.CreatedAt.ToDateTimeOffset() ?? post.PublishedAt?.ToDateTimeOffset()
?? post.CreatedAt.ToDateTimeOffset()
) )
{ {
PublishDate = post.PublishedAt?.ToDateTimeOffset() ?? PublishDate =
post.CreatedAt.ToDateTimeOffset() // Use CreatedAt for publish date post.PublishedAt?.ToDateTimeOffset() ?? post.CreatedAt.ToDateTimeOffset(), // Use CreatedAt for publish date
}; };
items.Add(item); items.Add(item);
@@ -61,7 +69,10 @@ public class RssController(PostService.PostServiceClient postClient, MarkdownCon
feed.Items = items; feed.Items = items;
await using var sw = new StringWriter(); await using var sw = new StringWriter();
await using var reader = XmlWriter.Create(sw, new XmlWriterSettings { Indent = true, Async = true }); await using var reader = XmlWriter.Create(
sw,
new XmlWriterSettings { Indent = true, Async = true }
);
var formatter = new Rss20FeedFormatter(feed); var formatter = new Rss20FeedFormatter(feed);
formatter.WriteTo(reader); formatter.WriteTo(reader);
@@ -69,4 +80,5 @@ public class RssController(PostService.PostServiceClient postClient, MarkdownCon
return Content(sw.ToString(), "application/rss+xml"); return Content(sw.ToString(), "application/rss+xml");
} }
} }

View File

@@ -7,10 +7,7 @@ using SimpleMvcSitemap;
namespace DysonNetwork.Zone.SEO; namespace DysonNetwork.Zone.SEO;
[ApiController] [ApiController]
public class SitemapController( public class SitemapController(AppDatabase db, PostService.PostServiceClient postClient)
AppDatabase db,
PostService.PostServiceClient postClient
)
: ControllerBase : ControllerBase
{ {
[HttpGet("sitemap.xml")] [HttpGet("sitemap.xml")]
@@ -19,25 +16,26 @@ public class SitemapController(
var nodes = new List<SitemapNode> var nodes = new List<SitemapNode>
{ {
// Add static pages // Add static pages
new("/") new("/") { ChangeFrequency = ChangeFrequency.Weekly, Priority = 1.0m },
{ ChangeFrequency = ChangeFrequency.Weekly, Priority = 1.0m }, new("/about") { ChangeFrequency = ChangeFrequency.Monthly, Priority = 0.8m },
new("/about") new("/posts") { ChangeFrequency = ChangeFrequency.Daily, Priority = 0.9m },
{ ChangeFrequency = ChangeFrequency.Monthly, Priority = 0.8m },
new("/posts")
{ ChangeFrequency = ChangeFrequency.Daily, Priority = 0.9m }
}; };
// Add dynamic posts // Add dynamic posts
var allPosts = await GetAllPosts(); var allPosts = await GetAllPosts();
nodes.AddRange(allPosts.Select(post => nodes.AddRange(
{ allPosts.Select(post =>
var uri = post.AsUrl(Request.Host.ToString(), Request.Scheme);
return new SitemapNode(uri)
{ {
LastModificationDate = post.EditedAt?.ToDateTimeUtc() ?? post.CreatedAt.ToDateTimeUtc(), var uri = post.AsUrl(Request.Host.ToString(), Request.Scheme);
ChangeFrequency = ChangeFrequency.Monthly, Priority = 0.7m return new SitemapNode(uri)
}; {
})); LastModificationDate =
post.EditedAt?.ToDateTimeUtc() ?? post.CreatedAt.ToDateTimeUtc(),
ChangeFrequency = ChangeFrequency.Monthly,
Priority = 0.7m,
};
})
);
return new SitemapProvider().CreateSitemap(new SitemapModel(nodes)); return new SitemapProvider().CreateSitemap(new SitemapModel(nodes));
} }
@@ -55,9 +53,11 @@ public class SitemapController(
OrderBy = "date", OrderBy = "date",
OrderDesc = true, OrderDesc = true,
PageSize = pageSize, PageSize = pageSize,
PageToken = pageToken ?? string.Empty PageToken = pageToken ?? string.Empty,
}; };
request.Types_.Add(Shared.Proto.PostType.Article);
var response = await postClient.ListPostsAsync(request); var response = await postClient.ListPostsAsync(request);
if (response?.Posts != null) if (response?.Posts != null)
@@ -71,4 +71,5 @@ public class SitemapController(
return allPosts; return allPosts;
} }
} }