2024-04-12 19:31:56 -05:00
|
|
|
using System.ServiceModel.Syndication;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Xml;
|
|
|
|
|
using System.Xml.Linq;
|
|
|
|
|
|
2024-04-02 15:35:57 -05:00
|
|
|
var builder = WebApplication.CreateBuilder(args);
|
|
|
|
|
|
2024-04-10 01:28:38 -05:00
|
|
|
builder.Services.ConfigureOptions<FilePostServiceOptionsSetup>();
|
|
|
|
|
builder.Services.AddSingleton<IFileSystem, FileSystem>();
|
|
|
|
|
builder.Services.AddScoped<IPostService, FilePostService>();
|
|
|
|
|
|
2024-04-03 12:02:00 -05:00
|
|
|
builder.Services
|
|
|
|
|
.AddRazorComponents()
|
|
|
|
|
.AddInteractiveServerComponents();
|
2024-04-02 15:35:57 -05:00
|
|
|
|
|
|
|
|
var app = builder.Build();
|
|
|
|
|
|
2024-04-03 12:02:00 -05:00
|
|
|
if (app.Environment.IsProduction())
|
2024-04-02 15:35:57 -05:00
|
|
|
{
|
2024-04-03 12:02:00 -05:00
|
|
|
app.UseExceptionHandler("/Error", createScopeForErrors: true);
|
|
|
|
|
app.UseHsts();
|
2024-04-02 15:35:57 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
app.UseHttpsRedirection();
|
|
|
|
|
|
|
|
|
|
app.UseStaticFiles();
|
|
|
|
|
app.UseAntiforgery();
|
|
|
|
|
|
2024-04-12 19:31:56 -05:00
|
|
|
app.UseStatusCodePagesWithRedirects("/Error/{0}");
|
|
|
|
|
|
|
|
|
|
app
|
|
|
|
|
.MapGet("/rss", async (HttpContext context, IPostService postService) =>
|
|
|
|
|
{
|
|
|
|
|
var req = context.Request;
|
|
|
|
|
var url = $"{req.Scheme}://{req.Host}{req.PathBase}";
|
|
|
|
|
|
|
|
|
|
var posts = await postService.GetPostsAsync();
|
|
|
|
|
|
|
|
|
|
var items = posts.Select(post =>
|
|
|
|
|
{
|
|
|
|
|
var uri = new Uri($"{url}/{post.Slug}");
|
|
|
|
|
|
|
|
|
|
var item = new SyndicationItem(
|
|
|
|
|
post.Title,
|
|
|
|
|
post.Lead,
|
|
|
|
|
uri,
|
|
|
|
|
post.Slug,
|
|
|
|
|
post.PublishedAt
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return item;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var feed = new SyndicationFeed(
|
|
|
|
|
"journal",
|
|
|
|
|
"A blog by Stevan Freeborn",
|
|
|
|
|
new Uri(url)
|
|
|
|
|
)
|
|
|
|
|
{
|
|
|
|
|
Items = items,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
XNamespace atom = "http://www.w3.org/2005/Atom";
|
|
|
|
|
feed.ElementExtensions.Add(
|
|
|
|
|
new XElement(atom + "link",
|
|
|
|
|
new XAttribute("href", url + "/rss"),
|
|
|
|
|
new XAttribute("rel", "self"),
|
|
|
|
|
new XAttribute("type", "application/rss+xml")
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
var settings = new XmlWriterSettings
|
|
|
|
|
{
|
|
|
|
|
Encoding = Encoding.UTF8,
|
|
|
|
|
NewLineHandling = NewLineHandling.Entitize,
|
|
|
|
|
Indent = true,
|
|
|
|
|
Async = true,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
using var stream = new MemoryStream();
|
|
|
|
|
using var writer = XmlWriter.Create(stream, settings);
|
|
|
|
|
|
|
|
|
|
var rssFormatter = new Rss20FeedFormatter(feed, false);
|
|
|
|
|
rssFormatter.WriteTo(writer);
|
|
|
|
|
await writer.FlushAsync();
|
|
|
|
|
|
|
|
|
|
return Results.File(stream.ToArray(), "application/xml");
|
|
|
|
|
})
|
|
|
|
|
.WithDisplayName("RSS Feed")
|
|
|
|
|
.WithDescription("RSS feed for the blog");
|
|
|
|
|
|
2024-04-03 12:02:00 -05:00
|
|
|
app
|
|
|
|
|
.MapRazorComponents<App>()
|
|
|
|
|
.AddInteractiveServerRenderMode();
|
2024-04-02 15:35:57 -05:00
|
|
|
|
2024-04-10 01:28:38 -05:00
|
|
|
|
2024-04-08 23:34:32 -05:00
|
|
|
app.Run();
|
|
|
|
|
|
2024-04-10 01:28:38 -05:00
|
|
|
public partial class Program { }
|