/** * `/blog/rss.xml?lang=xx`: the blog as RSS, in one language — a feed reader * subscribes to one, and a post only has the addresses of the languages it was * translated into. */ import { defineEventHandler, getQuery, getRequestHeaders, setResponseHeader, setResponseStatus, } from 'h3'; import { pireonApi, resolveLocale } from '../../../app/core/api'; import { BLOG_CATEGORY, byPublication } from '../../../app/core/blog'; import { copyFor } from '../../../app/core/copy'; import { originFromHeaders } from '../../../app/core/origin'; import { listingPath } from '../../../app/core/routes'; import { buildFeed } from '../../../app/core/rss'; export default defineEventHandler(async (event) => { const locale = resolveLocale(getQuery(event)['lang']); const origin = originFromHeaders(getRequestHeaders(event)) ?? ''; const copy = copyFor(locale); const { data, error } = await pireonApi.pages(locale, { category: BLOG_CATEGORY[locale], per_page: 50, }); if (error) { setResponseStatus(event, 503); setResponseHeader(event, 'Cache-Control', 'no-store'); return 'Feed temporarily unavailable'; } setResponseHeader( event, 'Content-Type', 'application/rss+xml; charset=utf-8', ); return buildFeed( origin, locale, { title: `Pireon — ${copy.blog.title}`, description: copy.blog.lead, link: listingPath('blog', locale), }, byPublication(data ?? []), ); });