aboutsummaryrefslogtreecommitdiffstats
path: root/src/utils
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-01-12 02:02:54 +0100
committerArmand Philippot <git@armandphilippot.com>2022-01-12 02:02:54 +0100
commit65a4cb6ce9387c52c4274fddde9320baadbf017f (patch)
tree9de858cb6dbc1ac9785da365931d067a0e219c99 /src/utils
parent55b206d3f2de6a69e3e614207558faa475b0ccf9 (diff)
chore: generate feed
I could loop until hasNextPage is false, but I'm not sure if it is the best solution. So, for now, only the first 100 posts will be added to the file.
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/helpers/rss.ts54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/utils/helpers/rss.ts b/src/utils/helpers/rss.ts
new file mode 100644
index 0000000..42560cb
--- /dev/null
+++ b/src/utils/helpers/rss.ts
@@ -0,0 +1,54 @@
+import { config } from '@config/website';
+import { getPublishedPosts } from '@services/graphql/queries';
+import { ArticlePreview } from '@ts/types/articles';
+import { Feed } from 'feed';
+import { writeFileSync } from 'fs';
+
+const getAllPosts = async (): Promise<ArticlePreview[]> => {
+ const posts: ArticlePreview[] = [];
+ const postsList = await getPublishedPosts({ first: 100 });
+ posts.push(...postsList.posts);
+
+ return posts;
+};
+
+export const generateFeed = async () => {
+ const websiteUrl = process.env.FRONTEND_URL ? process.env.FRONTEND_URL : '';
+ const author = {
+ name: config.name,
+ email: process.env.AUTHOR_EMAIL,
+ link: websiteUrl,
+ };
+ const copyright = `${config.name} CC BY SA ${config.copyright.startYear} - ${config.copyright.endYear}`;
+ const title = `${config.name} | ${config.baseline}`;
+
+ const feed = new Feed({
+ author,
+ copyright,
+ description: process.env.FEED_DESCRIPTION,
+ feedLinks: {
+ json: `${websiteUrl}/feed/json`,
+ atom: `${websiteUrl}/feed/atom`,
+ },
+ generator: 'Feed & NextJS',
+ id: websiteUrl,
+ language: config.defaultLocale,
+ link: websiteUrl,
+ title,
+ });
+
+ const posts = await getAllPosts();
+
+ posts.forEach((post) => {
+ feed.addItem({
+ content: post.intro,
+ date: new Date(post.dates.publication),
+ description: post.intro,
+ id: post.id,
+ link: `${websiteUrl}/article/${post.slug}`,
+ title: post.title,
+ });
+ });
+
+ writeFileSync('./public/feed.xml', feed.rss2(), 'utf8');
+};