fix(cms): filter unpublished relationships

This commit is contained in:
syntaxbullet
2026-07-31 14:10:44 +02:00
parent fec1bab2e5
commit b18bbbe36a
7 changed files with 467 additions and 22 deletions

View File

@@ -7,7 +7,8 @@ import type { SpaApplicationPhaseData } from '@/spa/applicationPhase'
import type { SpaNewsletterFormData } from '@/spa/newsletterForm'
import type { SpaSiteSettingsData } from '@/spa/siteSettings'
export type CmsRouteCollection = 'pages' | 'posts' | 'events' | 'preistraeger' | 'partners' | 'jury-mitglieder'
export type CmsRouteCollection =
'pages' | 'posts' | 'events' | 'preistraeger' | 'partners' | 'jury-mitglieder'
export type CmsRouteDoc = {
id: number | string
@@ -34,7 +35,13 @@ export type CmsRouteData = {
const CmsRouteContext = createContext<CmsRouteData | undefined>(undefined)
export function CmsRouteProvider({ children, value }: { children: React.ReactNode; value?: CmsRouteData }) {
export function CmsRouteProvider({
children,
value,
}: {
children: React.ReactNode
value?: CmsRouteData
}) {
return <CmsRouteContext.Provider value={value}>{children}</CmsRouteContext.Provider>
}
@@ -48,10 +55,17 @@ export function useCmsCollection(collection: CmsRouteCollection) {
export function resolveCmsRelationship(entry: unknown, docs: CmsRouteDoc[]) {
const entryID = entry && typeof entry === 'object' ? (entry as { id?: unknown }).id : entry
const populatedDoc = docs.find((doc) => String(doc.id) === String(entryID))
if (entryID === undefined || entryID === null) return undefined
if (populatedDoc) return populatedDoc
return entry && typeof entry === 'object' ? (entry as CmsRouteDoc) : undefined
return docs.find((doc) => String(doc.id) === String(entryID))
}
export function resolveCmsRelationships(entries: unknown, docs: CmsRouteDoc[]) {
if (!Array.isArray(entries)) return []
return entries
.map((entry) => resolveCmsRelationship(entry, docs))
.filter((doc): doc is CmsRouteDoc => Boolean(doc))
}
export function useApplicationPhase() {

View File

@@ -1,4 +1,4 @@
import { resolveCmsRelationship, type CmsRouteDoc } from '@/spa/cmsRoute'
import { resolveCmsRelationships, type CmsRouteDoc } from '@/spa/cmsRoute'
const FALLBACK_YEAR = 2025
const FALLBACK_LIMIT = 8
@@ -14,11 +14,8 @@ export function resolveHomeWinners(
fallbackWinners: FallbackWinner[],
) {
const selectedWinners = Array.isArray(featured) ? featured : []
const selectedWinnerDocs = selectedWinners
.map((selected) => resolveCmsRelationship(selected, cmsWinners))
.filter((winner): winner is CmsRouteDoc => Boolean(winner))
if (selectedWinnerDocs.length) return selectedWinnerDocs
if (selectedWinners.length) return resolveCmsRelationships(selectedWinners, cmsWinners)
return (cmsWinners.length ? cmsWinners : fallbackWinners)
.filter((winner) => Number(winner.year) === FALLBACK_YEAR)

View File

@@ -1,4 +1,4 @@
import { resolveCmsRelationship, type CmsRouteDoc } from '@/spa/cmsRoute'
import { resolveCmsRelationships, type CmsRouteDoc } from '@/spa/cmsRoute'
const hasText = (value: unknown) => typeof value === 'string' && value.trim().length > 0
@@ -6,12 +6,7 @@ export function selectJuryDocs(selection: unknown, docs: CmsRouteDoc[]) {
if (selection === undefined) return docs
if (!Array.isArray(selection)) return []
return selection
.map((entry) => resolveCmsRelationship(entry, docs))
.filter(
(member): member is CmsRouteDoc =>
Boolean(member && docs.some((doc) => String(doc.id) === String(member.id))),
)
return resolveCmsRelationships(selection, docs)
}
export function sortJuryMembersQuoteFirst<T extends object>(members: T[]) {
@@ -23,7 +18,8 @@ export function sortJuryMembersQuoteFirst<T extends object>(members: T[]) {
const quoteOrder = Number(hasText(bSortable.quote)) - Number(hasText(aSortable.quote))
if (quoteOrder !== 0) return quoteOrder
const sortOrder = Number(aSortable.sortOrder ?? a.index) - Number(bSortable.sortOrder ?? b.index)
const sortOrder =
Number(aSortable.sortOrder ?? a.index) - Number(bSortable.sortOrder ?? b.index)
return sortOrder !== 0 ? sortOrder : a.index - b.index
})
.map(({ member }) => member)