From 4cde4a28ba6fc0f491e1725cdd47bb8c3e80b047 Mon Sep 17 00:00:00 2001 From: Sven Date: Fri, 13 Mar 2026 19:16:56 +0100 Subject: [PATCH] fix: transform /rssapi response shape to match /news static page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The /news page template uses item.link, item.feedId, item.sourceUrl, and feedsRes.feeds — but the blogroll API returns item.url, item.blog.id, item.blog.siteUrl, and {items:[...]} respectively. Add a response-transformer middleware to the /rssapi alias router that: - maps url -> link on each item - maps blog.id -> feedId, blog.siteUrl -> sourceUrl on each item - renames items -> feeds for the /api/feeds endpoint Co-Authored-By: Claude Sonnet 4.6 --- .../patch-endpoint-blogroll-feeds-alias.mjs | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/scripts/patch-endpoint-blogroll-feeds-alias.mjs b/scripts/patch-endpoint-blogroll-feeds-alias.mjs index c0be0d87..f3949d3e 100644 --- a/scripts/patch-endpoint-blogroll-feeds-alias.mjs +++ b/scripts/patch-endpoint-blogroll-feeds-alias.mjs @@ -40,13 +40,42 @@ const patchSpecs = [ Indiekit.addEndpoint(this); // rssapi dual-mount alias: register the same public routes at /rssapi - // so the /news static page (which hardcodes /rssapi/api/*) also works - // alongside the /blogroll page (which hardcodes /blogrollapi/api/*). + // with a response-shape transformer so the /news static page works. + // The /news page expects: item.link (not .url), item.feedId (not .blog.id), + // item.sourceUrl (not .blog.siteUrl), and feedsRes.feeds (not .items). + const { Router } = require("express"); + const rssapiRouter = Router(); + rssapiRouter.use((req, res, next) => { + const originalJson = res.json.bind(res); + res.json = function (data) { + if (data && Array.isArray(data.items)) { + if (req.path.startsWith("/api/items")) { + // Map url->link, blog.id->feedId, blog.siteUrl->sourceUrl + data = { + ...data, + items: data.items.map((item) => ({ + ...item, + link: item.url, + feedId: item.blog?.id ?? null, + sourceUrl: item.blog?.siteUrl ?? null, + })), + }; + } else if (req.path === "/api/feeds") { + // Rename items->feeds so feedsRes.feeds resolves correctly + const { items, ...rest } = data; + data = { ...rest, feeds: items }; + } + } + return originalJson(data); + }; + next(); + }); + rssapiRouter.use(publicRouter); Indiekit.addEndpoint({ name: "Blogroll /rssapi alias", mountPath: "/rssapi", get routesPublic() { - return publicRouter; + return rssapiRouter; }, });`, },