diff options
| -rw-r--r-- | .env.example | 6 | ||||
| -rw-r--r-- | src/utils/helpers/rss.ts | 54 |
2 files changed, 60 insertions, 0 deletions
diff --git a/.env.example b/.env.example index c4ddb0e..efeb49d 100644 --- a/.env.example +++ b/.env.example @@ -1,6 +1,12 @@ +FRONTEND_URL="https://www.frontend.com" BACKEND_URL="https://www.backend.com" GRAPHQL_ENDPOINT="/graphql" +AUTHOR_NAME="Your Name" +AUTHOR_EMAIL="your@email.com" +AUTHOR_URL="https://www.yourWebsite.com/" +FEED_DESCRIPTION="What you want..." + NEXT_PUBLIC_GRAPHQL_API="$BACKEND_URL$GRAPHQL_ENDPOINT" # Use this only in development mode. It prevents "unable to verify the first 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'); +}; |
