Capital/server/routes/posts/feed.ts

83 lines
2.4 KiB
TypeScript
Raw Normal View History

2024-08-16 08:53:23 +00:00
import { Feed } from "feed"
import { unified } from "unified"
import rehypeSanitize from "rehype-sanitize"
import rehypeStringify from "rehype-stringify"
import remarkParse from "remark-parse"
import remarkRehype from "remark-rehype"
export default defineEventHandler(async (event) => {
const config = useRuntimeConfig()
const feed = new Feed({
title: "Solar Network",
description: "Content all over solar network",
id: "https://solsynth.dev",
copyright: "All rights reserved © 2024 Solsynth LLC",
generator: "Solar Network Post Web Preview",
feedLinks: {
atom: "https://solsynth.dev/posts/feed",
},
})
const queries = getQuery<{
take?: number,
offset?: number,
type?: "atom" | "json" | "rss",
2024-08-18 16:44:35 +00:00
realm?: string,
2024-08-16 08:53:23 +00:00
author?: string,
}>(event)
const searchQuery = new URLSearchParams({
"take": (queries.take ?? 50).toString(),
"offset": (queries.offset ?? 0).toString(),
})
2024-08-18 16:44:35 +00:00
if (queries.realm) {
searchQuery.set("realm", queries.realm.toString())
2024-08-16 08:53:23 +00:00
}
if (queries.author) {
searchQuery.set("author", queries.author)
}
const res = await fetch(`${config.public.solarNetworkApi}/cgi/co/posts?` + searchQuery)
2024-08-16 08:53:23 +00:00
const posts: any[] = (await res.json())["data"]
for (const post of posts) {
const content = await unified()
.use(remarkParse)
.use(remarkRehype)
.use(rehypeSanitize)
.use(rehypeStringify)
.process(post.body.content)
2024-08-17 14:38:13 +00:00
const slug = post.alias ? `/posts/${post.area_alias}/${post.alias}` : `/posts/${post.id}`
2024-08-17 14:10:27 +00:00
2024-08-16 08:53:23 +00:00
feed.addItem({
date: new Date(post.published_at),
2024-08-17 14:10:27 +00:00
link: `https://solsynth.dev/${slug}`,
2024-08-16 08:53:23 +00:00
title: post.body.title ?? `Post #${post.id}`,
description: post.body.description,
content: String(content),
author: [
{
name: post.author.nick,
link: `https://solsynth.dev/@${post.author.name}`,
},
],
image: post.body.thumbnail ? `${config.public.solarNetworkApi}/cgi/uc/attachments/${post.body.thumbnail}` : void 0,
2024-08-16 08:53:23 +00:00
})
}
switch (queries.type) {
case "json":
2024-08-17 02:57:57 +00:00
setResponseHeader(event, "Content-Type", "application/json; charset=utf-8")
2024-08-16 08:53:23 +00:00
return feed.json1()
case "rss":
2024-08-16 12:07:20 +00:00
setResponseHeader(event, "Content-Type", "application/rss+xml; charset=utf-8")
2024-08-16 08:53:23 +00:00
return feed.rss2()
default:
2024-08-17 02:57:57 +00:00
setResponseHeader(event, "Content-Type", "application/rss+xml; charset=utf-8")
2024-08-16 08:53:23 +00:00
return feed.atom1()
}
})