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) })