zotan.pw-web/Controllers/JsonFeed.cs

53 lines
1.9 KiB
C#

using Microsoft.AspNetCore.Mvc;
using zotanpw.Pages.blog;
using J = System.Text.Json.Serialization.JsonPropertyNameAttribute;
namespace zotanpw.Controllers;
[ApiController, Route("/blog/feed.json")]
public class JsonFeed : Controller {
private static readonly JsonFeedObject Feedobj = new() {
Items = BlogModel.Posts.Take(10)
.Select(post => new JsonFeedItem(post.Shorthand, $"https://zotan.pw/blog/{post.Shorthand}", post.Title, post.Content,
post.PublishedOn.ToDateTime(TimeOnly.MinValue).ToString("yyyy-MM-ddT00:00:00Z")))
.ToList()
};
[HttpGet]
public JsonFeedObject Get() {
Response.ContentType = "application/json";
return Feedobj;
}
// Auto-generated JSON mapping
// ReSharper disable All
public class JsonFeedObject {
[J("version")] public string Version => "https://jsonfeed.org/version/1.1";
[J("language")] public string Language => "en";
[J("title")] public string Title => "zotan.pw >> blog";
[J("description")] public string Description => "Blog of a disabled neurodivergent queer person unhappy with the state of the world";
[J("home_page_url")] public string HomeUrl => "https://zotan.pw/blog";
[J("feed_url")] public string FeedUrl => "https://zotan.pw/blog/feed.json";
// TODO: favicon/icon
[J("items")] public List<JsonFeedItem> Items { get; init; } = new();
}
public class JsonFeedItem {
public JsonFeedItem(string id, string url, string title, string contentHtml, string datePublished) {
_id = id;
_url = url;
_title = title;
_contentHtml = contentHtml;
_datePublished = datePublished;
}
[J("id")] public string _id { get; }
[J("url")] public string _url { get; }
[J("title")] public string _title { get; }
[J("content_html")] public string _contentHtml { get; }
[J("date_published")] public string _datePublished { get; }
}
}