feature: caching
Some checks are pending
Deploy / deploy (push) Waiting to run

This commit is contained in:
Benno Tielen 2026-06-24 14:32:38 +02:00
parent bff425c3bd
commit afc6816451
3 changed files with 111 additions and 70 deletions

View file

@ -1,7 +1,10 @@
import { getPayload } from 'payload' import { getPayload } from 'payload'
import { unstable_cache } from 'next/cache'
import config from '@/payload.config' import config from '@/payload.config'
import { Announcement, Parish } from '@/payload-types' import { Announcement, Parish } from '@/payload-types'
const CACHE_TTL = 300 // 5 minutes
/** /**
* Fetch last announcement for a parish * Fetch last announcement for a parish
*/ */
@ -45,9 +48,8 @@ export const fetchLastAnnouncement = async (
/** /**
* Fetch the last announcement for each parish * Fetch the last announcement for each parish
*/ */
export const fetchLastAnnouncements = async (): Promise< export const fetchLastAnnouncements = unstable_cache(
Array<{ parish: Parish; doc: Announcement }> async (): Promise<Array<{ parish: Parish; doc: Announcement }>> => {
> => {
const payload = await getPayload({ config }) const payload = await getPayload({ config })
const parishes = await payload.find({ collection: 'parish', limit: 100 }) const parishes = await payload.find({ collection: 'parish', limit: 100 })
@ -61,4 +63,7 @@ export const fetchLastAnnouncements = async (): Promise<
return results.filter( return results.filter(
(r): r is { parish: Parish; doc: Announcement } => !!r, (r): r is { parish: Parish; doc: Announcement } => !!r,
) )
} },
['fetchLastAnnouncements'],
{ revalidate: CACHE_TTL },
)

View file

@ -1,7 +1,10 @@
import { getPayload } from 'payload' import { getPayload } from 'payload'
import { unstable_cache } from 'next/cache'
import config from '@/payload.config' import config from '@/payload.config'
import { Calendar, Parish } from '@/payload-types' import { Calendar, Parish } from '@/payload-types'
const CACHE_TTL = 300 // 5 minutes
/** /**
* Fetch last calendar for a parish * Fetch last calendar for a parish
*/ */
@ -45,9 +48,8 @@ export const fetchLastCalendar = async (
/** /**
* Fetch the last calendar for each parish * Fetch the last calendar for each parish
*/ */
export const fetchLastCalendars = async (): Promise< export const fetchLastCalendars = unstable_cache(
Array<{ parish: Parish; doc: Calendar }> async (): Promise<Array<{ parish: Parish; doc: Calendar }>> => {
> => {
const payload = await getPayload({ config }) const payload = await getPayload({ config })
const parishes = await payload.find({ collection: 'parish', limit: 100 }) const parishes = await payload.find({ collection: 'parish', limit: 100 })
@ -61,4 +63,7 @@ export const fetchLastCalendars = async (): Promise<
return results.filter( return results.filter(
(r): r is { parish: Parish; doc: Calendar } => !!r, (r): r is { parish: Parish; doc: Calendar } => !!r,
) )
} },
['fetchLastCalendars'],
{ revalidate: CACHE_TTL },
)

View file

@ -1,29 +1,39 @@
import { getPayload, PaginatedDocs } from 'payload' import { getPayload, PaginatedDocs } from 'payload'
import { unstable_cache } from 'next/cache'
import config from '@/payload.config' import config from '@/payload.config'
import { Worship } from '@/payload-types' import { Worship } from '@/payload-types'
const CACHE_TTL = 300 // 5 minutes
type FetchWorshipArgs = { type FetchWorshipArgs = {
fromDate?: Date fromDate?: Date
tillDate?: Date tillDate?: Date
locations?: string[] locations?: string[]
} }
export const fetchWorship = async ( // Resolved args use ISO strings so they serialize into a stable cache key.
args?: FetchWorshipArgs, type ResolvedWorshipArgs = {
): Promise<PaginatedDocs<Worship>> => { fromDate: string
const { fromDate, tillDate, locations } = args || {} tillDate?: string
locations?: string[]
}
let date = fromDate // Round down to the cache window so millisecond-precision dates produce a
if (!date) { // stable key for the duration of the TTL.
date = new Date() function roundDownToTtl(date: Date): Date {
date.setHours(0, 0, 0, 0) const ms = CACHE_TTL * 1000
} return new Date(Math.floor(date.getTime() / ms) * ms)
}
const getWorship = unstable_cache(
async (args: ResolvedWorshipArgs): Promise<PaginatedDocs<Worship>> => {
const { fromDate, tillDate, locations } = args
const query: any = { const query: any = {
and: [ and: [
{ {
date: { date: {
greater_than_equal: date.toISOString(), greater_than_equal: fromDate,
}, },
}, },
], ],
@ -32,7 +42,7 @@ export const fetchWorship = async (
if (tillDate) { if (tillDate) {
query.and.push({ query.and.push({
date: { date: {
less_than: tillDate.toISOString(), less_than: tillDate,
}, },
}) })
} }
@ -59,6 +69,27 @@ export const fetchWorship = async (
}, },
limit: 100, limit: 100,
}) as Promise<PaginatedDocs<Worship>> }) as Promise<PaginatedDocs<Worship>>
},
['fetchWorship'],
{ revalidate: CACHE_TTL },
)
export const fetchWorship = async (
args?: FetchWorshipArgs,
): Promise<PaginatedDocs<Worship>> => {
const { fromDate, tillDate, locations } = args || {}
let date = fromDate
if (!date) {
date = new Date()
date.setHours(0, 0, 0, 0)
}
return getWorship({
fromDate: roundDownToTtl(date).toISOString(),
tillDate: tillDate ? roundDownToTtl(tillDate).toISOString() : undefined,
locations,
})
} }
/** /**