summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/blog-query.ts
diff options
context:
space:
mode:
authoriza <59828082+izadoesdev@users.noreply.github.com>2025-07-22 00:59:57 +0300
committerGitHub <noreply@github.com>2025-07-22 00:59:57 +0300
commit8c1ea7e6806f47f14a46fd4ab6490b2911430803 (patch)
tree097f4a528c36bd4d4959d5a58969af65702c1155 /apps/web/src/lib/blog-query.ts
parent3446fdde87795693d01c1e7a010a92d4851c0ed7 (diff)
parentddf0353d92c4ae214844e085e96d1d47b3ac236d (diff)
downloadopencut-8c1ea7e6806f47f14a46fd4ab6490b2911430803.tar.gz
Merge pull request #402 from mezotv/feat/opencut-blog
feat: add blog powered by marble
Diffstat (limited to 'apps/web/src/lib/blog-query.ts')
-rw-r--r--apps/web/src/lib/blog-query.ts55
1 files changed, 55 insertions, 0 deletions
diff --git a/apps/web/src/lib/blog-query.ts b/apps/web/src/lib/blog-query.ts
new file mode 100644
index 00000000..f82c54fe
--- /dev/null
+++ b/apps/web/src/lib/blog-query.ts
@@ -0,0 +1,55 @@
+import type { MarbleAuthorList, MarbleCategoryList, MarblePost, MarblePostList, MarbleTagList } from '@/types/post';
+import { unified } from "unified";
+import rehypeParse from "rehype-parse";
+import rehypeStringify from "rehype-stringify";
+import rehypeSlug from "rehype-slug";
+import rehypeAutolinkHeadings from "rehype-autolink-headings";
+import rehypeSanitize from "rehype-sanitize";
+
+const url = process.env.MARBLE_API_URL || "https://api.marblecms.com";
+const key = process.env.MARBLE_WORKSPACE_KEY || "cm6ytuq9x0000i803v0isidst";
+
+async function fetchFromMarble<T>(endpoint: string): Promise<T> {
+ try {
+ const response = await fetch(`${url}/${key}/${endpoint}`);
+ if (!response.ok) {
+ throw new Error(`Failed to fetch ${endpoint}: ${response.status} ${response.statusText}`);
+ }
+ return await response.json() as T;
+ } catch (error) {
+ console.error(`Error fetching ${endpoint}:`, error);
+ throw error;
+ }
+ }
+
+ export async function getPosts() {
+ return fetchFromMarble<MarblePostList>('posts');
+ }
+
+ export async function getTags() {
+ return fetchFromMarble<MarbleTagList>('tags');
+ }
+
+ export async function getSinglePost(slug: string) {
+ return fetchFromMarble<MarblePost>(`posts/${slug}`);
+ }
+
+ export async function getCategories() {
+ return fetchFromMarble<MarbleCategoryList>('categories');
+ }
+
+ export async function getAuthors() {
+ return fetchFromMarble<MarbleAuthorList>('authors');
+ }
+
+export async function processHtmlContent(html: string): Promise<string> {
+ const processor = unified()
+ .use(rehypeSanitize)
+ .use(rehypeParse, { fragment: true })
+ .use(rehypeSlug)
+ .use(rehypeAutolinkHeadings, { behavior: "append" })
+ .use(rehypeStringify);
+
+ const file = await processor.process(html);
+ return String(file);
+} \ No newline at end of file