From 4ce364596823f0385bf6d44891d7521479c14974 Mon Sep 17 00:00:00 2001 From: Cameron Otsuka Date: Mon, 13 Apr 2026 20:39:56 -0700 Subject: [PATCH] separate out opengraph routes --- .../articles/[date]-[id]/opengraph.png.ts | 27 +++++++++++----- src/pages/podcasts/[id]/opengraph.png.ts | 26 +++++++++++---- .../reviews/[category]/[id]/opengraph.png.ts | 28 ++++++++++------ src/utils/createOgRoutes.ts | 32 ------------------- 4 files changed, 57 insertions(+), 56 deletions(-) delete mode 100644 src/utils/createOgRoutes.ts diff --git a/src/pages/articles/[date]-[id]/opengraph.png.ts b/src/pages/articles/[date]-[id]/opengraph.png.ts index bc18a6e..f810548 100644 --- a/src/pages/articles/[date]-[id]/opengraph.png.ts +++ b/src/pages/articles/[date]-[id]/opengraph.png.ts @@ -1,10 +1,21 @@ -import { createOgRoutes } from '@utils/createOgRoutes'; +import type { APIRoute } from 'astro'; +import { getCollection } from 'astro:content'; import formatDate from '@utils/formatDate'; +import generateOpenGraphImage from '@utils/generateOpenGraphImage'; -export const { getStaticPaths, GET } = createOgRoutes( - 'articles', - (article) => ({ - date: formatDate(article.data.date), - id: article.id, - }), -); +export const GET = (async ({ props, url }) => { + const entry = props.entry; + return generateOpenGraphImage( + entry.data.title, + entry.data.description, + url.origin, + ); +}) satisfies APIRoute; + +export async function getStaticPaths() { + const articles = await getCollection('articles'); + return articles.map((article) => ({ + params: { date: formatDate(article.data.date), id: article.id }, + props: { entry: article }, + })); +} diff --git a/src/pages/podcasts/[id]/opengraph.png.ts b/src/pages/podcasts/[id]/opengraph.png.ts index a7feecd..25d66f2 100644 --- a/src/pages/podcasts/[id]/opengraph.png.ts +++ b/src/pages/podcasts/[id]/opengraph.png.ts @@ -1,8 +1,20 @@ -import { createOgRoutes } from '@utils/createOgRoutes'; +import type { APIRoute } from 'astro'; +import { getCollection } from 'astro:content'; +import generateOpenGraphImage from '@utils/generateOpenGraphImage'; -export const { getStaticPaths, GET } = createOgRoutes( - 'podcasts', - (podcast) => ({ - id: podcast.id, - }), -); +export const GET = (async ({ props, url }) => { + const entry = props.entry; + return generateOpenGraphImage( + entry.data.title, + entry.data.description, + url.origin, + ); +}) satisfies APIRoute; + +export async function getStaticPaths() { + const podcasts = await getCollection('podcasts'); + return podcasts.map((podcast) => ({ + params: { id: podcast.id }, + props: { entry: podcast }, + })); +} diff --git a/src/pages/reviews/[category]/[id]/opengraph.png.ts b/src/pages/reviews/[category]/[id]/opengraph.png.ts index 958b80e..ffcc555 100644 --- a/src/pages/reviews/[category]/[id]/opengraph.png.ts +++ b/src/pages/reviews/[category]/[id]/opengraph.png.ts @@ -1,11 +1,21 @@ -import { createOgRoutes } from '@utils/createOgRoutes'; +import type { APIRoute } from 'astro'; +import { getCollection } from 'astro:content'; +import generateOpenGraphImage from '@utils/generateOpenGraphImage'; import generateStarRating from '@utils/generateStarRating'; -export const { getStaticPaths, GET } = createOgRoutes( - 'reviews', - (review) => ({ - category: review.data.category, - id: review.id, - }), - (review) => generateStarRating(review.data.rating) ?? '', -); +export const GET = (async ({ props, url }) => { + const entry = props.entry; + return generateOpenGraphImage( + entry.data.title, + generateStarRating(entry.data.rating), + url.origin, + ); +}) satisfies APIRoute; + +export async function getStaticPaths() { + const reviews = await getCollection('reviews'); + return reviews.map((review) => ({ + params: { category: review.data.category, id: review.id }, + props: { entry: review }, + })); +} diff --git a/src/utils/createOgRoutes.ts b/src/utils/createOgRoutes.ts deleted file mode 100644 index de8ed87..0000000 --- a/src/utils/createOgRoutes.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { APIRoute, GetStaticPaths } from 'astro'; -import { getCollection, type CollectionEntry } from 'astro:content'; -import generateOpenGraphImage from '@utils/generateOpenGraphImage'; - -type SiteCollection = 'articles' | 'podcasts' | 'reviews'; - -export function createOgRoutes( - collectionName: T, - getParams: (entry: CollectionEntry) => Record, - getDescription?: (entry: CollectionEntry) => string, -) { - const getStaticPaths: GetStaticPaths = async () => { - const entries = await getCollection(collectionName); - return entries.map((entry) => ({ - params: getParams(entry), - props: { entry }, - })); - }; - - const GET: APIRoute = async ({ props, url }) => { - if (!props.entry) { - throw new Error('Missing entry prop in OG route'); - } - const entry = props.entry as CollectionEntry; - const description = getDescription - ? getDescription(entry) - : ((entry.data as { description?: string }).description ?? ''); - return generateOpenGraphImage(entry.data.title, description, url.origin); - }; - - return { getStaticPaths, GET }; -} -- 2.53.0