Files

63 lines
2.0 KiB
TypeScript
Raw Permalink Normal View History

2026-09-11 11:25:14 +02:00
import type { ArticleSummary, Category, Paginated } from '#shared/types/blog'
import type { Locale } from '#shared/utils/locale'
interface RawCategory extends Category {
nameEn?: string | null
}
2026-09-11 11:25:14 +02:00
interface RawArticleSummary {
id: string
title: string
titleEn: string | null
2026-09-11 11:25:14 +02:00
slug: string
publishedAt: string
cover: string
coverAlt: string | null
coverAltEn: string | null
expand?: { category?: RawCategory }
2026-09-11 11:25:14 +02:00
}
function toSummary(raw: RawArticleSummary, lang: Locale): ArticleSummary {
const title = lang === 'en' ? raw.titleEn || raw.title : raw.title
const coverAlt = lang === 'en' ? raw.coverAltEn || raw.coverAlt : raw.coverAlt
const category = raw.expand?.category
? {
name: lang === 'en' ? raw.expand.category.nameEn || raw.expand.category.name : raw.expand.category.name,
slug: raw.expand.category.slug,
}
: null
2026-09-11 11:25:14 +02:00
return {
title,
2026-09-11 11:25:14 +02:00
slug: raw.slug,
publishedAt: raw.publishedAt,
cover: toMediaImage('articles', raw.id, raw.cover, coverAlt),
category,
2026-09-11 11:25:14 +02:00
}
}
export default defineEventHandler(async (event): Promise<Paginated<ArticleSummary>> => {
const query = getQuery(event)
const page = pageParam(query.page)
const lang = langParam(query.lang)
2026-09-11 11:25:14 +02:00
const category = typeof query.category === 'string' ? query.category : null
const filters = []
if (category) filters.push(`category.slug = ${quote(category)}`)
// An English listing only ever shows articles that have actually been
// translated — never a partial/fallback entry, see docs/content-model.md.
if (lang === 'en') filters.push(`titleEn != ''`)
const filter = filters.length ? `&filter=${encodeURIComponent(filters.join(' && '))}` : ''
2026-09-11 11:25:14 +02:00
const response = await pbFetch<PbList<RawArticleSummary>>(
`/api/collections/articles/records?fields=${ARTICLE_SUMMARY_FIELDS}&expand=category&sort=-publishedAt&${pagination(page)}${filter}`
)
return {
items: response.items.map((raw) => toSummary(raw, lang)),
2026-09-11 11:25:14 +02:00
page: response.page,
pageCount: response.totalPages,
total: response.totalItems,
}
})