mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-17 17:24:12 +00:00
984 lines
34 KiB
TypeScript
984 lines
34 KiB
TypeScript
import { getPayload } from 'payload'
|
||
import config from '../src/payload.config'
|
||
import path from 'path'
|
||
import fs from 'fs'
|
||
import https from 'https'
|
||
import http from 'http'
|
||
|
||
const downloadFile = (url: string, dest: string): Promise<void> => {
|
||
return new Promise((resolve, reject) => {
|
||
const file = fs.createWriteStream(dest)
|
||
const protocol = url.startsWith('https') ? https : http
|
||
protocol.get(url, (response) => {
|
||
if (response.statusCode === 301 || response.statusCode === 302) {
|
||
const redirectUrl = response.headers.location
|
||
if (redirectUrl) {
|
||
downloadFile(redirectUrl, dest).then(resolve).catch(reject)
|
||
return
|
||
}
|
||
}
|
||
response.pipe(file)
|
||
file.on('finish', () => {
|
||
file.close()
|
||
resolve()
|
||
})
|
||
}).on('error', (err) => {
|
||
fs.unlink(dest, () => {})
|
||
reject(err)
|
||
})
|
||
})
|
||
}
|
||
|
||
async function seed() {
|
||
console.log('Starting content migration...')
|
||
|
||
const payload = await getPayload({ config })
|
||
|
||
// Get tenant for porwoll
|
||
const tenants = await payload.find({
|
||
collection: 'tenants',
|
||
where: { slug: { equals: 'porwoll' } }
|
||
})
|
||
|
||
const tenantId = tenants.docs[0]?.id
|
||
if (!tenantId) {
|
||
console.error('Tenant "porwoll" not found!')
|
||
process.exit(1)
|
||
}
|
||
|
||
console.log(`Using tenant ID: ${tenantId}`)
|
||
|
||
// ============================================
|
||
// 1. SITE SETTINGS
|
||
// ============================================
|
||
console.log('\n--- Updating Site Settings ---')
|
||
|
||
const siteSettingsData = {
|
||
tenant: tenantId,
|
||
siteName: 'porwoll.de',
|
||
siteTagline: 'Die Webseite von Martin Porwoll',
|
||
contact: {
|
||
email: 'info@porwoll.de',
|
||
phone: '0800 80 44 100',
|
||
},
|
||
address: {
|
||
street: 'Hans-Böckler-Str. 19',
|
||
zip: '46236',
|
||
city: 'Bottrop',
|
||
country: 'Deutschland',
|
||
},
|
||
footer: {
|
||
copyrightText: 'Martin Porwoll',
|
||
showSocialLinks: true,
|
||
},
|
||
seo: {
|
||
defaultMetaTitle: 'porwoll.de | Die Webseite von Martin Porwoll',
|
||
defaultMetaDescription:
|
||
'Martin Porwoll - Whistleblower, Unternehmer, Mensch. Engagiert für Patientenwohl und Transparenz im Gesundheitswesen.',
|
||
},
|
||
}
|
||
|
||
const existingSiteSettings = await payload.find({
|
||
collection: 'site-settings',
|
||
where: { tenant: { equals: tenantId } },
|
||
limit: 1,
|
||
})
|
||
|
||
if (existingSiteSettings.docs.length > 0) {
|
||
await payload.update({
|
||
collection: 'site-settings',
|
||
id: existingSiteSettings.docs[0].id,
|
||
data: siteSettingsData as any,
|
||
})
|
||
} else {
|
||
await payload.create({
|
||
collection: 'site-settings',
|
||
data: siteSettingsData as any,
|
||
})
|
||
}
|
||
console.log('✓ Site Settings updated')
|
||
|
||
// ============================================
|
||
// 2. SOCIAL LINKS
|
||
// ============================================
|
||
console.log('\n--- Creating Social Links ---')
|
||
|
||
const socialLinks = [
|
||
{ platform: 'facebook', url: 'https://www.facebook.com/martinporwoll' },
|
||
{ platform: 'x', url: 'https://x.com/martinporwoll' },
|
||
{ platform: 'instagram', url: 'https://www.instagram.com/martinporwoll' },
|
||
{ platform: 'youtube', url: 'https://www.youtube.com/@martinporwoll' },
|
||
{ platform: 'linkedin', url: 'https://www.linkedin.com/in/martinporwoll' },
|
||
]
|
||
|
||
for (const link of socialLinks) {
|
||
const existing = await payload.find({
|
||
collection: 'social-links',
|
||
where: { platform: { equals: link.platform } }
|
||
})
|
||
|
||
if (existing.docs.length === 0) {
|
||
await payload.create({
|
||
collection: 'social-links',
|
||
data: {
|
||
...link,
|
||
isActive: true,
|
||
tenant: tenantId,
|
||
} as any,
|
||
})
|
||
console.log(`✓ Created social link: ${link.platform}`)
|
||
} else {
|
||
console.log(`- Social link ${link.platform} already exists`)
|
||
}
|
||
}
|
||
|
||
// ============================================
|
||
// 3. CATEGORIES
|
||
// ============================================
|
||
console.log('\n--- Creating Categories ---')
|
||
|
||
const categories = [
|
||
{ name: 'Whistleblowing', slug: 'whistleblowing', description: 'Artikel zum Thema Whistleblowing und Zytoskandal' },
|
||
{ name: 'Unternehmer', slug: 'unternehmer', description: 'Artikel über unternehmerische Aktivitäten' },
|
||
]
|
||
|
||
for (const cat of categories) {
|
||
const existing = await payload.find({
|
||
collection: 'categories',
|
||
where: { slug: { equals: cat.slug } }
|
||
})
|
||
|
||
if (existing.docs.length === 0) {
|
||
await payload.create({
|
||
collection: 'categories',
|
||
data: {
|
||
...cat,
|
||
tenant: tenantId,
|
||
} as any,
|
||
})
|
||
console.log(`✓ Created category: ${cat.name}`)
|
||
} else {
|
||
console.log(`- Category ${cat.name} already exists`)
|
||
}
|
||
}
|
||
|
||
// ============================================
|
||
// 4. MEDIA (Download and Upload)
|
||
// ============================================
|
||
console.log('\n--- Uploading Media ---')
|
||
|
||
const mediaDir = path.join(process.cwd(), 'temp-media')
|
||
if (!fs.existsSync(mediaDir)) {
|
||
fs.mkdirSync(mediaDir, { recursive: true })
|
||
}
|
||
|
||
const mediaFiles = [
|
||
{
|
||
url: 'https://porwoll.de/wp-content/uploads/2024/05/martin-porwoll-frontal-1-1168x768-1.webp',
|
||
filename: 'martin-porwoll-frontal.webp',
|
||
alt: 'Martin Porwoll - Portrait'
|
||
},
|
||
{
|
||
url: 'https://porwoll.de/wp-content/uploads/2024/05/gunshin-logo-1168x487-1.webp',
|
||
filename: 'gunshin-logo.webp',
|
||
alt: 'gunshin Holding UG Logo'
|
||
},
|
||
{
|
||
url: 'https://porwoll.de/wp-content/uploads/2024/05/cropped-Favicon-270x270.jpg',
|
||
filename: 'favicon.jpg',
|
||
alt: 'porwoll.de Favicon'
|
||
},
|
||
]
|
||
|
||
const uploadedMedia: Record<string, number> = {}
|
||
|
||
for (const media of mediaFiles) {
|
||
// Check if already exists
|
||
const existing = await payload.find({
|
||
collection: 'media',
|
||
where: { alt: { equals: media.alt } }
|
||
})
|
||
|
||
if (existing.docs.length > 0) {
|
||
uploadedMedia[media.filename] = existing.docs[0].id as number
|
||
console.log(`- Media ${media.alt} already exists (ID: ${existing.docs[0].id})`)
|
||
continue
|
||
}
|
||
|
||
const localPath = path.join(mediaDir, media.filename)
|
||
|
||
try {
|
||
console.log(` Downloading ${media.filename}...`)
|
||
await downloadFile(media.url, localPath)
|
||
|
||
console.log(` Uploading ${media.filename}...`)
|
||
const uploaded = await payload.create({
|
||
collection: 'media',
|
||
data: {
|
||
alt: media.alt,
|
||
tenant: tenantId,
|
||
} as any,
|
||
filePath: localPath,
|
||
})
|
||
|
||
uploadedMedia[media.filename] = uploaded.id as number
|
||
console.log(`✓ Uploaded media: ${media.alt} (ID: ${uploaded.id})`)
|
||
} catch (error) {
|
||
console.error(`✗ Failed to upload ${media.filename}:`, error)
|
||
}
|
||
}
|
||
|
||
// Clean up temp directory
|
||
try {
|
||
fs.rmSync(mediaDir, { recursive: true })
|
||
} catch (e) {}
|
||
|
||
// ============================================
|
||
// 5. PAGES
|
||
// ============================================
|
||
console.log('\n--- Creating Pages ---')
|
||
|
||
const pages = [
|
||
// Page 1: Home
|
||
{
|
||
title: 'Startseite',
|
||
slug: 'home',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'hero-block',
|
||
backgroundImage: uploadedMedia['martin-porwoll-frontal.webp'],
|
||
headline: '„Angst ist eine Reaktion, Mut eine Entscheidung"',
|
||
subline: 'Whistleblower | Unternehmer | Mensch',
|
||
alignment: 'center',
|
||
overlay: true,
|
||
cta: {
|
||
text: 'Mehr erfahren',
|
||
link: '/mensch',
|
||
style: 'primary',
|
||
},
|
||
},
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'heading',
|
||
tag: 'h2',
|
||
children: [{ type: 'text', text: 'Lebensaufgabe und Vision' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Das Patientenwohl wieder in den Mittelpunkt aller Bemühungen im Gesundheitswesen zu rücken, ist die zentrale Lebensaufgabe von Martin Porwoll.' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Er kämpft leidenschaftlich gegen Übertherapie und Fehlversorgung sowie Missbrauch im Gesundheitswesen und setzt sich für Transparenz, Gerechtigkeit und Integrität ein.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
{
|
||
blockType: 'card-grid-block',
|
||
headline: 'Unternehmer',
|
||
columns: '2',
|
||
cards: [
|
||
{
|
||
title: 'gunshin Holding UG',
|
||
description: 'Lernen Sie die Gunshin Holding kennen, die Start-ups im Gesundheitssektor unterstützt und dazu beiträgt, innovative Unternehmen auf das Wohl der Patienten auszurichten.',
|
||
link: '/gunshin-holding',
|
||
linkText: 'mehr',
|
||
image: uploadedMedia['gunshin-logo.webp'],
|
||
},
|
||
{
|
||
title: 'complex care solutions GmbH',
|
||
description: 'Entdecken Sie das Unternehmen, das Martin Porwoll gegründet hat, um das Wohl der Patienten in den Mittelpunkt zu stellen und Übertherapie und Fehlversorgung zu bekämpfen.',
|
||
link: '/complex-care-solutions',
|
||
linkText: 'mehr',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
blockType: 'quote-block',
|
||
quote: 'Sein Motto „Angst ist eine Reaktion, Mut eine Entscheidung" spiegelt seine Entschlossenheit wider, mutig für das Wohl der Patienten einzutreten.',
|
||
style: 'highlighted',
|
||
},
|
||
{
|
||
blockType: 'cta-block',
|
||
headline: 'Kontakt aufnehmen',
|
||
description: 'Haben Sie Fragen oder möchten Sie mehr erfahren?',
|
||
backgroundColor: 'dark',
|
||
buttons: [
|
||
{ text: 'Kontakt', link: '/kontakt', style: 'primary' },
|
||
],
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'porwoll.de | Die Webseite von Martin Porwoll',
|
||
metaDescription: 'Martin Porwoll - Whistleblower im Zytoskandal Bottrop, Unternehmer und Kämpfer für Patientenwohl. Transparenz, Gerechtigkeit und Integrität im Gesundheitswesen.',
|
||
},
|
||
},
|
||
// Page 2: Mensch
|
||
{
|
||
title: 'Mensch',
|
||
slug: 'mensch',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'hero-block',
|
||
backgroundImage: uploadedMedia['martin-porwoll-frontal.webp'],
|
||
headline: 'Martin Porwoll',
|
||
subline: 'Mensch',
|
||
alignment: 'center',
|
||
overlay: true,
|
||
},
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Martin Porwoll ist ein engagierter Unternehmer im Gesundheitswesen und der entscheidende Whistleblower im Zytoskandal Bottrop. Seine Erfahrungen und sein unermüdlicher Einsatz für das Patientenwohl haben ihn zu einem inspirierenden Vorbild und einem wichtigen Akteur in der Branche gemacht.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
{
|
||
blockType: 'image-text-block',
|
||
image: uploadedMedia['martin-porwoll-frontal.webp'],
|
||
imagePosition: 'left',
|
||
headline: 'Persönlicher Hintergrund',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Martin Porwoll wurde in Bottrop, Deutschland, geboren und wuchs in einer Familie auf, die Wert auf soziale Verantwortung und Integrität legte. Diese Werte prägten seine Entscheidung, im Gesundheitswesen tätig zu werden und sich dafür einzusetzen, dass das Wohl der Patienten im Mittelpunkt steht.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
cta: {
|
||
text: 'Mehr zum Leben',
|
||
link: '/leben',
|
||
},
|
||
},
|
||
{
|
||
blockType: 'image-text-block',
|
||
imagePosition: 'right',
|
||
headline: 'Whistleblower im Zytoskandal Bottrop',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Im Jahr 2016 machte Martin Porwoll als Whistleblower im Zytoskandal Bottrop Schlagzeilen. Er war maßgeblich daran beteiligt, einen groß angelegten Betrug in der Krebsmedikamentenversorgung aufzudecken, bei dem tausende Patienten betroffen waren. Martin Porwolls Mut und seine Entschlossenheit, das Richtige zu tun, führten zur Aufklärung des Skandals und zu weitreichenden Veränderungen im deutschen Gesundheitswesen.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
cta: {
|
||
text: 'Zum Zytoskandal',
|
||
link: '/zytoskandal',
|
||
},
|
||
},
|
||
{
|
||
blockType: 'card-grid-block',
|
||
headline: 'Unternehmerische Tätigkeiten',
|
||
columns: '2',
|
||
cards: [
|
||
{
|
||
title: 'complex care solutions GmbH',
|
||
description: 'Nach dem Zytoskandal gründete Martin Porwoll die complex care solutions GmbH, ein Unternehmen, das sich darauf konzentriert, Patientenwohl in den Vordergrund zu stellen.',
|
||
link: '/complex-care-solutions',
|
||
linkText: 'mehr',
|
||
},
|
||
{
|
||
title: 'gunshin Holding UG',
|
||
description: 'Zusätzlich gründete Martin Porwoll die gunshin Holding, die Start-ups im Gesundheitswesen unterstützt.',
|
||
link: '/gunshin-holding',
|
||
linkText: 'mehr',
|
||
},
|
||
],
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'Martin Porwoll - Mensch | porwoll.de',
|
||
metaDescription: 'Erfahren Sie mehr über Martin Porwoll - seinen persönlichen Hintergrund, seine Rolle als Whistleblower und seine unternehmerischen Aktivitäten im Gesundheitswesen.',
|
||
},
|
||
},
|
||
// Page 3: Kontakt
|
||
{
|
||
title: 'Kontakt',
|
||
slug: 'kontakt',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'heading',
|
||
tag: 'h2',
|
||
children: [{ type: 'text', text: 'Lassen Sie uns reden!' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Haben Sie Fragen, Anregungen oder möchten Sie mehr über die Arbeit von Martin Porwoll, den Zytoskandal Bottrop oder die complex care solutions GmbH erfahren?' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Wir freuen uns von Ihnen zu hören! Zögern Sie nicht, uns zu kontaktieren – unser Team steht Ihnen gerne zur Verfügung und beantwortet Ihre Fragen.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
{
|
||
blockType: 'contact-form-block',
|
||
headline: 'Kontakt',
|
||
description: 'Schreiben Sie uns eine Nachricht',
|
||
recipientEmail: 'info@porwoll.de',
|
||
showPhone: true,
|
||
showAddress: true,
|
||
showSocials: true,
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'Kontakt | porwoll.de',
|
||
metaDescription: 'Kontaktieren Sie Martin Porwoll - Telefon, E-Mail oder Kontaktformular. Wir freuen uns auf Ihre Nachricht.',
|
||
},
|
||
},
|
||
// Page 4: Whistleblowing
|
||
{
|
||
title: 'Whistleblowing',
|
||
slug: 'whistleblowing',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'hero-block',
|
||
headline: 'Whistleblowing',
|
||
subline: 'Mut zur Wahrheit',
|
||
alignment: 'center',
|
||
overlay: true,
|
||
},
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'heading',
|
||
tag: 'h2',
|
||
children: [{ type: 'text', text: 'Was ist Whistleblowing?' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Whistleblowing bezeichnet das Aufdecken von Missständen, illegalen Praktiken oder Gefahren für die Öffentlichkeit durch Insider. Whistleblower setzen sich oft großen persönlichen Risiken aus, um die Wahrheit ans Licht zu bringen.' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Martin Porwoll wurde 2016 zum Whistleblower, als er den größten Pharma-Skandal der deutschen Nachkriegsgeschichte aufdeckte.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
{
|
||
blockType: 'cta-block',
|
||
headline: 'Der Zytoskandal Bottrop',
|
||
description: 'Erfahren Sie mehr über den Fall, der das deutsche Gesundheitswesen erschütterte.',
|
||
backgroundColor: 'dark',
|
||
buttons: [
|
||
{ text: 'Zum Zytoskandal', link: '/zytoskandal', style: 'primary' },
|
||
],
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'Whistleblowing | porwoll.de',
|
||
metaDescription: 'Whistleblowing - Mut zur Wahrheit. Erfahren Sie mehr über Martin Porwolls Rolle als Whistleblower im Zytoskandal Bottrop.',
|
||
},
|
||
},
|
||
// Page 5: Zytoskandal
|
||
{
|
||
title: 'Zytoskandal Bottrop',
|
||
slug: 'zytoskandal',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'hero-block',
|
||
headline: 'Der Zytoskandal Bottrop',
|
||
subline: 'Der größte Pharma-Skandal der deutschen Nachkriegsgeschichte',
|
||
alignment: 'center',
|
||
overlay: true,
|
||
},
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'heading',
|
||
tag: 'h2',
|
||
children: [{ type: 'text', text: 'Was geschah?' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Im Jahr 2016 wurde aufgedeckt, dass ein Apotheker in Bottrop über Jahre hinweg Krebsmedikamente gestreckt oder durch Kochsalzlösung ersetzt hatte. Tausende Krebspatienten erhielten unwirksame Behandlungen.' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Martin Porwoll, damals kaufmännischer Leiter der Apotheke, war maßgeblich an der Aufdeckung dieses Skandals beteiligt.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
{
|
||
blockType: 'timeline-block',
|
||
headline: 'Chronologie der Ereignisse',
|
||
events: [
|
||
{ year: '2016', title: 'Aufdeckung', description: 'Martin Porwoll bemerkt Unregelmäßigkeiten und beginnt zu recherchieren' },
|
||
{ year: '2016', title: 'Anzeige', description: 'Der Fall wird den Behörden gemeldet' },
|
||
{ year: '2017', title: 'Verhaftung', description: 'Der verantwortliche Apotheker wird verhaftet' },
|
||
{ year: '2018', title: 'Verurteilung', description: 'Verurteilung zu 12 Jahren Haft' },
|
||
],
|
||
},
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'heading',
|
||
tag: 'h2',
|
||
children: [{ type: 'text', text: 'Die Folgen' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Der Zytoskandal führte zu weitreichenden Änderungen im deutschen Gesundheitswesen:' }],
|
||
},
|
||
{
|
||
type: 'list',
|
||
listType: 'bullet',
|
||
children: [
|
||
{ type: 'listitem', children: [{ type: 'text', text: 'Verschärfte Kontrollen bei der Herstellung von Krebsmedikamenten' }] },
|
||
{ type: 'listitem', children: [{ type: 'text', text: 'Neue gesetzliche Regelungen zum Schutz von Whistleblowern' }] },
|
||
{ type: 'listitem', children: [{ type: 'text', text: 'Erhöhtes Bewusstsein für Patientensicherheit' }] },
|
||
],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'Zytoskandal Bottrop | porwoll.de',
|
||
metaDescription: 'Der Zytoskandal Bottrop - wie Martin Porwoll den größten Pharma-Skandal der deutschen Nachkriegsgeschichte aufdeckte.',
|
||
},
|
||
},
|
||
// Page 6: gunshin Holding
|
||
{
|
||
title: 'gunshin Holding UG',
|
||
slug: 'gunshin-holding',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'hero-block',
|
||
backgroundImage: uploadedMedia['gunshin-logo.webp'],
|
||
headline: 'gunshin Holding UG',
|
||
alignment: 'center',
|
||
overlay: true,
|
||
},
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Die gunshin Holding UG, gegründet von Martin Porwoll, ist eine Beteiligungsgesellschaft, die sich auf die Unterstützung und Förderung von Start-ups und jungen Unternehmen im Gesundheitswesen konzentriert.' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Die Holding hat es sich zur Aufgabe gemacht, innovative Ideen und Lösungen zu fördern, die das Wohl des Patienten in den Mittelpunkt stellen und einen positiven Einfluss auf die Branche haben.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
{
|
||
blockType: 'card-grid-block',
|
||
headline: 'Unsere Leistungen',
|
||
columns: '3',
|
||
cards: [
|
||
{
|
||
title: 'Strategische Beratung',
|
||
description: 'Die gunshin Holding UG bietet den Start-Ups wertvolle strategische Beratung und unterstützt sie bei der Entwicklung von Geschäftsmodellen, Markteintrittsstrategien und Wachstumsplänen.',
|
||
},
|
||
{
|
||
title: 'Netzwerk und Partnerschaften',
|
||
description: 'Die Holding ermöglicht den Start-Ups den Zugang zu einem breiten Netzwerk von Experten, Partnern und potenziellen Kunden, um die Erfolgschancen zu erhöhen.',
|
||
},
|
||
{
|
||
title: 'Ressourcen und Infrastruktur',
|
||
description: 'Die gunshin Holding UG stellt den Start-Ups Ressourcen wie Büroräume, technische Infrastruktur und administrative Unterstützung zur Verfügung.',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
blockType: 'cta-block',
|
||
headline: 'gunshin Holding',
|
||
description: 'Besuchen Sie die Webseite der gunshin Holding',
|
||
backgroundColor: 'dark',
|
||
buttons: [
|
||
{ text: 'Zur gunshin.de', link: 'https://gunshin.de', style: 'primary' },
|
||
],
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'gunshin Holding UG | porwoll.de',
|
||
metaDescription: 'Die gunshin Holding UG unterstützt innovative Start-ups im Gesundheitswesen. Strategische Beratung, Netzwerk und Ressourcen für Unternehmen mit Fokus auf Patientenwohl.',
|
||
},
|
||
},
|
||
// Page 7: complex care solutions
|
||
{
|
||
title: 'complex care solutions GmbH',
|
||
slug: 'complex-care-solutions',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'hero-block',
|
||
headline: 'complex care solutions GmbH',
|
||
subline: 'Patientenwohl im Mittelpunkt',
|
||
alignment: 'center',
|
||
overlay: true,
|
||
},
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Die complex care solutions GmbH wurde von Martin Porwoll gegründet, um das Wohl der Patienten in den Mittelpunkt zu stellen und Übertherapie sowie Fehlversorgung aktiv zu bekämpfen.' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Das Unternehmen arbeitet eng mit medizinischen Einrichtungen, Krankenkassen und anderen Akteuren im Gesundheitswesen zusammen, um bessere und sicherere Versorgungslösungen für Patienten zu entwickeln.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
{
|
||
blockType: 'cta-block',
|
||
headline: 'Mehr erfahren',
|
||
description: 'Besuchen Sie die Webseite der complex care solutions GmbH',
|
||
backgroundColor: 'dark',
|
||
buttons: [
|
||
{ text: 'Zur complexcaresolutions.de', link: 'https://complexcaresolutions.de', style: 'primary' },
|
||
],
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'complex care solutions GmbH | porwoll.de',
|
||
metaDescription: 'Die complex care solutions GmbH - gegründet von Martin Porwoll für Patientenwohl und gegen Übertherapie im Gesundheitswesen.',
|
||
},
|
||
},
|
||
// Page 8: Leben
|
||
{
|
||
title: 'Leben',
|
||
slug: 'leben',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'hero-block',
|
||
headline: 'Leben',
|
||
subline: '„Angst ist eine Reaktion, Mut eine Entscheidung"',
|
||
alignment: 'center',
|
||
overlay: true,
|
||
},
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'medium',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Diese Seite wird noch mit Inhalten gefüllt.' }],
|
||
},
|
||
{
|
||
type: 'paragraph',
|
||
children: [{ type: 'text', text: 'Hier wird Martin Porwolls persönlicher Werdegang und seine Lebensgeschichte präsentiert.' }],
|
||
},
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'Leben | porwoll.de',
|
||
metaDescription: 'Das Leben von Martin Porwoll - persönlicher Werdegang und Geschichte.',
|
||
},
|
||
},
|
||
// Page 9: Impressum
|
||
{
|
||
title: 'Impressum',
|
||
slug: 'impressum',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'narrow',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{ type: 'heading', tag: 'h2', children: [{ type: 'text', text: 'Impressum' }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Angaben gemäß § 5 TMG', format: 1 }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Martin Porwoll\nHans-Böckler-Str. 19\n46236 Bottrop' }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Kontakt', format: 1 }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Telefon: 0800 80 44 100\nE-Mail: info@porwoll.de' }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV', format: 1 }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Martin Porwoll\nHans-Böckler-Str. 19\n46236 Bottrop' }] },
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'Impressum | porwoll.de',
|
||
metaDescription: 'Impressum der Webseite porwoll.de',
|
||
},
|
||
},
|
||
// Page 10: Datenschutz
|
||
{
|
||
title: 'Datenschutzerklärung',
|
||
slug: 'datenschutz',
|
||
status: 'published',
|
||
hero: {},
|
||
layout: [
|
||
{
|
||
blockType: 'text-block',
|
||
width: 'narrow',
|
||
content: {
|
||
root: {
|
||
type: 'root',
|
||
children: [
|
||
{ type: 'heading', tag: 'h2', children: [{ type: 'text', text: 'Datenschutzerklärung' }] },
|
||
{ type: 'heading', tag: 'h3', children: [{ type: 'text', text: '1. Datenschutz auf einen Blick' }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Allgemeine Hinweise', format: 1 }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können.' }] },
|
||
{ type: 'heading', tag: 'h3', children: [{ type: 'text', text: '2. Hosting' }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Diese Website wird auf eigenen Servern in Deutschland gehostet.' }] },
|
||
{ type: 'heading', tag: 'h3', children: [{ type: 'text', text: '3. Kontaktformular' }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: 'Wenn Sie uns per Kontaktformular Anfragen zukommen lassen, werden Ihre Angaben aus dem Anfrageformular inklusive der von Ihnen dort angegebenen Kontaktdaten zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.' }] },
|
||
{ type: 'paragraph', children: [{ type: 'text', text: '(Diese Datenschutzerklärung ist ein Platzhalter und muss durch eine vollständige, rechtskonforme Version ersetzt werden.)', format: 2 }] },
|
||
],
|
||
direction: 'ltr',
|
||
format: '',
|
||
indent: 0,
|
||
version: 1,
|
||
},
|
||
},
|
||
},
|
||
],
|
||
seo: {
|
||
metaTitle: 'Datenschutzerklärung | porwoll.de',
|
||
metaDescription: 'Datenschutzerklärung der Webseite porwoll.de',
|
||
},
|
||
},
|
||
]
|
||
|
||
for (const page of pages) {
|
||
const existing = await payload.find({
|
||
collection: 'pages',
|
||
where: { slug: { equals: page.slug } }
|
||
})
|
||
|
||
if (existing.docs.length > 0) {
|
||
console.log(`- Page "${page.title}" already exists, updating...`)
|
||
await payload.update({
|
||
collection: 'pages',
|
||
id: existing.docs[0].id,
|
||
data: {
|
||
...page,
|
||
tenant: tenantId,
|
||
} as any,
|
||
})
|
||
console.log(`✓ Updated page: ${page.title}`)
|
||
} else {
|
||
await payload.create({
|
||
collection: 'pages',
|
||
data: {
|
||
...page,
|
||
tenant: tenantId,
|
||
} as any,
|
||
})
|
||
console.log(`✓ Created page: ${page.title}`)
|
||
}
|
||
}
|
||
|
||
// ============================================
|
||
// 6. NAVIGATION
|
||
// ============================================
|
||
console.log('\n--- Configuring Navigation ---')
|
||
|
||
// Get page IDs
|
||
const pageIds: Record<string, number> = {}
|
||
const allPages = await payload.find({ collection: 'pages', limit: 100 })
|
||
for (const p of allPages.docs) {
|
||
pageIds[p.slug] = p.id as number
|
||
}
|
||
|
||
const navigationData = {
|
||
tenant: tenantId,
|
||
title: 'Hauptnavigation',
|
||
mainMenu: [
|
||
{
|
||
label: 'Whistleblowing',
|
||
type: 'submenu',
|
||
submenu: [
|
||
{ label: 'Zytoskandal', linkType: 'page', page: pageIds['zytoskandal'] },
|
||
{ label: 'Whistleblowing', linkType: 'page', page: pageIds['whistleblowing'] },
|
||
],
|
||
},
|
||
{
|
||
label: 'Unternehmer',
|
||
type: 'submenu',
|
||
submenu: [
|
||
{ label: 'gunshin Holding UG', linkType: 'page', page: pageIds['gunshin-holding'] },
|
||
{ label: 'complex care solutions GmbH', linkType: 'page', page: pageIds['complex-care-solutions'] },
|
||
],
|
||
},
|
||
{
|
||
label: 'Mensch',
|
||
type: 'page',
|
||
page: pageIds['mensch'],
|
||
},
|
||
{
|
||
label: 'Kontakt',
|
||
type: 'page',
|
||
page: pageIds['kontakt'],
|
||
},
|
||
],
|
||
footerMenu: [
|
||
{ label: 'Impressum', linkType: 'page', page: pageIds['impressum'] },
|
||
{ label: 'Datenschutzerklärung', linkType: 'page', page: pageIds['datenschutz'] },
|
||
],
|
||
}
|
||
|
||
const existingNavigation = await payload.find({
|
||
collection: 'navigations',
|
||
where: { tenant: { equals: tenantId } },
|
||
limit: 1,
|
||
})
|
||
|
||
if (existingNavigation.docs.length > 0) {
|
||
await payload.update({
|
||
collection: 'navigations',
|
||
id: existingNavigation.docs[0].id,
|
||
data: navigationData as any,
|
||
})
|
||
} else {
|
||
await payload.create({
|
||
collection: 'navigations',
|
||
data: navigationData as any,
|
||
})
|
||
}
|
||
console.log('✓ Navigation configured')
|
||
|
||
console.log('\n========================================')
|
||
console.log('Content migration completed successfully!')
|
||
console.log('========================================')
|
||
|
||
process.exit(0)
|
||
}
|
||
|
||
seed().catch((error) => {
|
||
console.error('Migration failed:', error)
|
||
process.exit(1)
|
||
})
|