New API for posts ! best way to do this.

This commit is contained in:
matthieu42morin 2024-04-28 01:21:34 +02:00
parent dda41c8414
commit 74987b8408
1 changed files with 95 additions and 0 deletions

View File

@ -0,0 +1,95 @@
import { json } from '@sveltejs/kit';
import type { Post } from '$lib/types/post';
import type { MdsvexImport } from '$lib/types/post';
import { error } from '@sveltejs/kit';
import readingTime from 'reading-time';
import { getImageUrl } from '$lib/utils/images';
import type { RequestHandler } from './$types';
const getPosts = async () => {
let posts: Post[] = [];
const paths = import.meta.glob<Post & MdsvexImport>('$content/blog/*.md', {
eager: true
});
for (const path in paths) {
const file = paths[path];
const slug = path.split('/').at(-1)?.replace('.md', '');
if (file && typeof file === 'object' && 'metadata' in file && slug) {
const metadata = file.metadata as Omit<Post, 'slug'>;
const { imagePublicId } = metadata;
const post = {
...metadata,
slug,
readingTime,
featuredImage: getImageUrl(imagePublicId, { width: 1200, height: 630 }),
ogImage: getImageUrl(imagePublicId, { width: 1200, height: 630 }),
ogSquareImage: getImageUrl(imagePublicId, { width: 400, height: 400 }),
twitterImage: getImageUrl(imagePublicId, { width: 1200, height: 630 })
} satisfies Post;
post.datePublished && posts.push(post);
}
}
posts = posts.sort(
(first, second) =>
new Date(second.datePublished).getTime() - new Date(first.datePublished).getTime()
);
// Add SEO metadata
// posts = posts.map((post) => ({
// ...post,
// seoTitle: `${post.title} | ${defaultMeta.siteTitle}`,
// seoDescription: post.description || defaultMeta.defaultDescription,
// seoImage: post.ogImage || defaultMeta.ogImage,
// seoSquareImage: post.ogSquareImage || defaultMeta.ogSquareImage,
// seoTwitterImage: post.twitterImage || defaultMeta.twitterImage
// }));
// Add SEO metadata
// posts = posts.map((post) => ({
// ...post,
// seo: {
// title: post.postTitle,
// description: post.seoMetaDescription,
// openGraph: {
// title: post.postTitle,
// description: post.seoMetaDescription,
// type: post.type,
// url: `https://mattmor.in/blog/${post.slug}`,
// images: [
// {
// url: post.ogImage,
// width: 1200,
// height: 630,
// alt: post.featuredImageAlt
// },
// {
// url: post.ogSquareImage,
// width: 400,
// height: 400,
// alt: post.featuredImageAlt
// }
// ]
// },
// twitter: {
// card: 'summary_large_image',
// site: '@yourtwitterhandle',
// title: post.postTitle,
// description: post.seoMetaDescription,
// image: post.twitterImage,
// imageAlt: post.featuredImageAlt
// }
// }
// },
return posts;
};
export const GET: RequestHandler = async () => {
const posts = await getPosts();
const projects = await getProjects();
return json(posts);
};