From e7c660c142010fd45d8fcf4027aad9f191ea394e Mon Sep 17 00:00:00 2001 From: Alex Lebens Date: Thu, 5 Mar 2026 18:56:44 -0600 Subject: [PATCH] feat: use many to one relationship for categories in directus --- src/components/sections/CategorySection.astro | 9 ++++++--- src/lib/directusTypes.ts | 2 +- src/pages/blog/[...slug].astro | 11 ++++------- src/pages/categories/[...slug].astro | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/components/sections/CategorySection.astro b/src/components/sections/CategorySection.astro index 2cca488..949e7e8 100644 --- a/src/components/sections/CategorySection.astro +++ b/src/components/sections/CategorySection.astro @@ -10,7 +10,7 @@ import { timeago } from '@support/time'; const posts = await directus.request( readItems('posts', { filter: { published: { _eq: true } }, - fields: ['*'], + fields: ['*', 'category.slug'], sort: ['-published_date'], }) ); @@ -31,13 +31,16 @@ const layoutPattern = [ const postMap: Map = posts .sort((a: Post, b: Post) => b.published_date.valueOf() - a.published_date.valueOf()) .reduce((acc, obj) => { - let posts = acc.get(obj.category); + const categorySlug = obj.category?.slug; + if (!categorySlug) return acc; + + let posts = acc.get(categorySlug); if (!posts) { posts = []; } posts.push(obj); - acc.set(obj.category, posts); + acc.set(categorySlug, posts); return acc; }, new Map()); diff --git a/src/lib/directusTypes.ts b/src/lib/directusTypes.ts index 5eb2287..fdfb6fc 100644 --- a/src/lib/directusTypes.ts +++ b/src/lib/directusTypes.ts @@ -37,7 +37,7 @@ export type Post = { title: string; description: string; tags: string[]; - category: string; + category: Category; selected: boolean; published: boolean; content: string; diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro index 567e51f..21f83c3 100644 --- a/src/pages/blog/[...slug].astro +++ b/src/pages/blog/[...slug].astro @@ -17,7 +17,9 @@ import { getDirectusImageURL } from '@/support/url'; const post = Astro.props; export async function getStaticPaths() { - const posts = await directus.request(readItems('posts')); + const posts = await directus.request(readItems('posts', { + fields: ['*', 'category.*'], + })); return posts.map((post) => ({ params: { slug: post.slug }, props: post, @@ -25,12 +27,7 @@ export async function getStaticPaths() { } const global = await directus.request(readSingleton('site_global')); -const [category] = post.category ? await directus.request( - readItems('categories', { - filter: { slug: { _eq: post.category },}, - limit: 1, - })) - : []; +const category = post.category; const readingTime = getReadingTime(post.content || ''); diff --git a/src/pages/categories/[...slug].astro b/src/pages/categories/[...slug].astro index a0610c9..6be4643 100644 --- a/src/pages/categories/[...slug].astro +++ b/src/pages/categories/[...slug].astro @@ -22,7 +22,7 @@ const global = await directus.request(readSingleton('site_global')); const posts = await directus.request( readItems('posts', { filter: { published: { _eq: true } }, - fields: ['*'], + fields: ['*', 'category.slug'], sort: ['-published_date'], }) ); @@ -30,7 +30,7 @@ const posts = await directus.request( const categoriesPosts = posts .sort((a: Post, b: Post) => b.published_date.valueOf() - a.published_date.valueOf()) .filter((b) => { - return b.category === category.slug; + return b.category?.slug === category.slug; }); ---