Files
next.js/examples/cms-umbraco/lib/api.ts
Arian Tron 61f56f997c
Some checks failed
Test examples / Test Examples (20) (push) Has been cancelled
Test examples / Test Examples (22) (push) Has been cancelled
Lock Threads / action (push) Has been cancelled
Trigger Release / start (push) Has been cancelled
Stale issue handler / stale (push) Has been cancelled
Update Font Data / create-pull-request (push) Has been cancelled
build-and-deploy / deploy-target (push) Has been cancelled
build-and-deploy / build (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-musl - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-unknown-linux-gnu - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-pc-windows-msvc - node@16 (push) Has been cancelled
build-and-deploy / stable - aarch64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / stable - x86_64-apple-darwin - node@16 (push) Has been cancelled
build-and-deploy / build-wasm (nodejs) (push) Has been cancelled
build-and-deploy / build-wasm (web) (push) Has been cancelled
build-and-deploy / Deploy preview tarball (push) Has been cancelled
build-and-deploy / Potentially publish release (push) Has been cancelled
build-and-deploy / publish-turbopack-npm-packages (push) Has been cancelled
build-and-deploy / Deploy examples (push) Has been cancelled
build-and-deploy / thank you, build (push) Has been cancelled
build-and-deploy / Upload Turbopack Bytesize metrics to Datadog (push) Has been cancelled
Rspack Next.js development integration tests / Rspack integration tests (push) Has been cancelled
Rspack Next.js production integration tests / Rspack integration tests (push) Has been cancelled
Turbopack Next.js development integration tests / Next.js integration tests (push) Has been cancelled
Turbopack Next.js production integration tests / Next.js integration tests (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack development test manifest (push) Has been cancelled
Update Rspack test manifest / Update and upload Rspack production test manifest (push) Has been cancelled
Upload bundler test manifests to areweturboyet.com / Upload test results (push) Has been cancelled
Update React / create-pull-request (push) Has been cancelled
test-e2e-project-reset-cron / reset-test-project (push) Has been cancelled
Notify about the top 15 issues/PRs/feature requests (most reacted) in the last 90 days / run (push) Has been cancelled
first commit
2026-03-10 19:37:31 +03:30

114 lines
3.2 KiB
TypeScript

import Post from "../types/post";
import Author from "../types/author";
import PostAndMorePosts from "../types/postAndMorePosts";
const UMBRACO_SERVER_URL = process.env.UMBRACO_SERVER_URL;
const UMBRACO_DELIVERY_API_KEY = process.env.UMBRACO_DELIVERY_API_KEY;
const UMBRACO_API_URL = `${UMBRACO_SERVER_URL}/umbraco/delivery/api/v2/content`;
const performFetch = async (url: string, options: RequestInit) => {
const response = await fetch(url, options);
if (!response.ok) {
const message = `Could not fetch data for URL: ${url} - response status was: ${response.status}`;
throw new Error(message);
}
return await response.json();
};
const fetchSingle = async (slug: string, startItem: string, preview: boolean) =>
await performFetch(`${UMBRACO_API_URL}/item/${slug}`, {
method: "GET",
headers: {
"Start-Item": startItem,
"Api-Key": UMBRACO_DELIVERY_API_KEY,
Preview: preview ? "true" : "false",
},
});
const fetchMultiple = async (
query: string,
startItem: string,
preview: boolean,
) =>
await performFetch(`${UMBRACO_API_URL}/?${query}`, {
method: "GET",
headers: {
"Start-Item": startItem,
"Api-Key": UMBRACO_DELIVERY_API_KEY,
Preview: preview ? "true" : "false",
},
});
const extractSlug = (item: any): string => item.route.path;
const extractAuthor = (author: any): Author => {
return {
id: author.id,
name: author.name,
picture: {
url: `${UMBRACO_SERVER_URL}${author.properties.picture[0].url}`,
},
};
};
const extractPost = (post: any): Post => {
// NOTE: author is an expanded property on the post
const author = extractAuthor(post.properties.author);
return {
id: post.id,
slug: extractSlug(post),
title: post.name,
coverImage: {
url: `${UMBRACO_SERVER_URL}${post.properties.coverImage[0].url}`,
},
date: post.updateDate,
author: author,
excerpt: post.properties.excerpt,
content: post.properties.content.markup,
tags: post.properties.tags,
};
};
const fetchPost = async (slug: string, preview: boolean) =>
await fetchSingle(`${slug}?expand=properties[author]`, "posts", preview);
const fetchPosts = async (
expandAuthor: boolean,
numberOfPosts: number,
preview: boolean,
) => {
const expand = expandAuthor ? "properties[author]" : "";
const take = numberOfPosts ?? 10;
return await fetchMultiple(
`fetch=children:/&expand=${expand}&sort=updateDate:desc&take=${take}`,
"posts",
preview,
);
};
export const getAllPostSlugs = async (preview: boolean): Promise<string[]> => {
const json = await fetchPosts(false, 100, preview);
return json.items.map((post) => extractSlug(post));
};
export const getAllPostsForHome = async (preview: boolean): Promise<Post[]> => {
const json = await fetchPosts(true, 10, preview);
return json.items.map(extractPost);
};
export const getPostAndMorePosts = async (
slug: string,
preview: boolean,
): Promise<PostAndMorePosts> => {
const postJson = await fetchPost(slug, preview);
const post = extractPost(postJson);
const morePostsJson = await fetchPosts(true, 3, preview);
const morePosts = morePostsJson.items.map(extractPost);
return {
post: post,
morePosts: morePosts.filter((p) => p.id !== post.id).slice(0, 2),
};
};