diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-01-13 18:35:48 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-01-13 18:35:48 +0100 |
| commit | 02ee023272c4f28fd866de40dd2b15a7f7b75a4a (patch) | |
| tree | e7d29b73e679f07906068593d0e25bf6f8c728fe /src/utils | |
| parent | 606461f857e06b06429dd5738be642f9d1b459be (diff) | |
| parent | 320b5782f348d42f6a2bb74a70d4d114525355e4 (diff) | |
feat: add feeds (rss, atom, json)
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/helpers/rss.ts | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/utils/helpers/rss.ts b/src/utils/helpers/rss.ts new file mode 100644 index 0000000..7851ff8 --- /dev/null +++ b/src/utils/helpers/rss.ts @@ -0,0 +1,61 @@ +import { config } from '@config/website'; +import { getPublishedPosts } from '@services/graphql/queries'; +import { ArticlePreview } from '@ts/types/articles'; +import { PostsList } from '@ts/types/blog'; +import { Feed } from 'feed'; + +const getAllPosts = async (): Promise<ArticlePreview[]> => { + const posts: ArticlePreview[] = []; + let hasNextPage = true; + let after = undefined; + + do { + const postsList: PostsList = await getPublishedPosts({ first: 10, after }); + posts.push(...postsList.posts); + hasNextPage = postsList.pageInfo.hasNextPage; + after = postsList.pageInfo.endCursor; + } while (hasNextPage); + + 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, + }); + }); + + return feed; +}; |
