@studiocms/blog
Version:
Add a blog to your StudioCMS project with ease!
44 lines (43 loc) • 1.76 kB
JavaScript
import blogConfig from "studiocms:blog/config";
import { pathWithBase } from "studiocms:lib";
import { SDKCore } from "studiocms:sdk";
import rss, {} from "@astrojs/rss";
import { createJsonResponse, Effect, withEffectAPI } from "studiocms/effect";
import { getBlogRoute } from "../utils/remapFilter.js";
const GET = withEffectAPI(
Effect.fn(function* ({ site: _site, locals }) {
const sdk = yield* SDKCore;
const config = locals?.StudioCMS?.siteConfig?.data;
const siteTitle = config?.title ?? "StudioCMS";
const title = `${siteTitle} | ${blogConfig.title}`;
const description = config?.description ?? "Blog";
const site = _site ?? "https://example.com";
const posts = yield* sdk.GET.pages();
const sortedPosts = posts.map(({ data }) => data).filter(({ package: pkg }) => pkg === "@studiocms/blog").sort((a, b) => new Date(b.publishedAt).getTime() - new Date(a.publishedAt).getTime());
const items = sortedPosts.map(
({ title: title2, description: description2, publishedAt, slug, categories: categoryData }) => {
const link = pathWithBase(getBlogRoute(slug));
const categories = (categoryData ?? []).map(({ name }) => name);
const pubDate = typeof publishedAt === "string" ? new Date(publishedAt) : publishedAt;
return {
title: title2,
description: description2,
pubDate,
link,
categories
};
}
);
return rss({ title, description, site, items });
}),
{
cors: { methods: ["GET"], origin: "*" },
onError: async (error) => {
console.error("Error generating RSS feed:", error);
return createJsonResponse({ error: "Something went wrong" }, { status: 500 });
}
}
);
export {
GET
};