Files
bmp-website-2026/src/scripts/preload-about-page-cms.ts
2026-07-31 14:51:11 +02:00

90 lines
2.8 KiB
TypeScript

import 'dotenv/config'
import config from '@payload-config'
import crypto from 'crypto'
import { getPayload, type Payload } from 'payload'
import { mediaByFilename } from './mediaByFilename'
import { aboutContent } from '@/spa/aboutContent'
const safeRemoteName = (url: string) => {
const parsed = new URL(url)
const ext = parsed.pathname.split('/').pop()?.includes('.') ? `.${parsed.pathname.split('.').pop()}` : '.jpg'
const hash = crypto.createHash('sha1').update(url).digest('hex').slice(0, 10)
return `${parsed.hostname.replace(/[^a-z0-9]+/gi, '-')}-${hash}${ext}`.toLowerCase()
}
const testimonialsWithImages = async (payload: Payload) => ({
...aboutContent.testimonials,
items: await Promise.all(
aboutContent.testimonials.items.map(async (item) => ({
...item,
image: await mediaByFilename(payload, safeRemoteName(item.imageUrl)),
})),
),
})
async function main() {
const payload = await getPayload({ config })
const pageResult = await payload.find({
collection: 'pages',
limit: 1,
pagination: false,
draft: true,
overrideAccess: true,
where: {
or: [{ spaPath: { equals: '/der-bmp' } }, { slug: { equals: 'der-bmp' } }, { slug: { equals: 'about' } }],
},
})
const page = pageResult.docs[0]
if (!page) throw new Error('About page not found. Expected spaPath=/der-bmp or slug=der-bmp/about.')
const [heroImage, prizeImage, mittelstandImage] = await Promise.all([
mediaByFilename(payload, aboutContent.hero.backgroundImageFilename),
mediaByFilename(payload, aboutContent.prize.imageFilename),
mediaByFilename(payload, aboutContent.mittelstand.imageFilename),
])
const { backgroundImageFilename: _heroFilename, ...heroContent } = aboutContent.hero
const { imageFilename: _prizeFilename, ...prizeContent } = aboutContent.prize
const { imageFilename: _mittelstandFilename, ...mittelstandContent } = aboutContent.mittelstand
const testimonials = await testimonialsWithImages(payload)
await payload.update({
collection: 'pages',
id: page.id,
overrideAccess: true,
context: { disableRevalidate: true },
data: {
about: {
...aboutContent,
hero: {
...heroContent,
backgroundImage: heroImage,
},
prize: {
...prizeContent,
image: prizeImage,
body: aboutContent.prize.body.map((text) => ({ text })),
},
mittelstand: {
...mittelstandContent,
image: mittelstandImage,
body: aboutContent.mittelstand.body.map((text) => ({ text })),
},
testimonials,
},
} as never,
})
payload.logger.info(`Preloaded About CMS fields for page ${page.id}`)
process.exit(0)
}
main().catch((error) => {
console.error(error)
process.exit(1)
})