church-website/src/fetch/blog.ts
2025-09-09 16:23:00 +02:00

73 lines
No EOL
1.9 KiB
TypeScript

import { Blog } from '@/payload-types'
import { PaginatedDocs } from 'payload'
import { stringify } from 'qs-esm'
/**
* Fetches blog posts based on given criteria.
*
* @param {boolean} displayOnFrontpage - Indicates whether to display posts on the front page.
* @returns {Promise<PaginatedDocs<Blog> | undefined>} - A Promise that resolves to the paginated list of blog posts, or undefined if an error occurs.
*/
export const fetchBlogPosts = async (displayOnFrontpage: boolean): Promise<PaginatedDocs<Blog> | undefined> => {
const today = new Date();
today.setHours(23, 59);
const query: any =
{
sort: "-date",
select: {
title: true,
date: true,
photo: true,
content: displayOnFrontpage ? undefined : true, // hack to fetch content only for the `/blog` page
},
where: {
and: [
{
or: [
{
"configuration.displayFromDate": {
equals: null
}
},
{
"configuration.displayFromDate": {
less_than_equal: today.toISOString(),
}
}
]
},
{
or: [
{
"configuration.displayTillDate": {
equals: null
}
},
{
"configuration.displayTillDate": {
greater_than_equal: today.toISOString(),
}
}
]
}
],
},
limit: 18
};
if(displayOnFrontpage) {
query.where.and.push({
"configuration.showOnFrontpage": {
equals: true
},
})
}
const stringifiedQuery = stringify(query, {addQueryPrefix: true})
const resp = await fetch(`http://localhost:3000/api/blog${stringifiedQuery}`);
if (!resp.ok) return undefined;
return resp.json();
}