47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
import { Feed } from "feed";
|
|
import { getPosts } from "@/lib/blog/query";
|
|
import { SITE_INFO, SITE_URL } from "@/constants/site-constants";
|
|
|
|
export async function GET() {
|
|
try {
|
|
const { posts } = await getPosts();
|
|
|
|
const feed = new Feed({
|
|
title: `${SITE_INFO.title} Blog`,
|
|
description: SITE_INFO.description,
|
|
id: `${SITE_URL}`,
|
|
link: `${SITE_URL}/blog/`,
|
|
language: "en",
|
|
image: `${SITE_INFO.openGraphImage}`,
|
|
favicon: `${SITE_INFO.favicon}`,
|
|
copyright: `All rights reserved ${new Date().getFullYear()}, ${
|
|
SITE_INFO.title
|
|
}`,
|
|
});
|
|
|
|
for (const post of posts) {
|
|
feed.addItem({
|
|
title: post.title,
|
|
id: `${SITE_URL}/blog/${post.slug}`,
|
|
link: `${SITE_URL}/blog/${post.slug}`,
|
|
description: post.description,
|
|
author: post.authors.map((author) => ({
|
|
name: author.name,
|
|
})),
|
|
date: new Date(post.publishedAt),
|
|
image: post.coverImage || SITE_INFO.openGraphImage,
|
|
});
|
|
}
|
|
|
|
return new Response(feed.rss2(), {
|
|
headers: {
|
|
"Content-Type": "text/xml",
|
|
"Cache-Control": "public, max-age=86400, stale-while-revalidate",
|
|
},
|
|
});
|
|
} catch (error) {
|
|
console.error("Error generating RSS feed", error);
|
|
return new Response("Internal Server Error", { status: 500 });
|
|
}
|
|
}
|