90 lines
2.8 KiB
TypeScript
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)
|
|
})
|