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
114 lines
3.2 KiB
TypeScript
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),
|
|
};
|
|
};
|