Strapi already records which admin user created an entry, so the byline needs no extra field to fill in: the Article content type sets populateCreatorFields and the API layer exposes only that user's firstname and lastname. The name also feeds the BlogPosting structured data. Also fixes the gap below the article header, which until now came from the cover image's margin and therefore vanished on articles without a cover, leaving the body text against the byline.
34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
/** Strapi query fragments. Only the fields the pages actually render are requested. */
|
|
|
|
const list = (prefix: string, names: readonly string[]) =>
|
|
names.map((name, i) => `${prefix}[${i}]=${name}`).join('&')
|
|
|
|
const IMAGE_FIELDS = ['url', 'alternativeText', 'width', 'height'] as const
|
|
|
|
export const ARTICLE_SUMMARY_QUERY = [
|
|
list('fields', ['title', 'slug', 'publishedAt']),
|
|
list('populate[cover][fields]', IMAGE_FIELDS),
|
|
list('populate[category][fields]', ['name', 'slug']),
|
|
'sort[0]=publishedAt:desc',
|
|
].join('&')
|
|
|
|
export const ARTICLE_DETAIL_QUERY = [
|
|
list('fields', ['title', 'slug', 'content', 'publishedAt']),
|
|
list('populate[cover][fields]', IMAGE_FIELDS),
|
|
list('populate[category][fields]', ['name', 'slug']),
|
|
// The byline is the admin user who created the entry; Strapi exposes the
|
|
// name fields only because the content type sets populateCreatorFields.
|
|
list('populate[createdBy][fields]', ['firstname', 'lastname']),
|
|
].join('&')
|
|
|
|
export const PAGE_SIZE = 12
|
|
|
|
export const pagination = (page: number, pageSize = PAGE_SIZE) =>
|
|
`pagination[page]=${page}&pagination[pageSize]=${pageSize}`
|
|
|
|
/** Reads a positive integer query param, falling back to 1. */
|
|
export const pageParam = (value: unknown): number => {
|
|
const page = Number(value)
|
|
return Number.isInteger(page) && page > 0 ? page : 1
|
|
}
|