42 lines
1.6 KiB
TypeScript
42 lines
1.6 KiB
TypeScript
import rss from '@astrojs/rss'
|
|
import { SITE_URL } from 'astro:env/client'
|
|
|
|
import { getEventTypeInfo } from '../../constants/eventTypes'
|
|
import { getEvents } from '../../lib/feeds'
|
|
|
|
import type { APIRoute } from 'astro'
|
|
|
|
export const GET: APIRoute = async (context) => {
|
|
try {
|
|
const origin = context.site?.origin ?? new URL(SITE_URL).origin
|
|
|
|
const result = await getEvents()
|
|
if (!result.success) return new Response(result.error.message, result.error.responseInit)
|
|
const { events } = result.data
|
|
|
|
return await rss({
|
|
title: 'KYCnot.me - Service Events',
|
|
description: 'Latest events and updates from privacy-focused services tracked on KYCnot.me',
|
|
site: origin,
|
|
xmlns: { atom: 'http://www.w3.org/2005/Atom' },
|
|
items: events.map((event) => {
|
|
const eventTypeInfo = getEventTypeInfo(event.type)
|
|
const isOngoing = !event.endedAt || event.endedAt > new Date()
|
|
const statusText = isOngoing ? 'Ongoing' : 'Resolved'
|
|
|
|
return {
|
|
title: `${event.service.name}: ${event.title}`,
|
|
pubDate: event.createdAt,
|
|
description: `${event.content}${event.source ? `\n\nSource: ${event.source}` : ''}`,
|
|
link: `/service/${event.service.slug}/#event-${String(event.id)}`,
|
|
categories: [eventTypeInfo.label, event.service.name, statusText],
|
|
}
|
|
}),
|
|
customData: `<language>en-us</language><atom:link href="${context.url.href}" rel="self" type="application/rss+xml"/>`,
|
|
})
|
|
} catch (error) {
|
|
console.error('Error generating events RSS feed:', error)
|
|
return new Response('Error generating RSS feed', { status: 500 })
|
|
}
|
|
}
|