From fff10245ea7e96c79429f3778e10e50c95183c37 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 8 Jan 2025 13:52:35 +0800 Subject: [PATCH] :sparkles: Add post RSS feed --- bun.lockb | Bin 250860 -> 251572 bytes package.json | 1 + src/pages/posts/feed.ts | 72 ++++++++++++++++++++++++++++++++++++++ src/pages/posts/index.tsx | 43 +++++++++++++++++------ 4 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 src/pages/posts/feed.ts diff --git a/bun.lockb b/bun.lockb index 665686097d6f9ef89dfc93114b01da5a47749cc9..118717e4de29be5779fec6ad527a65a0c0be1575 100755 GIT binary patch delta 40134 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 diff --git a/package.json b/package.json index 093f7c3..7d03859 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "axios": "^1.7.9", "axios-case-converter": "^1.1.1", "cookies-next": "^5.0.2", + "feed": "^4.2.2", "next": "15.1.3", "next-nprogress-bar": "^2.4.3", "react": "^19.0.0", diff --git a/src/pages/posts/feed.ts b/src/pages/posts/feed.ts new file mode 100644 index 0000000..f4ca772 --- /dev/null +++ b/src/pages/posts/feed.ts @@ -0,0 +1,72 @@ +import { sni } from '@/services/network' +import { SnPost } from '@/services/post' +import { GetServerSideProps } from 'next' +import { Feed } from 'feed' + +function generateFeed(posts: SnPost[]): string { + const feed = new Feed({ + title: 'Solar Network Posts', + description: 'All posts on the Solar Network platform, and now you can view them via the RSS feed!', + id: 'https://solsynth.dev/posts', + link: 'https://solsynth.dev/posts', + favicon: 'https://solsynth.dev/favicon.png', + copyright: `All rights reserved ${new Date().getFullYear()} © Solsynth LLC & Post Publishers`, + updated: new Date(posts[0].createdAt), + generator: 'Capital', + feedLinks: { + json: 'https://example.com/json', + atom: 'https://example.com/atom', + }, + }) + + for (const p of posts) { + feed.addItem({ + id: p.id.toString(), + title: p.body.title ?? `Post #${p.id}`, + description: p.body.description, + link: + p.alias && p.aliasPrefix + ? `https://solsynth.dev/posts/${p.aliasPrefix}/${p.alias}` + : `https://solsynth.dev/posts/${p.id}`, + content: p.body.content, + date: new Date(p.publishedAt ?? p.createdAt), + published: new Date(p.publishedAt ?? p.createdAt), + copyright: `All right reserved ${new Date().getFullYear()} © @${p.publisher.name}`, + author: [ + { + name: `@${p.publisher.name}`, + }, + ], + }) + } + + return feed.rss2() +} + +export const getServerSideProps: GetServerSideProps = async ({ res, query }) => { + let page: number = parseInt(query.page as string) + if (isNaN(page)) page = 1 + + const countPerPage = 20 + + const { data: resp } = await sni.get<{ data: SnPost[] }>('/cgi/co/posts', { + params: { + take: countPerPage, + offset: (page - 1) * countPerPage, + }, + }) + + const sitemap = generateFeed(resp.data) + + res.setHeader('Content-Type', 'text/xml') + res.write(sitemap) + res.end() + + return { + props: {}, + } +} + +export default function PostSiteMap() { + // getServerSideProps will do the heavy lifting +} diff --git a/src/pages/posts/index.tsx b/src/pages/posts/index.tsx index ade03b3..32f3295 100644 --- a/src/pages/posts/index.tsx +++ b/src/pages/posts/index.tsx @@ -2,9 +2,20 @@ import { AttachmentItem } from '@/components/attachments/AttachmentItem' import { SnAttachment, listAttachment } from '@/services/attachment' import { getAttachmentUrl, sni } from '@/services/network' import { SnPost } from '@/services/post' -import { Avatar, Box, Container, Divider, Grid2 as Grid, Pagination, Paper, Typography } from '@mui/material' +import { + Avatar, + Box, + Button, + Container, + Divider, + Grid2 as Grid, + Link, + Pagination, + Paper, + Typography, +} from '@mui/material' import { GetServerSideProps, InferGetServerSidePropsType } from 'next' -import Link from 'next/link' +import NextLink from 'next/link' import { useRouter } from 'next/router' import rehypeSanitize from 'rehype-sanitize' import rehypeStringify from 'rehype-stringify' @@ -86,7 +97,7 @@ export default function PostList({ posts, page, pages }: InferGetServerSideProps - + {(p.body.title || p.body.content) && ( @@ -108,7 +119,7 @@ export default function PostList({ posts, page, pages }: InferGetServerSideProps {p.body.content &&
} - + {p.attachments && ( ))} - router.push('/posts?page=' + page)} - /> + + router.push('/posts?page=' + page)} /> + + RSS Feed + + ) }