39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import rss from '@astrojs/rss'
|
|
import { SITE } from '@consts'
|
|
import type { APIContext } from 'astro'
|
|
import { getCollection } from 'astro:content'
|
|
|
|
export async function GET(context: APIContext) {
|
|
try {
|
|
const blog = (await getCollection('blog')).filter(
|
|
(post) => !post.data.draft,
|
|
)
|
|
|
|
// Filter posts by tag 'rss-feed'
|
|
const filteredBlogs = blog.filter(
|
|
(post) => post.data.tags && post.data.tags.includes('rss-feed'),
|
|
)
|
|
|
|
// Sort posts by date
|
|
const items = [...filteredBlogs].sort(
|
|
(a, b) =>
|
|
new Date(b.data.date).valueOf() - new Date(a.data.date).valueOf(),
|
|
)
|
|
|
|
// Return RSS feed
|
|
return rss({
|
|
title: SITE.TITLE,
|
|
description: SITE.DESCRIPTION,
|
|
site: context.site ?? SITE.SITEURL,
|
|
items: items.map((item) => ({
|
|
title: item.data.title,
|
|
description: item.data.description,
|
|
pubDate: item.data.date,
|
|
link: `/${item.collection}/${item.slug}/`,
|
|
})),
|
|
})
|
|
} catch (error) {
|
|
console.error('Error generating RSS feed:', error)
|
|
return new Response('Error generating RSS feed', { status: 500 })
|
|
}
|
|
}
|