53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
import { Feed } from 'feed';
|
|
import { FeedConfig, EmailData } from '../types';
|
|
|
|
/**
|
|
* Generate an RSS feed from a list of emails
|
|
*/
|
|
export function generateRssFeed(
|
|
feedConfig: FeedConfig,
|
|
emails: EmailData[],
|
|
baseUrl: string
|
|
): string {
|
|
// Create a new feed
|
|
const feed = new Feed({
|
|
title: feedConfig.title,
|
|
description: feedConfig.description || '',
|
|
id: feedConfig.feed_url,
|
|
link: feedConfig.site_url,
|
|
language: feedConfig.language,
|
|
updated: new Date(),
|
|
generator: 'Email-to-RSS',
|
|
copyright: `Copyright © ${new Date().getFullYear()} ${feedConfig.title}`,
|
|
feedLinks: {
|
|
rss: feedConfig.feed_url
|
|
},
|
|
author: feedConfig.author ? {
|
|
name: feedConfig.author,
|
|
email: `noreply@${new URL(feedConfig.site_url).hostname}`
|
|
} : undefined
|
|
});
|
|
|
|
// Add each email as a feed item
|
|
for (const email of emails) {
|
|
const date = new Date(email.receivedAt);
|
|
const uniqueId = `${email.receivedAt}-${Buffer.from(email.subject).toString('base64').substring(0, 10)}`;
|
|
|
|
feed.addItem({
|
|
title: email.subject,
|
|
id: uniqueId,
|
|
link: `${baseUrl}/emails/${uniqueId}`,
|
|
description: email.content,
|
|
content: email.content,
|
|
author: [
|
|
{
|
|
name: email.from,
|
|
},
|
|
],
|
|
date: date,
|
|
});
|
|
}
|
|
|
|
// Return the RSS feed as XML
|
|
return feed.rss2();
|
|
}
|