Files
blog.stevanfreeborn.com/src/Blog/Program.cs
T

98 lines
2.3 KiB
C#
Raw Normal View History

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
2024-04-12 19:33:56 -05:00
.MapGet("/rss", async (HttpContext context, IPostService postService) =>
2024-04-12 19:31:56 -05:00
{
var req = context.Request;
var scheme = req.Headers["X-Forwarded-Proto"].FirstOrDefault() ?? req.Scheme;
var host = req.Headers["X-Forwarded-Host"].FirstOrDefault() ?? req.Host.Value;
var url = $"{scheme}://{host}{req.PathBase}";
2024-04-12 19:33:56 -05:00
2024-04-12 19:31:56 -05:00
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 { }