diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-01-12 02:02:54 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-01-12 02:02:54 +0100 |
| commit | 65a4cb6ce9387c52c4274fddde9320baadbf017f (patch) | |
| tree | 9de858cb6dbc1ac9785da365931d067a0e219c99 /src/utils | |
| parent | 55b206d3f2de6a69e3e614207558faa475b0ccf9 (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.ts | 54 |
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'); +}; |
