mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-17 17:24:12 +00:00
feat(BlogWoman): add tenant seed scripts and block migrations
- Add migration for BlogWoman page blocks (favorites-block, series-block, series-detail-block, featured-content-block) with all required columns - Add seed scripts for BlogWoman tenant creation with full content: - 10 pages (Startseite, Über mich, Newsletter, etc.) - 7 blog posts - 9 series (GRFI, Investment-Piece, Pleasure P&L, etc.) - 4 categories, 10 tags, 1 author - Navigation, social links, cookie configuration - Add Konzept-KI guide for AI-assisted tenant creation - Add BlogWoman tenant prompt template Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
0a840f9033
commit
15f3fa2481
7 changed files with 5306 additions and 0 deletions
805
docs/KONZEPT-KI-ANLEITUNG.md
Normal file
805
docs/KONZEPT-KI-ANLEITUNG.md
Normal file
|
|
@ -0,0 +1,805 @@
|
||||||
|
# Anleitung: Prompt-Erstellung für Tenant-Setup in Payload CMS
|
||||||
|
|
||||||
|
Diese Anleitung erklärt, wie du als Konzept-KI einen strukturierten Prompt für Claude Code erstellen kannst, um einen neuen Tenant im Payload CMS anzulegen und mit Inhalten zu befüllen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Projektkontext
|
||||||
|
|
||||||
|
Das Payload CMS ist ein Multi-Tenant-fähiges Headless CMS mit folgenden Eigenschaften:
|
||||||
|
|
||||||
|
- **Framework:** Payload 3.69.0 + Next.js 15.5.9
|
||||||
|
- **Datenbank:** PostgreSQL 17
|
||||||
|
- **Sprachen:** Deutsch (de, Standard) und Englisch (en)
|
||||||
|
- **Tenant-Isolation:** Jede Collection ist automatisch tenant-spezifisch
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Prompt-Struktur
|
||||||
|
|
||||||
|
Erstelle deinen Prompt nach folgendem Schema:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Tenant-Informationen
|
||||||
|
|
||||||
|
**Name:** [Firmenname]
|
||||||
|
**Slug:** [url-freundlicher-name]
|
||||||
|
**Domain(s):** [domain1.de, domain2.com]
|
||||||
|
|
||||||
|
### E-Mail-Konfiguration (optional)
|
||||||
|
- From-Adresse: [email]
|
||||||
|
- From-Name: [Name]
|
||||||
|
- Reply-To: [email]
|
||||||
|
- Eigener SMTP: [ja/nein]
|
||||||
|
- Host: [smtp.example.com]
|
||||||
|
- Port: [587]
|
||||||
|
- User: [user]
|
||||||
|
- Passwort: [pass]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Inhalte
|
||||||
|
|
||||||
|
### Site-Settings
|
||||||
|
- Logo: [Beschreibung/URL]
|
||||||
|
- Favicon: [Beschreibung/URL]
|
||||||
|
- Primärfarbe: [#hex]
|
||||||
|
- Sekundärfarbe: [#hex]
|
||||||
|
- Footer-Text: [Text]
|
||||||
|
|
||||||
|
### Navigation
|
||||||
|
[Liste der Menüpunkte mit Links]
|
||||||
|
|
||||||
|
### Seiten
|
||||||
|
[Für jede Seite: Titel, Slug, Blocks]
|
||||||
|
|
||||||
|
### Blog-Posts (optional)
|
||||||
|
[Für jeden Post: Titel, Kategorie, Inhalt]
|
||||||
|
|
||||||
|
### Weitere Inhalte
|
||||||
|
[Services, Team, Testimonials, etc.]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Verfügbare Collections
|
||||||
|
|
||||||
|
### Kern-Collections
|
||||||
|
| Collection | Beschreibung | Wichtige Felder |
|
||||||
|
|------------|--------------|-----------------|
|
||||||
|
| `tenants` | Tenant-Konfiguration | name, slug, domains, email |
|
||||||
|
| `site-settings` | Website-Einstellungen | logo, colors, footer, contact |
|
||||||
|
| `navigations` | Menü-Strukturen | items (array mit label, link, children) |
|
||||||
|
| `pages` | Website-Seiten | title, slug, blocks (array) |
|
||||||
|
| `media` | Bilder/Dateien | file, alt, caption |
|
||||||
|
|
||||||
|
### Content-Collections
|
||||||
|
| Collection | Beschreibung | Wichtige Felder |
|
||||||
|
|------------|--------------|-----------------|
|
||||||
|
| `posts` | Blog-Artikel | title, content, categories, tags, authors, type |
|
||||||
|
| `categories` | Post-Kategorien | name, slug |
|
||||||
|
| `tags` | Post-Tags | name, slug |
|
||||||
|
| `authors` | Autoren | name, bio, image |
|
||||||
|
| `testimonials` | Kundenstimmen | quote, author, company, rating |
|
||||||
|
| `faqs` | FAQ-Einträge | question, answer |
|
||||||
|
| `team` | Team-Mitglieder | name, position, bio, image |
|
||||||
|
| `services` | Dienstleistungen | title, description, icon |
|
||||||
|
| `service-categories` | Service-Kategorien | name, slug |
|
||||||
|
|
||||||
|
### Erweiterte Collections
|
||||||
|
| Collection | Beschreibung | Wichtige Felder |
|
||||||
|
|------------|--------------|-----------------|
|
||||||
|
| `portfolios` | Portfolio-Einträge | title, images, description, category |
|
||||||
|
| `products` | Produkte | name, price, description, images |
|
||||||
|
| `events` | Veranstaltungen | title, date, location, description |
|
||||||
|
| `jobs` | Stellenangebote | title, department, description, requirements |
|
||||||
|
| `locations` | Standorte | name, address, coordinates, hours |
|
||||||
|
| `partners` | Partner/Logos | name, logo, website |
|
||||||
|
| `downloads` | Downloads | title, file, description |
|
||||||
|
| `videos` | Video-Bibliothek | title, source (youtube/vimeo/upload), url |
|
||||||
|
| `timelines` | Zeitstrahlen | title, type, entries |
|
||||||
|
| `workflows` | Prozesse | title, phases, steps |
|
||||||
|
|
||||||
|
### Formular & Newsletter
|
||||||
|
| Collection | Beschreibung |
|
||||||
|
|------------|--------------|
|
||||||
|
| `forms` | Formular-Builder |
|
||||||
|
| `newsletter-subscribers` | Newsletter-Abonnenten |
|
||||||
|
|
||||||
|
### Spezial-Collections (tenant-spezifisch)
|
||||||
|
| Collection | Tenant | Beschreibung |
|
||||||
|
|------------|--------|--------------|
|
||||||
|
| `bookings` | porwoll.de | Fotografie-Buchungen |
|
||||||
|
| `certifications` | c2s | Zertifizierungen |
|
||||||
|
| `projects` | gunshin | Spieleprojekte |
|
||||||
|
| `favorites` | BlogWoman | Affiliate-Produkte |
|
||||||
|
| `series` | BlogWoman | YouTube-Serien |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Verfügbare Blocks (42 Stück)
|
||||||
|
|
||||||
|
### Layout-Blocks
|
||||||
|
```
|
||||||
|
hero-block - Hero-Banner mit Bild
|
||||||
|
hero-slider-block - Hero-Slider mit mehreren Slides
|
||||||
|
image-slider-block - Bild-Karussell
|
||||||
|
text-block - Rich-Text-Inhalt
|
||||||
|
image-text-block - Bild + Text nebeneinander
|
||||||
|
card-grid-block - Karten-Raster
|
||||||
|
quote-block - Zitat/Blockquote
|
||||||
|
cta-block - Call-to-Action Button
|
||||||
|
divider-block - Visueller Trenner
|
||||||
|
```
|
||||||
|
|
||||||
|
### Media-Blocks
|
||||||
|
```
|
||||||
|
video-block - Video (YouTube/Vimeo/Upload)
|
||||||
|
video-embed-block - Video-Einbettung mit Privacy-Mode
|
||||||
|
```
|
||||||
|
|
||||||
|
### Content-Blocks
|
||||||
|
```
|
||||||
|
posts-list-block - Blog-Post-Liste mit Pagination
|
||||||
|
testimonials-block - Testimonial-Karussell
|
||||||
|
newsletter-block - Newsletter-Anmeldung
|
||||||
|
process-steps-block - Schritt-für-Schritt-Prozess
|
||||||
|
faq-block - FAQ-Akkordeon
|
||||||
|
team-block - Team-Mitglieder-Grid
|
||||||
|
services-block - Service-Auflistung
|
||||||
|
```
|
||||||
|
|
||||||
|
### Blog-Blocks
|
||||||
|
```
|
||||||
|
author-bio-block - Autoren-Info
|
||||||
|
related-posts-block - Verwandte Artikel
|
||||||
|
share-buttons-block - Social-Share-Buttons
|
||||||
|
table-of-contents-block - Inhaltsverzeichnis
|
||||||
|
```
|
||||||
|
|
||||||
|
### Team-Blocks
|
||||||
|
```
|
||||||
|
team-filter-block - Team mit Filter
|
||||||
|
org-chart-block - Organigramm
|
||||||
|
```
|
||||||
|
|
||||||
|
### Feature-Blocks
|
||||||
|
```
|
||||||
|
locations-block - Standorte mit Karte
|
||||||
|
logo-grid-block - Partner-/Kunden-Logos
|
||||||
|
stats-block - Statistiken/Zahlen
|
||||||
|
jobs-block - Stellenangebote
|
||||||
|
downloads-block - Download-Bereich
|
||||||
|
map-block - Karten-Einbettung
|
||||||
|
events-block - Veranstaltungs-Kalender
|
||||||
|
pricing-block - Preis-Tabellen
|
||||||
|
tabs-block - Tab-Inhalte
|
||||||
|
accordion-block - Akkordeon-Sektionen
|
||||||
|
comparison-block - Vergleichs-Tabellen
|
||||||
|
timeline-block - Zeitleisten-Visualisierung
|
||||||
|
before-after-block - Vorher/Nachher-Vergleich
|
||||||
|
```
|
||||||
|
|
||||||
|
### BlogWoman-Blocks
|
||||||
|
```
|
||||||
|
favorites-block - Affiliate-Produkte
|
||||||
|
series-block - YouTube-Serien-Übersicht
|
||||||
|
series-detail-block - Einzelne Serie mit Hero
|
||||||
|
featured-content-block - Kuratierte Inhalte
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Block-Konfiguration (Details)
|
||||||
|
|
||||||
|
### hero-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "hero-block",
|
||||||
|
"heading": "Willkommen",
|
||||||
|
"subheading": "Untertitel",
|
||||||
|
"backgroundImage": "<media-id>",
|
||||||
|
"ctaText": "Mehr erfahren",
|
||||||
|
"ctaLink": "/ueber-uns",
|
||||||
|
"alignment": "center",
|
||||||
|
"overlay": true,
|
||||||
|
"overlayOpacity": 0.5
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### hero-slider-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "hero-slider-block",
|
||||||
|
"slides": [
|
||||||
|
{
|
||||||
|
"heading": "Slide 1",
|
||||||
|
"subheading": "Text",
|
||||||
|
"backgroundImage": "<media-id>",
|
||||||
|
"ctaText": "Button",
|
||||||
|
"ctaLink": "/link"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"autoplay": true,
|
||||||
|
"autoplaySpeed": 5000,
|
||||||
|
"showDots": true,
|
||||||
|
"showArrows": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### text-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "text-block",
|
||||||
|
"content": {
|
||||||
|
"root": {
|
||||||
|
"type": "root",
|
||||||
|
"children": [
|
||||||
|
{
|
||||||
|
"type": "paragraph",
|
||||||
|
"children": [{"text": "Ihr Text hier..."}]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### image-text-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "image-text-block",
|
||||||
|
"image": "<media-id>",
|
||||||
|
"heading": "Überschrift",
|
||||||
|
"content": "<rich-text>",
|
||||||
|
"imagePosition": "left",
|
||||||
|
"ctaText": "Button",
|
||||||
|
"ctaLink": "/link"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### card-grid-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "card-grid-block",
|
||||||
|
"cards": [
|
||||||
|
{
|
||||||
|
"title": "Karte 1",
|
||||||
|
"description": "Beschreibung",
|
||||||
|
"image": "<media-id>",
|
||||||
|
"link": "/link"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"columns": 3
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### faq-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "faq-block",
|
||||||
|
"heading": "Häufige Fragen",
|
||||||
|
"faqs": ["<faq-id-1>", "<faq-id-2>"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### testimonials-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "testimonials-block",
|
||||||
|
"heading": "Kundenstimmen",
|
||||||
|
"testimonials": ["<testimonial-id-1>", "<testimonial-id-2>"],
|
||||||
|
"layout": "carousel"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### team-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "team-block",
|
||||||
|
"heading": "Unser Team",
|
||||||
|
"teamMembers": ["<team-id-1>", "<team-id-2>"],
|
||||||
|
"showBio": true,
|
||||||
|
"columns": 4
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### services-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "services-block",
|
||||||
|
"heading": "Unsere Leistungen",
|
||||||
|
"services": ["<service-id-1>", "<service-id-2>"],
|
||||||
|
"layout": "grid"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### posts-list-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "posts-list-block",
|
||||||
|
"heading": "Neueste Artikel",
|
||||||
|
"categories": ["<category-id>"],
|
||||||
|
"limit": 6,
|
||||||
|
"showPagination": true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### cta-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "cta-block",
|
||||||
|
"heading": "Jetzt starten",
|
||||||
|
"text": "Kontaktieren Sie uns noch heute.",
|
||||||
|
"buttonText": "Kontakt aufnehmen",
|
||||||
|
"buttonLink": "/kontakt",
|
||||||
|
"backgroundColor": "#1a1a1a"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### stats-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "stats-block",
|
||||||
|
"stats": [
|
||||||
|
{"number": "500+", "label": "Kunden"},
|
||||||
|
{"number": "10", "label": "Jahre Erfahrung"},
|
||||||
|
{"number": "24/7", "label": "Support"}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### pricing-block
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"blockType": "pricing-block",
|
||||||
|
"heading": "Unsere Preise",
|
||||||
|
"plans": [
|
||||||
|
{
|
||||||
|
"name": "Basic",
|
||||||
|
"price": "29",
|
||||||
|
"period": "monatlich",
|
||||||
|
"features": ["Feature 1", "Feature 2"],
|
||||||
|
"ctaText": "Auswählen",
|
||||||
|
"ctaLink": "/checkout/basic",
|
||||||
|
"highlighted": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Beispiel-Prompt (Vollständig)
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Tenant anlegen: Musterfirma GmbH
|
||||||
|
|
||||||
|
## Tenant-Informationen
|
||||||
|
|
||||||
|
**Name:** Musterfirma GmbH
|
||||||
|
**Slug:** musterfirma
|
||||||
|
**Domains:** musterfirma.de, www.musterfirma.de
|
||||||
|
|
||||||
|
### E-Mail-Konfiguration
|
||||||
|
- From-Adresse: info@musterfirma.de
|
||||||
|
- From-Name: Musterfirma GmbH
|
||||||
|
- Reply-To: kontakt@musterfirma.de
|
||||||
|
- Eigener SMTP: nein (globalen SMTP verwenden)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Site-Settings
|
||||||
|
|
||||||
|
- **Logo:** Musterfirma-Logo (blauer Kreis mit weißem "M")
|
||||||
|
- **Favicon:** Kleines "M" auf blauem Hintergrund
|
||||||
|
- **Primärfarbe:** #2563eb (Blau)
|
||||||
|
- **Sekundärfarbe:** #1e40af (Dunkelblau)
|
||||||
|
- **Akzentfarbe:** #f59e0b (Orange)
|
||||||
|
- **Footer-Text:** "© 2026 Musterfirma GmbH. Alle Rechte vorbehalten."
|
||||||
|
- **Kontakt-E-Mail:** info@musterfirma.de
|
||||||
|
- **Telefon:** +49 123 456789
|
||||||
|
- **Adresse:** Musterstraße 1, 12345 Musterstadt
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Navigation
|
||||||
|
|
||||||
|
### Hauptmenü
|
||||||
|
1. Startseite → /
|
||||||
|
2. Über uns → /ueber-uns
|
||||||
|
3. Leistungen → /leistungen
|
||||||
|
- Beratung → /leistungen/beratung
|
||||||
|
- Entwicklung → /leistungen/entwicklung
|
||||||
|
- Support → /leistungen/support
|
||||||
|
4. Referenzen → /referenzen
|
||||||
|
5. Blog → /blog
|
||||||
|
6. Kontakt → /kontakt
|
||||||
|
|
||||||
|
### Footer-Navigation
|
||||||
|
1. Impressum → /impressum
|
||||||
|
2. Datenschutz → /datenschutz
|
||||||
|
3. AGB → /agb
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Seiten
|
||||||
|
|
||||||
|
### Startseite (/)
|
||||||
|
**Blocks:**
|
||||||
|
1. hero-slider-block
|
||||||
|
- Slide 1: "Willkommen bei Musterfirma" / "Ihr Partner für digitale Lösungen" / CTA: "Jetzt beraten lassen" → /kontakt
|
||||||
|
- Slide 2: "Innovation trifft Expertise" / "Seit 10 Jahren erfolgreich" / CTA: "Mehr erfahren" → /ueber-uns
|
||||||
|
|
||||||
|
2. stats-block
|
||||||
|
- 500+ zufriedene Kunden
|
||||||
|
- 10 Jahre Erfahrung
|
||||||
|
- 50 Mitarbeiter
|
||||||
|
- 24/7 Support
|
||||||
|
|
||||||
|
3. services-block
|
||||||
|
- Überschrift: "Unsere Leistungen"
|
||||||
|
- Zeige alle Services
|
||||||
|
|
||||||
|
4. testimonials-block
|
||||||
|
- Überschrift: "Das sagen unsere Kunden"
|
||||||
|
- 3 Testimonials im Karussell
|
||||||
|
|
||||||
|
5. cta-block
|
||||||
|
- "Bereit für Ihr nächstes Projekt?"
|
||||||
|
- Button: "Kostenloses Erstgespräch" → /kontakt
|
||||||
|
|
||||||
|
### Über uns (/ueber-uns)
|
||||||
|
**Blocks:**
|
||||||
|
1. hero-block
|
||||||
|
- "Über Musterfirma"
|
||||||
|
- "Lernen Sie uns kennen"
|
||||||
|
|
||||||
|
2. image-text-block
|
||||||
|
- Bild: Team-Foto
|
||||||
|
- Text: Firmengeschichte und Vision
|
||||||
|
- Bild links
|
||||||
|
|
||||||
|
3. timeline-block
|
||||||
|
- Firmengeschichte als Zeitstrahl
|
||||||
|
- 2016: Gründung
|
||||||
|
- 2018: Erster Großkunde
|
||||||
|
- 2020: 25 Mitarbeiter
|
||||||
|
- 2024: Expansion
|
||||||
|
|
||||||
|
4. team-block
|
||||||
|
- "Unser Team"
|
||||||
|
- Alle Team-Mitglieder
|
||||||
|
|
||||||
|
### Leistungen (/leistungen)
|
||||||
|
**Blocks:**
|
||||||
|
1. hero-block
|
||||||
|
- "Unsere Leistungen"
|
||||||
|
- "Maßgeschneiderte Lösungen für Ihren Erfolg"
|
||||||
|
|
||||||
|
2. services-block
|
||||||
|
- Alle Services mit Icons
|
||||||
|
|
||||||
|
3. process-steps-block
|
||||||
|
- "So arbeiten wir"
|
||||||
|
- Schritt 1: Analyse
|
||||||
|
- Schritt 2: Konzept
|
||||||
|
- Schritt 3: Umsetzung
|
||||||
|
- Schritt 4: Betreuung
|
||||||
|
|
||||||
|
4. cta-block
|
||||||
|
- "Interesse geweckt?"
|
||||||
|
- Button: "Jetzt anfragen"
|
||||||
|
|
||||||
|
### Kontakt (/kontakt)
|
||||||
|
**Blocks:**
|
||||||
|
1. hero-block
|
||||||
|
- "Kontakt"
|
||||||
|
- "Wir freuen uns auf Ihre Nachricht"
|
||||||
|
|
||||||
|
2. image-text-block
|
||||||
|
- Kontaktinformationen
|
||||||
|
- Bild: Büro-Foto
|
||||||
|
|
||||||
|
3. contact-form-block
|
||||||
|
- Kontaktformular
|
||||||
|
|
||||||
|
4. map-block
|
||||||
|
- Standort auf Karte
|
||||||
|
|
||||||
|
### Blog (/blog)
|
||||||
|
**Blocks:**
|
||||||
|
1. hero-block
|
||||||
|
- "Unser Blog"
|
||||||
|
- "Insights und Neuigkeiten"
|
||||||
|
|
||||||
|
2. posts-list-block
|
||||||
|
- Alle Blog-Posts
|
||||||
|
- 6 pro Seite
|
||||||
|
- Mit Pagination
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kategorien
|
||||||
|
|
||||||
|
1. **Technologie** (slug: technologie)
|
||||||
|
2. **Trends** (slug: trends)
|
||||||
|
3. **Case Studies** (slug: case-studies)
|
||||||
|
4. **Tipps & Tricks** (slug: tipps-tricks)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
1. Digitalisierung
|
||||||
|
2. Innovation
|
||||||
|
3. KI
|
||||||
|
4. Cloud
|
||||||
|
5. Sicherheit
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Autoren
|
||||||
|
|
||||||
|
### Max Mustermann
|
||||||
|
- **Position:** CEO & Gründer
|
||||||
|
- **Bio:** Max ist Gründer und CEO der Musterfirma GmbH. Mit über 15 Jahren Erfahrung in der IT-Branche...
|
||||||
|
- **Bild:** Professionelles Porträt
|
||||||
|
|
||||||
|
### Anna Schmidt
|
||||||
|
- **Position:** Head of Content
|
||||||
|
- **Bio:** Anna leitet das Content-Team und ist verantwortlich für alle redaktionellen Inhalte...
|
||||||
|
- **Bild:** Professionelles Porträt
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Team-Mitglieder
|
||||||
|
|
||||||
|
### Max Mustermann
|
||||||
|
- **Position:** CEO & Gründer
|
||||||
|
- **Bio:** Gründer mit Vision für digitale Transformation
|
||||||
|
- **E-Mail:** max@musterfirma.de
|
||||||
|
- **LinkedIn:** linkedin.com/in/maxmustermann
|
||||||
|
|
||||||
|
### Anna Schmidt
|
||||||
|
- **Position:** Head of Content
|
||||||
|
- **Bio:** Content-Strategin mit Leidenschaft für Storytelling
|
||||||
|
- **E-Mail:** anna@musterfirma.de
|
||||||
|
|
||||||
|
### Tim Weber
|
||||||
|
- **Position:** Lead Developer
|
||||||
|
- **Bio:** Full-Stack-Entwickler mit Fokus auf skalierbare Lösungen
|
||||||
|
- **E-Mail:** tim@musterfirma.de
|
||||||
|
|
||||||
|
### Lisa Müller
|
||||||
|
- **Position:** UX Designer
|
||||||
|
- **Bio:** Kreiert nutzerzentrierte Designs für digitale Produkte
|
||||||
|
- **E-Mail:** lisa@musterfirma.de
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Services
|
||||||
|
|
||||||
|
### Beratung
|
||||||
|
- **Icon:** lightbulb
|
||||||
|
- **Kurzbeschreibung:** Strategische IT-Beratung für Ihr Unternehmen
|
||||||
|
- **Beschreibung:** Wir analysieren Ihre Geschäftsprozesse und entwickeln maßgeschneiderte Digitalisierungsstrategien...
|
||||||
|
|
||||||
|
### Entwicklung
|
||||||
|
- **Icon:** code
|
||||||
|
- **Kurzbeschreibung:** Individuelle Softwareentwicklung
|
||||||
|
- **Beschreibung:** Unser Entwicklerteam setzt Ihre Ideen in leistungsstarke Anwendungen um...
|
||||||
|
|
||||||
|
### Support
|
||||||
|
- **Icon:** headset
|
||||||
|
- **Kurzbeschreibung:** Zuverlässiger 24/7 Support
|
||||||
|
- **Beschreibung:** Unser Support-Team steht Ihnen rund um die Uhr zur Verfügung...
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Testimonials
|
||||||
|
|
||||||
|
### Testimonial 1
|
||||||
|
- **Zitat:** "Die Zusammenarbeit mit Musterfirma hat unsere digitale Transformation beschleunigt. Hervorragende Arbeit!"
|
||||||
|
- **Name:** Dr. Peter Schneider
|
||||||
|
- **Position:** CTO
|
||||||
|
- **Unternehmen:** TechCorp AG
|
||||||
|
- **Rating:** 5
|
||||||
|
|
||||||
|
### Testimonial 2
|
||||||
|
- **Zitat:** "Professionell, zuverlässig und innovativ. Genau der Partner, den wir gesucht haben."
|
||||||
|
- **Name:** Maria Hofmann
|
||||||
|
- **Position:** Geschäftsführerin
|
||||||
|
- **Unternehmen:** Digital Solutions GmbH
|
||||||
|
- **Rating:** 5
|
||||||
|
|
||||||
|
### Testimonial 3
|
||||||
|
- **Zitat:** "Das Team von Musterfirma versteht es, komplexe Anforderungen in elegante Lösungen zu verwandeln."
|
||||||
|
- **Name:** Thomas Klein
|
||||||
|
- **Position:** IT-Leiter
|
||||||
|
- **Unternehmen:** InnoTech AG
|
||||||
|
- **Rating:** 5
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## FAQs
|
||||||
|
|
||||||
|
### Wie lange dauert ein typisches Projekt?
|
||||||
|
Die Projektdauer hängt vom Umfang ab. Kleine Projekte dauern 2-4 Wochen, größere Projekte 3-6 Monate.
|
||||||
|
|
||||||
|
### Bieten Sie auch Wartung an?
|
||||||
|
Ja, wir bieten verschiedene Wartungs- und Support-Pakete an, die auf Ihre Bedürfnisse zugeschnitten sind.
|
||||||
|
|
||||||
|
### Wie läuft die Zusammenarbeit ab?
|
||||||
|
Nach einem kostenlosen Erstgespräch erstellen wir ein Angebot. Bei Beauftragung starten wir mit einer Analysephase.
|
||||||
|
|
||||||
|
### Arbeiten Sie auch mit kleinen Unternehmen?
|
||||||
|
Ja, wir betreuen Unternehmen jeder Größe, vom Startup bis zum Konzern.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Blog-Posts
|
||||||
|
|
||||||
|
### Post 1: "Die Zukunft der KI im Mittelstand"
|
||||||
|
- **Autor:** Max Mustermann
|
||||||
|
- **Kategorie:** Technologie
|
||||||
|
- **Tags:** KI, Innovation, Digitalisierung
|
||||||
|
- **Type:** blog
|
||||||
|
- **Excerpt:** Wie mittelständische Unternehmen von künstlicher Intelligenz profitieren können...
|
||||||
|
- **Content:**
|
||||||
|
- Einleitung zur KI-Revolution
|
||||||
|
- 3 Anwendungsbeispiele
|
||||||
|
- Implementierungstipps
|
||||||
|
- Fazit und Ausblick
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
### Post 2: "5 Tipps für erfolgreiche Digitalisierung"
|
||||||
|
- **Autor:** Anna Schmidt
|
||||||
|
- **Kategorie:** Tipps & Tricks
|
||||||
|
- **Tags:** Digitalisierung, Tipps
|
||||||
|
- **Type:** blog
|
||||||
|
- **Excerpt:** Praktische Ratschläge für Unternehmen auf dem Weg zur Digitalisierung...
|
||||||
|
- **Content:**
|
||||||
|
- Einleitung
|
||||||
|
- Tipp 1-5 mit Erklärungen
|
||||||
|
- Zusammenfassung
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
### Post 3: "Case Study: TechCorp digitalisiert Prozesse"
|
||||||
|
- **Autor:** Max Mustermann
|
||||||
|
- **Kategorie:** Case Studies
|
||||||
|
- **Tags:** Case Study, Digitalisierung
|
||||||
|
- **Type:** blog
|
||||||
|
- **Excerpt:** Wie wir TechCorp bei der Prozessdigitalisierung unterstützt haben...
|
||||||
|
- **Content:**
|
||||||
|
- Ausgangslage
|
||||||
|
- Herausforderungen
|
||||||
|
- Lösung
|
||||||
|
- Ergebnisse
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Rechtliche Seiten
|
||||||
|
|
||||||
|
### Impressum (/impressum)
|
||||||
|
- Angaben gemäß § 5 TMG
|
||||||
|
- Kontaktdaten
|
||||||
|
- Geschäftsführer
|
||||||
|
- Handelsregister
|
||||||
|
- USt-IdNr.
|
||||||
|
|
||||||
|
### Datenschutz (/datenschutz)
|
||||||
|
- DSGVO-konforme Datenschutzerklärung
|
||||||
|
- Verantwortlicher
|
||||||
|
- Datenerfassung
|
||||||
|
- Cookies
|
||||||
|
- Rechte der Betroffenen
|
||||||
|
|
||||||
|
### AGB (/agb)
|
||||||
|
- Allgemeine Geschäftsbedingungen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Formulare
|
||||||
|
|
||||||
|
### Kontaktformular
|
||||||
|
- Felder: Name, E-Mail, Telefon (optional), Betreff, Nachricht
|
||||||
|
- Bestätigungs-E-Mail an Absender
|
||||||
|
- Benachrichtigungs-E-Mail an info@musterfirma.de
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Wichtige Hinweise für den Prompt
|
||||||
|
|
||||||
|
### Pflichtangaben
|
||||||
|
- [ ] Tenant-Name und Slug
|
||||||
|
- [ ] Mindestens eine Domain
|
||||||
|
- [ ] Site-Settings (Logo, Farben)
|
||||||
|
- [ ] Navigation (Header, Footer)
|
||||||
|
- [ ] Mindestens eine Seite mit Blocks
|
||||||
|
|
||||||
|
### Empfohlene Angaben
|
||||||
|
- [ ] E-Mail-Konfiguration
|
||||||
|
- [ ] Team-Mitglieder
|
||||||
|
- [ ] Services/Leistungen
|
||||||
|
- [ ] Testimonials
|
||||||
|
- [ ] FAQ-Einträge
|
||||||
|
- [ ] Blog-Kategorien und Posts
|
||||||
|
- [ ] Rechtliche Seiten
|
||||||
|
|
||||||
|
### Formatierung
|
||||||
|
- Verwende Markdown für Strukturierung
|
||||||
|
- Nutze klare Überschriften und Listen
|
||||||
|
- Gib Block-Typen explizit an
|
||||||
|
- Beschreibe Inhalte so detailliert wie möglich
|
||||||
|
- Gib Beziehungen zwischen Inhalten an (z.B. Post → Kategorie)
|
||||||
|
|
||||||
|
### Lokalisierung
|
||||||
|
- Standard-Sprache ist Deutsch (de)
|
||||||
|
- Gib bei Bedarf englische Übersetzungen an:
|
||||||
|
```
|
||||||
|
**Titel (DE):** Über uns
|
||||||
|
**Titel (EN):** About Us
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Ausgabe-Format für Claude
|
||||||
|
|
||||||
|
Dein Prompt sollte Claude bitten, folgende Aufgaben auszuführen:
|
||||||
|
|
||||||
|
1. **Tenant erstellen** via Payload API
|
||||||
|
2. **Site-Settings anlegen** mit allen Konfigurationen
|
||||||
|
3. **Navigationen erstellen** (Header, Footer)
|
||||||
|
4. **Media-Assets hochladen** (falls URLs bereitgestellt)
|
||||||
|
5. **Kategorien/Tags anlegen** für Blog
|
||||||
|
6. **Autoren erstellen** für Blog
|
||||||
|
7. **Team-Mitglieder anlegen**
|
||||||
|
8. **Services erstellen**
|
||||||
|
9. **Testimonials anlegen**
|
||||||
|
10. **FAQs erstellen**
|
||||||
|
11. **Seiten mit Blocks erstellen**
|
||||||
|
12. **Blog-Posts anlegen**
|
||||||
|
13. **Formulare konfigurieren**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Beispiel-Einleitung für deinen Prompt
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Auftrag: Neuen Tenant anlegen und befüllen
|
||||||
|
|
||||||
|
Bitte lege im Payload CMS einen neuen Tenant mit folgenden Daten an.
|
||||||
|
Erstelle alle notwendigen Inhalte (Collections, Seiten, Posts) gemäß
|
||||||
|
der Spezifikation unten.
|
||||||
|
|
||||||
|
Nutze die Payload Local API oder REST API für die Datenerstellung.
|
||||||
|
Stelle sicher, dass alle Beziehungen korrekt verknüpft werden
|
||||||
|
(z.B. Posts → Categories, Pages → Blocks).
|
||||||
|
|
||||||
|
## Technische Hinweise
|
||||||
|
- Tenant-ID wird automatisch generiert
|
||||||
|
- Media-Uploads: Erstelle Platzhalter oder nutze bereitgestellte URLs
|
||||||
|
- Lexical-Format für Rich-Text-Inhalte verwenden
|
||||||
|
- Status: 'published' für alle Live-Inhalte
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Hier folgen deine Tenant-Daten...]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Checkliste vor Prompt-Übergabe
|
||||||
|
|
||||||
|
- [ ] Alle Pflichtfelder ausgefüllt?
|
||||||
|
- [ ] Block-Typen korrekt angegeben?
|
||||||
|
- [ ] Beziehungen zwischen Inhalten definiert?
|
||||||
|
- [ ] Bilder/Media beschrieben oder URLs bereitgestellt?
|
||||||
|
- [ ] Texte vollständig formuliert (nicht nur Platzhalter)?
|
||||||
|
- [ ] Navigation logisch strukturiert?
|
||||||
|
- [ ] Rechtliche Seiten berücksichtigt?
|
||||||
|
- [ ] E-Mail-Adressen korrekt formatiert?
|
||||||
|
- [ ] Farben als Hex-Werte angegeben?
|
||||||
965
prompts/Blogwoman-tenant-prompt.md
Normal file
965
prompts/Blogwoman-tenant-prompt.md
Normal file
|
|
@ -0,0 +1,965 @@
|
||||||
|
# Auftrag: Neuen Tenant anlegen und befüllen – BlogWoman
|
||||||
|
|
||||||
|
Bitte lege im Payload CMS (pl.porwoll.tech) einen neuen Tenant mit folgenden Daten an.
|
||||||
|
Erstelle alle notwendigen Inhalte (Collections, Seiten, Posts) gemäß der Spezifikation unten.
|
||||||
|
|
||||||
|
Nutze die Payload Local API oder REST API für die Datenerstellung.
|
||||||
|
Stelle sicher, dass alle Beziehungen korrekt verknüpft werden
|
||||||
|
(z.B. Posts → Categories, Pages → Blocks, Favorites → Categories).
|
||||||
|
|
||||||
|
## Technische Hinweise
|
||||||
|
- Tenant-ID wird automatisch generiert
|
||||||
|
- Media-Uploads: Erstelle Platzhalter oder nutze beschriebene Bilder
|
||||||
|
- Lexical-Format für Rich-Text-Inhalte verwenden
|
||||||
|
- Status: 'published' für alle Live-Inhalte
|
||||||
|
- Lokalisierung: Deutsch (de) als Standard
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tenant-Informationen
|
||||||
|
|
||||||
|
**Name:** BlogWoman
|
||||||
|
**Slug:** blogwoman
|
||||||
|
**Domain(s):** blogwoman.de, www.blogwoman.de
|
||||||
|
|
||||||
|
### E-Mail-Konfiguration
|
||||||
|
- From-Adresse: hello@blogwoman.de
|
||||||
|
- From-Name: BlogWoman
|
||||||
|
- Reply-To: caroline@blogwoman.de
|
||||||
|
- Eigener SMTP: nein (globalen SMTP verwenden)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Site-Settings
|
||||||
|
|
||||||
|
### Branding
|
||||||
|
- **Logo:** BlogWoman Logo (Playfair Display Schriftzug "BLOGWOMAN" in Espresso #2B2520)
|
||||||
|
- **Logo Subline:** "by Caroline Porwoll"
|
||||||
|
- **Favicon:** Stylisiertes "B" auf Brass-Hintergrund (#B08D57)
|
||||||
|
|
||||||
|
### Farben (Brand Guidelines)
|
||||||
|
- **Primärfarbe:** #B08D57 (Brass)
|
||||||
|
- **Sekundärfarbe:** #2B2520 (Espresso)
|
||||||
|
- **Akzentfarbe:** #6B1F2B (Bordeaux)
|
||||||
|
- **Hintergrundfarbe:** #F7F3EC (Ivory)
|
||||||
|
- **Card-Farbe:** #C6A47E (Sand)
|
||||||
|
- **Akzent 2:** #D4A5A5 (Rosé - für SPARK-Serie)
|
||||||
|
|
||||||
|
### Kontaktdaten
|
||||||
|
- **E-Mail:** hello@blogwoman.de
|
||||||
|
- **Kooperationen:** kooperationen@blogwoman.de
|
||||||
|
- **Telefon:** (nicht öffentlich)
|
||||||
|
|
||||||
|
### Adresse (Impressum)
|
||||||
|
- **Firma:** Complex Care Solutions GmbH
|
||||||
|
- **Straße:** [Firmenadresse einfügen]
|
||||||
|
- **PLZ/Ort:** [PLZ] [Ort]
|
||||||
|
- **Land:** Deutschland
|
||||||
|
|
||||||
|
### Social Media
|
||||||
|
- YouTube: @blogwoman (Haupt-Plattform)
|
||||||
|
- Instagram: @blogwoman.de
|
||||||
|
|
||||||
|
### Footer
|
||||||
|
- **Footer-Text:** "© 2025 Complex Care Solutions GmbH"
|
||||||
|
- **Tagline:** "Für Frauen, die Karriere, Familie & Stil ernst nehmen."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Navigation
|
||||||
|
|
||||||
|
### Header-Navigation (Desktop)
|
||||||
|
1. Über mich → /caroline
|
||||||
|
2. Blog → /blog
|
||||||
|
3. Serien → /serien
|
||||||
|
4. Favoriten → /favoriten
|
||||||
|
5. Newsletter (CTA-Button) → /newsletter
|
||||||
|
|
||||||
|
### Header-Navigation (Mobile Menu)
|
||||||
|
1. Über mich → /caroline
|
||||||
|
2. Blog → /blog
|
||||||
|
3. Serien → /serien
|
||||||
|
- GRFI → /serien/grfi
|
||||||
|
- Investment-Piece → /serien/investment-piece
|
||||||
|
- Pleasure P&L → /serien/pleasure-pl
|
||||||
|
- Regeneration → /serien/regeneration
|
||||||
|
- SPARK → /serien/spark
|
||||||
|
- Inner Circle → /serien/inner-circle
|
||||||
|
4. Favoriten → /favoriten
|
||||||
|
5. Newsletter → /newsletter
|
||||||
|
6. Kooperationen → /kooperationen
|
||||||
|
7. ---
|
||||||
|
8. YouTube (extern) → https://youtube.com/@blogwoman
|
||||||
|
9. Instagram (extern) → https://instagram.com/blogwoman.de
|
||||||
|
10. ---
|
||||||
|
11. Impressum → /impressum
|
||||||
|
12. Datenschutz → /datenschutz
|
||||||
|
|
||||||
|
### Footer-Navigation
|
||||||
|
**Spalte 1: Navigation**
|
||||||
|
- Über mich → /caroline
|
||||||
|
- Blog → /blog
|
||||||
|
- Favoriten → /favoriten
|
||||||
|
- Newsletter → /newsletter
|
||||||
|
- Kooperationen → /kooperationen
|
||||||
|
|
||||||
|
**Spalte 2: Serien**
|
||||||
|
- GRFI → /serien/grfi
|
||||||
|
- Investment-Piece → /serien/investment-piece
|
||||||
|
- Pleasure P&L → /serien/pleasure-pl
|
||||||
|
- SPARK → /serien/spark
|
||||||
|
- Inner Circle → /serien/inner-circle
|
||||||
|
|
||||||
|
**Spalte 3: Rechtliches**
|
||||||
|
- Impressum → /impressum
|
||||||
|
- Datenschutz → /datenschutz
|
||||||
|
- Transparenz → /transparenz
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kategorien (Posts)
|
||||||
|
|
||||||
|
1. **Stil & Wirkung** (slug: stil-wirkung)
|
||||||
|
- Beschreibung: GRFI, Investment-Pieces, Capsule Wardrobe, Business-Looks
|
||||||
|
|
||||||
|
2. **Systeme & Entscheidungen** (slug: systeme-entscheidungen)
|
||||||
|
- Beschreibung: Decision-Proof, Routinen, Delegation, Zeitmanagement
|
||||||
|
|
||||||
|
3. **Regeneration & Energie** (slug: regeneration-energie)
|
||||||
|
- Beschreibung: Reset-Routinen, Schlaf, Energie-Management, Selfcare
|
||||||
|
|
||||||
|
4. **Karriere x Familie** (slug: karriere-familie)
|
||||||
|
- Beschreibung: Backstage, Real Talk, Vereinbarkeit, Working Mom
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tags
|
||||||
|
|
||||||
|
1. GRFI
|
||||||
|
2. Investment-Piece
|
||||||
|
3. Capsule-Wardrobe
|
||||||
|
4. Morgenroutine
|
||||||
|
5. Zeitmanagement
|
||||||
|
6. Business-Outfit
|
||||||
|
7. Selfcare
|
||||||
|
8. Working-Mom
|
||||||
|
9. Entscheidungen
|
||||||
|
10. Regeneration
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Autoren
|
||||||
|
|
||||||
|
### Dr. Caroline Porwoll (Haupt-Autorin)
|
||||||
|
- **Name:** Dr. Caroline Porwoll
|
||||||
|
- **Position:** Gründerin & Host
|
||||||
|
- **Bio:** Unternehmerin. Mutter. Systemdenkerin. Caroline ist promovierte Wirtschaftswissenschaftlerin, Geschäftsführerin der Complex Care Solutions GmbH und die Stimme hinter BlogWoman. Sie entwickelt Systeme, die Karriere und Familie verbinden – ohne Kompromisse bei beidem.
|
||||||
|
- **Bild:** Professionelles Portrait (warm, natürliches Licht, Business-Casual)
|
||||||
|
- **Social Links:**
|
||||||
|
- YouTube: https://youtube.com/@blogwoman
|
||||||
|
- Instagram: https://instagram.com/blogwoman.de
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Serien (Series Collection)
|
||||||
|
|
||||||
|
### 1. GRFI - Get Ready For Impact
|
||||||
|
- **Titel (DE):** GRFI – Get Ready For Impact
|
||||||
|
- **Slug:** grfi
|
||||||
|
- **Beschreibung:** In 7-10 Minuten vom Alltag zur Präsenz. Outfit. Grooming. Haltung. Mit System.
|
||||||
|
- **Brand Color:** #B08D57 (Brass)
|
||||||
|
- **Cover Image:** Caroline im Business-Outfit, Spiegel-Setting
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
### 2. Investment-Piece
|
||||||
|
- **Titel (DE):** Investment-Piece
|
||||||
|
- **Slug:** investment-piece
|
||||||
|
- **Beschreibung:** 1 Teil, 3 Looks, 1 ehrliche Rechnung. Qualität über Quantität – mit CPW-Analyse.
|
||||||
|
- **Brand Color:** #2B2520 (Espresso)
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
### 3. Pleasure P&L
|
||||||
|
- **Titel (DE):** Pleasure P&L
|
||||||
|
- **Slug:** pleasure-pl
|
||||||
|
- **Beschreibung:** Gönnen mit ROI. Die Gewinn-und-Verlust-Rechnung für Genuss-Momente.
|
||||||
|
- **Brand Color:** #6B1F2B (Bordeaux)
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
### 4. Regeneration
|
||||||
|
- **Titel (DE):** Regeneration
|
||||||
|
- **Slug:** regeneration
|
||||||
|
- **Beschreibung:** 20-Minuten-Resets für Körper und Kopf. Energie ist Strategie.
|
||||||
|
- **Brand Color:** #7BA08A (Sage Green)
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
### 5. SPARK
|
||||||
|
- **Titel (DE):** SPARK
|
||||||
|
- **Slug:** spark
|
||||||
|
- **Beschreibung:** Flamme zurückholen. Für die Momente, wenn alles zu viel wird.
|
||||||
|
- **Brand Color:** #D4A5A5 (Rosé)
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
### 6. Inner Circle
|
||||||
|
- **Titel (DE):** Inner Circle
|
||||||
|
- **Slug:** inner-circle
|
||||||
|
- **Beschreibung:** Interviews mit Frauen, die Karriere, Familie und Stil leben.
|
||||||
|
- **Brand Color:** #C6A47E (Sand)
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
### 7. M2M - Meeting to Mama
|
||||||
|
- **Titel (DE):** M2M – Meeting to Mama
|
||||||
|
- **Slug:** m2m
|
||||||
|
- **Beschreibung:** Der Übergang von Business zu Familie. Praktische Tipps für den Switch.
|
||||||
|
- **Brand Color:** #8B7355 (Warm Brown)
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
### 8. Decision-Proof
|
||||||
|
- **Titel (DE):** Decision-Proof
|
||||||
|
- **Slug:** decision-proof
|
||||||
|
- **Beschreibung:** Regeln schlagen Denken. Systeme für bessere Entscheidungen mit weniger Aufwand.
|
||||||
|
- **Brand Color:** #4A5568 (Slate)
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
### 9. Backstage
|
||||||
|
- **Titel (DE):** Backstage
|
||||||
|
- **Slug:** backstage
|
||||||
|
- **Beschreibung:** Ein Tag, real. Keine Filter, keine Perfektion – so sieht's wirklich aus.
|
||||||
|
- **Brand Color:** #718096 (Gray)
|
||||||
|
- **YouTube Playlist ID:** [Playlist-ID einfügen]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Favoriten-Kategorien
|
||||||
|
|
||||||
|
### 1. Fashion
|
||||||
|
- **Slug:** fashion
|
||||||
|
- **Icon:** 👗
|
||||||
|
- **Beschreibung:** Investment-Pieces, die ich seit Jahren trage. Weniger Teile, bessere Qualität.
|
||||||
|
|
||||||
|
### 2. Beauty
|
||||||
|
- **Slug:** beauty
|
||||||
|
- **Icon:** 💄
|
||||||
|
- **Beschreibung:** Meine GRFI-Routine – das Minimum, das wirkt.
|
||||||
|
|
||||||
|
### 3. Travel
|
||||||
|
- **Slug:** travel
|
||||||
|
- **Icon:** ✈️
|
||||||
|
- **Beschreibung:** Business-Reisen & Family-Urlaub. Was mit dabei ist.
|
||||||
|
|
||||||
|
### 4. Tech
|
||||||
|
- **Slug:** tech
|
||||||
|
- **Icon:** 💻
|
||||||
|
- **Beschreibung:** Tools für Produktivität & Organisation.
|
||||||
|
|
||||||
|
### 5. Home
|
||||||
|
- **Slug:** home
|
||||||
|
- **Icon:** 🏠
|
||||||
|
- **Beschreibung:** Was mir Zeit spart (und was nicht).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Favoriten (Affiliate-Produkte) – Beispieldaten
|
||||||
|
|
||||||
|
### Fashion-Favoriten
|
||||||
|
|
||||||
|
#### Der perfekte Blazer
|
||||||
|
- **Titel:** Der Blazer, der alles mitmacht
|
||||||
|
- **Marke:** [Marke]
|
||||||
|
- **Kategorie:** fashion
|
||||||
|
- **Badge:** investment-piece
|
||||||
|
- **Preis:** ca. 350€
|
||||||
|
- **Preis-Range:** premium
|
||||||
|
- **Affiliate-URL:** [Link]
|
||||||
|
- **Beschreibung:** "Den Blazer trage ich seit 4 Jahren zu allem – Board, Office, Elternabend. Mein CPW liegt bei unter 5€."
|
||||||
|
- **Meta:**
|
||||||
|
- CPW: ~5€
|
||||||
|
- Besitze seit: 2021
|
||||||
|
- Gesehen in: GRFI Ep. 12
|
||||||
|
|
||||||
|
#### Die Basis-Bluse
|
||||||
|
- **Titel:** Weiße Bluse (mein Klassiker)
|
||||||
|
- **Marke:** [Marke]
|
||||||
|
- **Kategorie:** fashion
|
||||||
|
- **Badge:** daily-driver
|
||||||
|
- **Preis:** ca. 120€
|
||||||
|
- **Preis-Range:** mid
|
||||||
|
- **Beschreibung:** "Besitze 3 Stück davon. Waschen, trocknen, fertig. Nie wieder Bügeln."
|
||||||
|
|
||||||
|
#### Investment Bag
|
||||||
|
- **Titel:** Die Tasche für alles
|
||||||
|
- **Marke:** [Marke]
|
||||||
|
- **Kategorie:** fashion
|
||||||
|
- **Badge:** grfi-approved
|
||||||
|
- **Preis:** ca. 890€
|
||||||
|
- **Preis-Range:** luxury
|
||||||
|
- **Beschreibung:** "Laptop, Wickelunterlage, Snacks – passt alles rein. Und sieht trotzdem aus wie eine Business-Tasche."
|
||||||
|
|
||||||
|
### Beauty-Favoriten
|
||||||
|
|
||||||
|
#### GRFI Foundation
|
||||||
|
- **Titel:** 2-Minuten Foundation
|
||||||
|
- **Marke:** [Marke]
|
||||||
|
- **Kategorie:** beauty
|
||||||
|
- **Badge:** grfi-approved
|
||||||
|
- **Preis:** ca. 45€
|
||||||
|
- **Preis-Range:** mid
|
||||||
|
- **Beschreibung:** "Sieht nach 8 Stunden Schlaf aus, braucht aber nur 30 Sekunden."
|
||||||
|
|
||||||
|
#### Der rote Lippenstift
|
||||||
|
- **Titel:** Power-Lippenstift
|
||||||
|
- **Marke:** [Marke]
|
||||||
|
- **Kategorie:** beauty
|
||||||
|
- **Badge:** investment-piece
|
||||||
|
- **Preis:** ca. 35€
|
||||||
|
- **Preis-Range:** mid
|
||||||
|
- **Beschreibung:** "Mein Geheim-Weapon für wichtige Termine. Verwandelt jedes Outfit."
|
||||||
|
|
||||||
|
### Tech-Favoriten
|
||||||
|
|
||||||
|
#### Kalender-App
|
||||||
|
- **Titel:** Die Kalender-App, die alles zusammenführt
|
||||||
|
- **Marke:** [App-Name]
|
||||||
|
- **Kategorie:** tech
|
||||||
|
- **Badge:** daily-driver
|
||||||
|
- **Preis:** 0€ / 5€ Premium
|
||||||
|
- **Preis-Range:** budget
|
||||||
|
- **Beschreibung:** "Familie und Business in einem Kalender. Game-Changer."
|
||||||
|
|
||||||
|
#### Noise-Cancelling Kopfhörer
|
||||||
|
- **Titel:** Meine Fokus-Zone
|
||||||
|
- **Marke:** [Marke]
|
||||||
|
- **Kategorie:** tech
|
||||||
|
- **Badge:** investment-piece
|
||||||
|
- **Preis:** ca. 380€
|
||||||
|
- **Preis-Range:** premium
|
||||||
|
- **Beschreibung:** "Für Flüge, Home-Office mit Kindern im Haus, oder einfach 30 Minuten Ruhe."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Seiten
|
||||||
|
|
||||||
|
### 1. Startseite (/)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: BlogWoman – Karriere, Familie & Stil mit System
|
||||||
|
- Description: Für Frauen, die Karriere, Familie und Stil ernst nehmen. Systeme statt Motivation. Von Dr. Caroline Porwoll.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-slider-block
|
||||||
|
- **Slide 1:**
|
||||||
|
- Heading: BLOGWOMAN
|
||||||
|
- Subheading: "Für Frauen, die Karriere, Familie & Stil ernst nehmen."
|
||||||
|
- Background: Hochwertiges Bild von Caroline, warm beleuchtet
|
||||||
|
- CTA 1: "Newsletter" → /newsletter
|
||||||
|
- CTA 2: "Favoriten" → /favoriten
|
||||||
|
- CTA 3: "Über mich" → /caroline
|
||||||
|
|
||||||
|
#### Block 2: image-text-block (Caroline-Intro)
|
||||||
|
- **Heading:** Dr. Caroline Porwoll
|
||||||
|
- **Subheading:** Unternehmerin. Mutter. Systemdenkerin.
|
||||||
|
- **Content:** "Ich glaube nicht an Work-Life-Balance – ich glaube an Systeme, die beides möglich machen."
|
||||||
|
- **Image:** Caroline Portrait
|
||||||
|
- **Image Position:** left
|
||||||
|
- **CTA:** "Mehr erfahren →" → /caroline
|
||||||
|
|
||||||
|
#### Block 3: featured-content-block (Now Trending)
|
||||||
|
- **Heading:** Now Trending
|
||||||
|
- **Type:** mixed
|
||||||
|
- **Items:** 3 YouTube-Videos + 3 Blog-Artikel (dynamisch oder manuell kuratiert)
|
||||||
|
|
||||||
|
#### Block 4: posts-list-block (Aus dem Blog)
|
||||||
|
- **Heading:** Aus dem Blog
|
||||||
|
- **Limit:** 3
|
||||||
|
- **Layout:** grid
|
||||||
|
- **Show Excerpt:** true
|
||||||
|
- **Show CTA:** "Alle Artikel →" → /blog
|
||||||
|
|
||||||
|
#### Block 5: newsletter-block
|
||||||
|
- **Heading:** Der BlogWoman Brief
|
||||||
|
- **Subheading:** Jeden Dienstag in deinem Postfach.
|
||||||
|
- **Layout:** inline
|
||||||
|
- **Background:** Sand (#C6A47E)
|
||||||
|
- **CTA:** "ANMELDEN"
|
||||||
|
- **Privacy Note:** "Kein Spam. Jederzeit abmelden."
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Über mich (/caroline)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Über Caroline | BlogWoman
|
||||||
|
- Description: Dr. Caroline Porwoll – Unternehmerin, Mutter, Gründerin von BlogWoman. Die Geschichte hinter den Systemen.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-block
|
||||||
|
- **Heading:** Dr. Caroline Porwoll
|
||||||
|
- **Subheading:** Unternehmerin. Mutter. Die Frau hinter BlogWoman.
|
||||||
|
- **Background:** Großes, hochwertiges Portrait
|
||||||
|
|
||||||
|
#### Block 2: text-block (Die Kurzversion)
|
||||||
|
- **Heading:** In 30 Sekunden:
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
• Promovierte Wirtschaftswissenschaftlerin
|
||||||
|
• Gründerin & Geschäftsführerin der Complex Care Solutions GmbH
|
||||||
|
• Mutter von [X] Kindern
|
||||||
|
• 15+ Jahre Erfahrung in Unternehmensführung
|
||||||
|
• Entwicklerin von Systemen, die Karriere und Familie verbinden
|
||||||
|
|
||||||
|
BlogWoman ist das, was ich mir selbst gewünscht hätte –
|
||||||
|
als ich versuchte, alles unter einen Hut zu bekommen.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block 3: text-block (Der Wendepunkt)
|
||||||
|
- **Heading:** Es gab diesen Moment
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
Ich stand vor dem Kleiderschrank, hatte ein wichtiges Board-Meeting in 45 Minuten,
|
||||||
|
ein Kind mit Fieber zuhause, und absolut keine Ahnung, was ich anziehen sollte.
|
||||||
|
|
||||||
|
Nicht weil ich nichts hatte. Sondern weil ich kein System hatte.
|
||||||
|
|
||||||
|
In diesem Moment wurde mir klar: Ich brauche keine Motivation.
|
||||||
|
Ich brauche keine Inspiration. Ich brauche Strukturen, die funktionieren –
|
||||||
|
auch wenn ich nicht funktioniere.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block 4: text-block (Meine Prinzipien)
|
||||||
|
- **Heading:** Wofür ich stehe
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
→ System schlägt Motivation
|
||||||
|
Willenskraft ist endlich. Gute Systeme nicht.
|
||||||
|
|
||||||
|
→ Investment statt Konsum
|
||||||
|
Ob Blazer oder Spa-Tag: Ich rechne den ROI.
|
||||||
|
|
||||||
|
→ Energie ist Strategie
|
||||||
|
Regeneration ist keine Belohnung. Sie ist die Voraussetzung.
|
||||||
|
|
||||||
|
→ Weniger, aber besser
|
||||||
|
Qualität über Quantität. In allem.
|
||||||
|
|
||||||
|
→ Ehrlichkeit über Perfektion
|
||||||
|
Ich zeige, was funktioniert – und was nicht.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block 5: text-block (Was du hier nicht findest)
|
||||||
|
- **Heading:** Was du hier NICHT findest
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
✗ Keine „Manifestiere dein bestes Selbst"-Sprüche
|
||||||
|
✗ Keine unrealistischen 5-Uhr-Morgenroutinen
|
||||||
|
✗ Keine Detox-Wunder oder Trend-Diäten
|
||||||
|
✗ Keine Fast-Fashion-Hauls
|
||||||
|
✗ Kein Mom-Shaming oder Karriere-Bashing
|
||||||
|
|
||||||
|
Ich glaube daran, dass beides geht. Und ich zeige dir, wie.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block 6: stats-block (Credentials)
|
||||||
|
- **Stats:**
|
||||||
|
- Dr. rer. pol.
|
||||||
|
- CEO Complex Care Solutions
|
||||||
|
- Mutter von [X] Kindern
|
||||||
|
- 15+ Jahre Erfahrung
|
||||||
|
|
||||||
|
#### Block 7: cta-block (Verbunden bleiben)
|
||||||
|
- **Heading:** Lass uns verbunden bleiben
|
||||||
|
- **Buttons:**
|
||||||
|
- YouTube abonnieren → https://youtube.com/@blogwoman
|
||||||
|
- Newsletter anmelden → /newsletter
|
||||||
|
- Instagram folgen → https://instagram.com/blogwoman.de
|
||||||
|
- **Note:** "Für Kooperationsanfragen: /kooperationen"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Newsletter (/newsletter)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Der BlogWoman Brief | Newsletter
|
||||||
|
- Description: Performance & Pleasure für Karriere, Familie & Stil. Jeden Dienstag direkt in dein Postfach. Plus: Kostenlose Downloads.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-block
|
||||||
|
- **Heading:** Der BlogWoman Brief
|
||||||
|
- **Subheading:** Performance & Pleasure für Karriere, Familie & Stil. Jeden Dienstag direkt in dein Postfach.
|
||||||
|
|
||||||
|
#### Block 2: newsletter-block (Main Form)
|
||||||
|
- **Heading:** Jetzt anmelden
|
||||||
|
- **Layout:** stacked
|
||||||
|
- **Fields:** Vorname, E-Mail
|
||||||
|
- **Lead Magnets (Bullet Points):**
|
||||||
|
- ☑ GRFI-Checkliste (PDF)
|
||||||
|
- ☑ 30-Teile Capsule Wardrobe Liste
|
||||||
|
- ☑ Pleasure P&L Template
|
||||||
|
|
||||||
|
#### Block 3: text-block (Was du bekommst)
|
||||||
|
- **Heading:** Jeden Dienstag in deinem Postfach:
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
→ The Impact Move
|
||||||
|
1 Mini-Tipp, sofort umsetzbar. Keine Theorie.
|
||||||
|
|
||||||
|
→ Video Recap
|
||||||
|
Was diese Woche auf YouTube lief – falls du's verpasst hast.
|
||||||
|
|
||||||
|
→ P&L Pick
|
||||||
|
1 Produkt-Empfehlung mit meiner ehrlichen Rechnung.
|
||||||
|
|
||||||
|
→ Backstage Note
|
||||||
|
3 Sätze aus meinem echten Leben. Kein Hochglanz.
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block 4: text-block (Trust)
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
„Kein Spam. Kein Clickbait. Jederzeit abmelden."
|
||||||
|
|
||||||
|
Schon dabei: [X]+ Frauen, die Karriere, Familie & Stil ernst nehmen.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Favoriten (/favoriten)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Meine Favoriten & Tools | BlogWoman
|
||||||
|
- Description: Die Dinge, die ich wirklich nutze – mit der Rechnung, warum. Kuratiert, nicht gesponsert.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-block
|
||||||
|
- **Heading:** Meine Favoriten & Tools
|
||||||
|
- **Subheading:** Die Dinge, die ich wirklich nutze – mit der Rechnung, warum. Kuratiert, nicht gesponsert.
|
||||||
|
|
||||||
|
#### Block 2: text-block (Transparenz-Hinweis)
|
||||||
|
- **Content:** "Transparenz: Diese Seite enthält Affiliate-Links*. Für dich keine Mehrkosten. Mehr dazu: /transparenz"
|
||||||
|
|
||||||
|
#### Block 3: favorites-block (Kategorien-Grid)
|
||||||
|
- **Layout:** category-grid
|
||||||
|
- **Categories:** fashion, beauty, travel, tech, home
|
||||||
|
- **Show Description:** true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Favoriten-Kategorie: Fashion (/favoriten/fashion)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Fashion Favoriten | BlogWoman
|
||||||
|
- Description: Investment-Pieces, die sich rechnen. Weniger Teile, bessere Qualität, mehr Kombinationen.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-block
|
||||||
|
- **Heading:** Fashion Favoriten
|
||||||
|
- **Subheading:** Investment-Pieces, die sich rechnen.
|
||||||
|
|
||||||
|
#### Block 2: text-block
|
||||||
|
- **Content:** "Meine Philosophie: Weniger Teile, bessere Qualität, mehr Kombinationen. Hier sind die Stücke, die ich wirklich trage – manche seit 5+ Jahren."
|
||||||
|
|
||||||
|
#### Block 3: favorites-block
|
||||||
|
- **Category:** fashion
|
||||||
|
- **Layout:** grid
|
||||||
|
- **Show CPW:** true
|
||||||
|
- **Show Badge:** true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. Serien-Übersicht (/serien)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Die BlogWoman Serien | YouTube
|
||||||
|
- Description: Wiederkehrende Formate für wiederkehrende Herausforderungen. GRFI, Investment-Piece, P&L und mehr.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-block
|
||||||
|
- **Heading:** Die BlogWoman Serien
|
||||||
|
- **Subheading:** Wiederkehrende Formate für wiederkehrende Herausforderungen. Jede Serie löst ein konkretes Problem – mit System.
|
||||||
|
|
||||||
|
#### Block 2: series-block
|
||||||
|
- **Layout:** grid
|
||||||
|
- **Show Description:** true
|
||||||
|
- **Show Video Count:** true
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. Serien-Detail: GRFI (/serien/grfi)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: GRFI – Get Ready For Impact | BlogWoman
|
||||||
|
- Description: In 7-10 Minuten vom Alltag zur Präsenz. Outfit. Grooming. Haltung. Mit System.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: series-detail-block
|
||||||
|
- **Serie:** grfi
|
||||||
|
- **Show Trailer:** true
|
||||||
|
- **Show Video List:** true
|
||||||
|
|
||||||
|
#### Block 2: text-block (Für wen)
|
||||||
|
- **Heading:** Für wen ist GRFI?
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
Für dich, wenn du:
|
||||||
|
• Morgens wenig Zeit hast, aber präsent wirken musst
|
||||||
|
• Vor wichtigen Terminen unsicher bist, was du anziehen sollst
|
||||||
|
• Ein System willst, das auch an Chaos-Tagen funktioniert
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block 3: card-grid-block (Ressourcen)
|
||||||
|
- **Heading:** GRFI-Ressourcen
|
||||||
|
- **Cards:**
|
||||||
|
- GRFI-Checkliste (PDF) → /newsletter
|
||||||
|
- Meine GRFI-Favoriten → /favoriten/fashion
|
||||||
|
- Blog: Der komplette GRFI-Guide → /blog/grfi-guide
|
||||||
|
|
||||||
|
#### Block 4: series-block (Verwandte Serien)
|
||||||
|
- **Heading:** Verwandte Serien
|
||||||
|
- **Series:** m2m, investment-piece, regeneration
|
||||||
|
- **Layout:** horizontal
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 8. Blog (/blog)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Der BlogWoman Blog | Karriere, Familie & Stil
|
||||||
|
- Description: Systeme für Karriere, Familie & Stil. Kein Fluff. Kein Clickbait. Nur das, was funktioniert.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-block
|
||||||
|
- **Heading:** Der BlogWoman Blog
|
||||||
|
- **Subheading:** Systeme für Karriere, Familie & Stil. Kein Fluff. Kein Clickbait. Nur das, was funktioniert.
|
||||||
|
|
||||||
|
#### Block 2: posts-list-block
|
||||||
|
- **Layout:** featured-grid (1 groß + weitere)
|
||||||
|
- **Show Categories:** true
|
||||||
|
- **Show Reading Time:** true
|
||||||
|
- **Show Pagination:** true
|
||||||
|
- **Per Page:** 12
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 9. Kooperationen (/kooperationen)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Kooperationen | BlogWoman
|
||||||
|
- Description: Für Marken, die Frauen mit Anspruch erreichen wollen. Media Kit und Kontakt.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-block
|
||||||
|
- **Heading:** Kooperationen mit BlogWoman
|
||||||
|
- **Subheading:** Für Marken, die Frauen mit Anspruch erreichen wollen.
|
||||||
|
|
||||||
|
#### Block 2: text-block (Zielgruppe)
|
||||||
|
- **Heading:** Wen Sie erreichen
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
• Frauen 35-45, DACH
|
||||||
|
• Überdurchschnittliches Haushaltseinkommen
|
||||||
|
• Karriere + Familie
|
||||||
|
• Qualitätsorientiert, ROI-Denken
|
||||||
|
• Entscheiderinnen in Haushalt und Beruf
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block 3: stats-block (Reichweite)
|
||||||
|
- **Heading:** Reichweite
|
||||||
|
- **Stats:**
|
||||||
|
- YouTube: [X] Abonnenten
|
||||||
|
- Newsletter: [X] Leserinnen
|
||||||
|
- Instagram: [X] Follower
|
||||||
|
- Website: [X] monatliche Besucher
|
||||||
|
|
||||||
|
#### Block 4: text-block (Formate)
|
||||||
|
- **Heading:** Zusammenarbeit
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
→ Dedizierte Video-Integration (Longform)
|
||||||
|
→ Shorts-Serie (3-5 Videos)
|
||||||
|
→ Newsletter-Feature (P&L Pick)
|
||||||
|
→ Blog-Artikel (SEO-optimiert)
|
||||||
|
→ Affiliate-Partnerschaft (langfristig)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Block 5: card-grid-block (Passt / Passt nicht)
|
||||||
|
- **Cards:**
|
||||||
|
- **Passt gut:** Premium Fashion & Accessoires, Beauty & Skincare, Travel & Hospitality, Tech & Produktivität, Wellness & Selfcare, Home & Organisation
|
||||||
|
- **Passt nicht:** Fast Fashion, Detox/Wunder-Supplements, Alkohol/Glücksspiel/Nikotin, Krypto/High-Risk Finance
|
||||||
|
|
||||||
|
#### Block 6: cta-block
|
||||||
|
- **Heading:** Interesse?
|
||||||
|
- **Button:** "Media Kit herunterladen (PDF)" → [Download-Link]
|
||||||
|
- **Text:** "Oder direkt: kooperationen@blogwoman.de\nAnsprechpartnerin: Dr. Caroline Porwoll"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 10. Impressum (/impressum)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Impressum | BlogWoman
|
||||||
|
- Description: Impressum von BlogWoman – betrieben von Complex Care Solutions GmbH.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: text-block
|
||||||
|
- **Heading:** Impressum
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
Angaben gemäß § 5 TMG / § 5 DDG
|
||||||
|
|
||||||
|
Complex Care Solutions GmbH
|
||||||
|
[Straße und Hausnummer]
|
||||||
|
[PLZ] [Ort]
|
||||||
|
Deutschland
|
||||||
|
|
||||||
|
Geschäftsführerin: Dr. Caroline Porwoll
|
||||||
|
|
||||||
|
Kontakt:
|
||||||
|
E-Mail: hello@blogwoman.de
|
||||||
|
|
||||||
|
Registereintrag:
|
||||||
|
Handelsregister: Amtsgericht [Ort]
|
||||||
|
Registernummer: HRB [Nummer]
|
||||||
|
|
||||||
|
Umsatzsteuer-ID:
|
||||||
|
USt-IdNr.: DE[Nummer]
|
||||||
|
|
||||||
|
Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:
|
||||||
|
Dr. Caroline Porwoll
|
||||||
|
[Adresse]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 11. Datenschutz (/datenschutz)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Datenschutzerklärung | BlogWoman
|
||||||
|
- Description: DSGVO-konforme Datenschutzerklärung von BlogWoman.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: text-block
|
||||||
|
- **Heading:** Datenschutzerklärung
|
||||||
|
- **Content:** [DSGVO-konforme Datenschutzerklärung mit Abschnitten zu: Verantwortlicher, Datenerfassung, Newsletter, Analytics, Cookies, Affiliate-Netzwerke, Betroffenenrechte]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 12. Transparenz (/transparenz)
|
||||||
|
|
||||||
|
**Meta:**
|
||||||
|
- Title: Transparenz & Affiliate-Offenlegung | BlogWoman
|
||||||
|
- Description: Ehrlichkeit ist ein Kernwert von BlogWoman. Hier findest du volle Transparenz zu Affiliate-Links und Sponsoring.
|
||||||
|
|
||||||
|
**Blocks:**
|
||||||
|
|
||||||
|
#### Block 1: hero-block
|
||||||
|
- **Heading:** Transparenz & Affiliate-Offenlegung
|
||||||
|
- **Subheading:** Ehrlichkeit ist ein Kernwert von BlogWoman.
|
||||||
|
|
||||||
|
#### Block 2: text-block
|
||||||
|
- **Content:**
|
||||||
|
```
|
||||||
|
AFFILIATE-LINKS
|
||||||
|
|
||||||
|
Einige Links auf dieser Seite sind Affiliate-Links (*).
|
||||||
|
Wenn du über diese Links kaufst, erhalte ich eine kleine
|
||||||
|
Provision – für dich entstehen keine Mehrkosten.
|
||||||
|
|
||||||
|
Ich empfehle nur Produkte, die ich selbst nutze oder
|
||||||
|
gründlich geprüft habe. Bezahlte Empfehlungen gibt es nicht.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
SPONSORING
|
||||||
|
|
||||||
|
Gesponserte Inhalte werden immer klar gekennzeichnet
|
||||||
|
(„Werbung" oder „In Kooperation mit").
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
WAS ICH NICHT EMPFEHLE
|
||||||
|
|
||||||
|
• Fast Fashion
|
||||||
|
• Detox/Wunder-Produkte
|
||||||
|
• Alkohol, Glücksspiel, Nikotin
|
||||||
|
• Krypto/High-Risk-Investments
|
||||||
|
• Alles, was ich nicht selbst nutzen würde
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Fragen? hello@blogwoman.de
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Blog-Posts (Launch-Artikel)
|
||||||
|
|
||||||
|
### Post 1: Der komplette GRFI-Guide
|
||||||
|
- **Titel:** Der komplette GRFI-Guide: In 7 Minuten boardroom-ready
|
||||||
|
- **Slug:** grfi-guide
|
||||||
|
- **Autor:** Dr. Caroline Porwoll
|
||||||
|
- **Kategorie:** Stil & Wirkung
|
||||||
|
- **Tags:** GRFI, Business-Outfit, Morgenroutine
|
||||||
|
- **Type:** blog
|
||||||
|
- **isFeatured:** true
|
||||||
|
- **Excerpt:** Wie du in 7-10 Minuten vom Alltag zur Präsenz kommst. Mein komplettes System für Outfit, Grooming und Haltung.
|
||||||
|
- **Status:** published
|
||||||
|
- **Content:** [Ausführlicher Guide mit Schritt-für-Schritt-Anleitung, Checkliste, Bilder]
|
||||||
|
|
||||||
|
### Post 2: Capsule Wardrobe für berufstätige Mütter
|
||||||
|
- **Titel:** Capsule Wardrobe für berufstätige Mütter: Mein System
|
||||||
|
- **Slug:** capsule-wardrobe-berufstaetige-muetter
|
||||||
|
- **Autor:** Dr. Caroline Porwoll
|
||||||
|
- **Kategorie:** Stil & Wirkung
|
||||||
|
- **Tags:** Capsule-Wardrobe, Investment-Piece
|
||||||
|
- **Type:** blog
|
||||||
|
- **isFeatured:** false
|
||||||
|
- **Excerpt:** 30 Teile, unendliche Kombinationen. So baue ich eine Garderobe, die im Board und auf dem Spielplatz funktioniert.
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
### Post 3: Cost-per-Wear erklärt
|
||||||
|
- **Titel:** Cost-per-Wear erklärt: So rechnest du Investment-Pieces
|
||||||
|
- **Slug:** cost-per-wear-erklaert
|
||||||
|
- **Autor:** Dr. Caroline Porwoll
|
||||||
|
- **Kategorie:** Stil & Wirkung
|
||||||
|
- **Tags:** Investment-Piece, Capsule-Wardrobe
|
||||||
|
- **Type:** blog
|
||||||
|
- **isFeatured:** false
|
||||||
|
- **Excerpt:** Warum ein 400€-Blazer günstiger sein kann als einer für 60€. Die Mathematik hinter smarten Käufen.
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
### Post 4: Sunday Reset
|
||||||
|
- **Titel:** Sunday Reset: 2 Stunden für eine stressfreie Woche
|
||||||
|
- **Slug:** sunday-reset-routine
|
||||||
|
- **Autor:** Dr. Caroline Porwoll
|
||||||
|
- **Kategorie:** Systeme & Entscheidungen
|
||||||
|
- **Tags:** Zeitmanagement, Morgenroutine
|
||||||
|
- **Type:** blog
|
||||||
|
- **isFeatured:** false
|
||||||
|
- **Excerpt:** Meine wöchentliche Reset-Routine, die mir unter der Woche Stunden spart.
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
### Post 5: 5 Regeln für mehr Zeit
|
||||||
|
- **Titel:** 5 Regeln, die mir 5 Stunden pro Woche sparen
|
||||||
|
- **Slug:** 5-regeln-zeitersparnis
|
||||||
|
- **Autor:** Dr. Caroline Porwoll
|
||||||
|
- **Kategorie:** Systeme & Entscheidungen
|
||||||
|
- **Tags:** Zeitmanagement, Entscheidungen
|
||||||
|
- **Type:** blog
|
||||||
|
- **isFeatured:** false
|
||||||
|
- **Excerpt:** Keine Hacks. Keine Tricks. Nur Regeln, die funktionieren.
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
### Post 6: Warum ich BlogWoman gestartet habe
|
||||||
|
- **Titel:** Warum ich BlogWoman gestartet habe
|
||||||
|
- **Slug:** warum-blogwoman
|
||||||
|
- **Autor:** Dr. Caroline Porwoll
|
||||||
|
- **Kategorie:** Karriere x Familie
|
||||||
|
- **Tags:** Working-Mom
|
||||||
|
- **Type:** blog
|
||||||
|
- **isFeatured:** true
|
||||||
|
- **Excerpt:** Die Geschichte hinter BlogWoman. Was mich dazu gebracht hat, diesen Kanal zu starten.
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
### Post 7: Meine 10 Investment-Pieces
|
||||||
|
- **Titel:** Meine 10 Investment-Pieces (mit CPW nach Jahren)
|
||||||
|
- **Slug:** meine-investment-pieces
|
||||||
|
- **Autor:** Dr. Caroline Porwoll
|
||||||
|
- **Kategorie:** Stil & Wirkung
|
||||||
|
- **Tags:** Investment-Piece, Capsule-Wardrobe
|
||||||
|
- **Type:** blog
|
||||||
|
- **isFeatured:** false
|
||||||
|
- **Excerpt:** Die Teile, die ich wirklich trage. Mit echten Zahlen nach Jahren der Nutzung.
|
||||||
|
- **Status:** published
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Formulare
|
||||||
|
|
||||||
|
### Kontaktformular
|
||||||
|
- **Name:** Kontaktformular
|
||||||
|
- **Felder:**
|
||||||
|
- Name (Text, Pflicht)
|
||||||
|
- E-Mail (E-Mail, Pflicht)
|
||||||
|
- Betreff (Dropdown: Allgemeine Anfrage, Kooperation, Presse, Sonstiges)
|
||||||
|
- Nachricht (Textarea, Pflicht)
|
||||||
|
- **Bestätigungs-E-Mail:** Ja, an Absender
|
||||||
|
- **Benachrichtigung:** hello@blogwoman.de
|
||||||
|
|
||||||
|
### Kooperations-Anfrage
|
||||||
|
- **Name:** Kooperations-Anfrage
|
||||||
|
- **Felder:**
|
||||||
|
- Firma/Marke (Text, Pflicht)
|
||||||
|
- Ansprechpartner (Text, Pflicht)
|
||||||
|
- E-Mail (E-Mail, Pflicht)
|
||||||
|
- Website (URL)
|
||||||
|
- Art der Kooperation (Dropdown: Video-Integration, Shorts, Newsletter, Blog, Affiliate, Sonstiges)
|
||||||
|
- Budget-Range (Dropdown: <1.000€, 1.000-5.000€, 5.000-10.000€, >10.000€)
|
||||||
|
- Nachricht (Textarea, Pflicht)
|
||||||
|
- **Benachrichtigung:** kooperationen@blogwoman.de
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SEO-Einstellungen (Global für Tenant)
|
||||||
|
|
||||||
|
- **Title Suffix:** | BlogWoman
|
||||||
|
- **Default Description:** Für Frauen, die Karriere, Familie und Stil ernst nehmen. Systeme statt Motivation. Von Dr. Caroline Porwoll.
|
||||||
|
- **Default OG Image:** BlogWoman Social Share Image (1200x630, Logo + Tagline)
|
||||||
|
- **Robots:** index, follow
|
||||||
|
- **Google Search Console:** [Code einfügen]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cookie-Konfiguration
|
||||||
|
|
||||||
|
### Kategorien
|
||||||
|
1. **Notwendig** (necessary) - Immer aktiv
|
||||||
|
2. **Funktional** (functional) - Optional
|
||||||
|
3. **Statistik** (analytics) - Optional (Umami)
|
||||||
|
4. **Marketing** (marketing) - Optional (Affiliate-Tracking)
|
||||||
|
|
||||||
|
### Cookies dokumentieren
|
||||||
|
- Umami Analytics (analytics)
|
||||||
|
- Newsletter-Tool Cookies (functional)
|
||||||
|
- Affiliate-Netzwerk Cookies (marketing)
|
||||||
|
|
||||||
|
### Banner-Texte (DE)
|
||||||
|
- **Titel:** Wir respektieren deine Privatsphäre
|
||||||
|
- **Beschreibung:** BlogWoman verwendet Cookies, um dein Erlebnis zu verbessern. Du entscheidest, welche Cookies du erlaubst.
|
||||||
|
- **Accept All:** Alle akzeptieren
|
||||||
|
- **Accept Necessary:** Nur notwendige
|
||||||
|
- **Settings:** Einstellungen
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Zusammenfassung der zu erstellenden Inhalte
|
||||||
|
|
||||||
|
| Content-Typ | Anzahl |
|
||||||
|
|-------------|--------|
|
||||||
|
| Tenant | 1 |
|
||||||
|
| Site-Settings | 1 |
|
||||||
|
| Navigationen | 2 (Header, Footer) |
|
||||||
|
| Seiten | 12+ (+ Favoriten-Unterseiten + Serien-Unterseiten) |
|
||||||
|
| Kategorien | 4 |
|
||||||
|
| Tags | 10 |
|
||||||
|
| Autoren | 1 |
|
||||||
|
| Serien | 9 |
|
||||||
|
| Favoriten-Kategorien | 5 |
|
||||||
|
| Favoriten (Produkte) | 7+ (Beispiele) |
|
||||||
|
| Blog-Posts | 7 |
|
||||||
|
| Formulare | 2 |
|
||||||
|
| SEO-Settings | 1 |
|
||||||
|
| Cookie-Config | 1 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Prompt-Version: 1.0 | Januar 2025*
|
||||||
|
*Basierend auf: BlogWoman Website-Struktur v2*
|
||||||
527
prompts/blogwoman-payload-development_1.md
Normal file
527
prompts/blogwoman-payload-development_1.md
Normal file
|
|
@ -0,0 +1,527 @@
|
||||||
|
# BlogWoman.de - Payload CMS Erweiterungen
|
||||||
|
|
||||||
|
**Projekt:** cms.c2sgmbh (Payload CMS Multi-Tenant)
|
||||||
|
**Ziel:** Neue Collections und Blocks für blogwoman.de
|
||||||
|
**Server:** sv-payload (10.10.181.100) / Production: Hetzner 3 (162.55.85.18)
|
||||||
|
**Repository:** github.com/complexcaresolutions/cms.c2sgmbh
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kontext
|
||||||
|
|
||||||
|
Das Payload CMS Multi-Tenant-System wird um Features für blogwoman.de erweitert.
|
||||||
|
BlogWoman ist ein Lifestyle-Blog für berufstätige Frauen mit Fokus auf:
|
||||||
|
- Affiliate-Produkte (Favoriten)
|
||||||
|
- YouTube-Serien mit eigenem Branding
|
||||||
|
- Newsletter-Conversions
|
||||||
|
- SEO-optimierter Blog-Content
|
||||||
|
|
||||||
|
**Tenant:** blogwoman (muss in Tenants Collection angelegt werden, ID wird dynamisch)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bestehende Infrastruktur
|
||||||
|
|
||||||
|
### Vorhandene Collections (NICHT ändern)
|
||||||
|
- Users, Tenants, Media, Pages, Posts, Categories
|
||||||
|
- Testimonials, FAQs, Team, Services
|
||||||
|
- NewsletterSubscribers, Videos, VideoCategories
|
||||||
|
- CookieConfigurations, CookieInventory, ConsentLogs
|
||||||
|
- AuditLogs, FormSubmissions
|
||||||
|
|
||||||
|
### Vorhandene Blocks (NICHT ändern)
|
||||||
|
- HeroBlock, HeroSliderBlock, TextBlock, ImageTextBlock
|
||||||
|
- CardGridBlock, QuoteBlock, CTABlock, VideoBlock
|
||||||
|
- PostsListBlock, TestimonialsBlock, NewsletterBlock
|
||||||
|
- FAQBlock, TeamBlock, ServicesBlock, TimelineBlock
|
||||||
|
- ProcessStepsBlock, DividerBlock, ContactFormBlock
|
||||||
|
|
||||||
|
### Tech Stack
|
||||||
|
- Payload CMS 3.69.0
|
||||||
|
- Next.js 15.5.9
|
||||||
|
- React 19.2.3
|
||||||
|
- PostgreSQL 17
|
||||||
|
- TypeScript
|
||||||
|
- pnpm
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 1: Favorites Collection & Block
|
||||||
|
|
||||||
|
### 1.1 Collection: `favorites`
|
||||||
|
|
||||||
|
**Datei:** `src/collections/Favorites.ts`
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Struktur:
|
||||||
|
import type { CollectionConfig } from 'payload'
|
||||||
|
|
||||||
|
export const Favorites: CollectionConfig = {
|
||||||
|
slug: 'favorites',
|
||||||
|
admin: {
|
||||||
|
group: 'Content',
|
||||||
|
useAsTitle: 'title',
|
||||||
|
defaultColumns: ['title', 'category', 'featured', 'isActive'],
|
||||||
|
},
|
||||||
|
access: {
|
||||||
|
read: () => true, // Public, aber Tenant-gefiltert
|
||||||
|
create: ({ req: { user } }) => !!user,
|
||||||
|
update: ({ req: { user } }) => !!user,
|
||||||
|
delete: ({ req: { user } }) => !!user,
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
// ... siehe Feld-Definition unten
|
||||||
|
],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Felder:**
|
||||||
|
|
||||||
|
| Feld | Typ | Config | Pflicht |
|
||||||
|
|------|-----|--------|---------|
|
||||||
|
| `title` | text | maxLength: 200 | required |
|
||||||
|
| `slug` | text | unique, admin.position: 'sidebar' | required |
|
||||||
|
| `description` | textarea | maxLength: 300 | - |
|
||||||
|
| `category` | select | options: siehe unten | required |
|
||||||
|
| `subcategory` | text | maxLength: 100 | - |
|
||||||
|
| `price` | number | min: 0 | - |
|
||||||
|
| `priceRange` | select | budget, mid, premium, luxury | - |
|
||||||
|
| `affiliateUrl` | text | URL-Validierung | required |
|
||||||
|
| `affiliateNetwork` | select | amazon, awin, ltk, direct, other | - |
|
||||||
|
| `image` | upload | relationTo: 'media' | required |
|
||||||
|
| `badge` | select | options: siehe unten | - |
|
||||||
|
| `featured` | checkbox | defaultValue: false | - |
|
||||||
|
| `isActive` | checkbox | defaultValue: true | required |
|
||||||
|
| `order` | number | defaultValue: 0 | - |
|
||||||
|
| `tenant` | relationship | relationTo: 'tenants' | required |
|
||||||
|
|
||||||
|
**Category Options:**
|
||||||
|
```typescript
|
||||||
|
const categoryOptions = [
|
||||||
|
{ label: 'Fashion', value: 'fashion' },
|
||||||
|
{ label: 'Beauty', value: 'beauty' },
|
||||||
|
{ label: 'Travel', value: 'travel' },
|
||||||
|
{ label: 'Tech', value: 'tech' },
|
||||||
|
{ label: 'Home', value: 'home' },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Badge Options:**
|
||||||
|
```typescript
|
||||||
|
const badgeOptions = [
|
||||||
|
{ label: 'Investment Piece', value: 'investment-piece' },
|
||||||
|
{ label: 'Daily Driver', value: 'daily-driver' },
|
||||||
|
{ label: 'GRFI Approved', value: 'grfi-approved' },
|
||||||
|
{ label: 'Neu', value: 'new' },
|
||||||
|
{ label: 'Bestseller', value: 'bestseller' },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Price Range Options:**
|
||||||
|
```typescript
|
||||||
|
const priceRangeOptions = [
|
||||||
|
{ label: 'Budget (< €50)', value: 'budget' },
|
||||||
|
{ label: 'Mid (€50-150)', value: 'mid' },
|
||||||
|
{ label: 'Premium (€150-500)', value: 'premium' },
|
||||||
|
{ label: 'Luxury (> €500)', value: 'luxury' },
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.2 Block: `favorites-block`
|
||||||
|
|
||||||
|
**Datei:** `src/blocks/FavoritesBlock.ts`
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import type { Block } from 'payload'
|
||||||
|
|
||||||
|
export const FavoritesBlock: Block = {
|
||||||
|
slug: 'favorites-block',
|
||||||
|
labels: {
|
||||||
|
singular: 'Favoriten',
|
||||||
|
plural: 'Favoriten',
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
// ... siehe unten
|
||||||
|
],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Block-Felder:**
|
||||||
|
|
||||||
|
| Feld | Typ | Default |
|
||||||
|
|------|-----|---------|
|
||||||
|
| `title` | text | - |
|
||||||
|
| `subtitle` | text | - |
|
||||||
|
| `category` | select | 'all' (+ alle category options) |
|
||||||
|
| `showFeaturedOnly` | checkbox | false |
|
||||||
|
| `limit` | number | 8 |
|
||||||
|
| `layout` | select | 'grid' (grid, list, carousel) |
|
||||||
|
| `columns` | select | '4' (2, 3, 4) |
|
||||||
|
| `showPrice` | checkbox | true |
|
||||||
|
| `showBadge` | checkbox | true |
|
||||||
|
| `backgroundColor` | select | 'white' |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 2: Series Collection & Blocks
|
||||||
|
|
||||||
|
### 2.1 Collection: `series`
|
||||||
|
|
||||||
|
**Datei:** `src/collections/Series.ts`
|
||||||
|
|
||||||
|
**Felder:**
|
||||||
|
|
||||||
|
| Feld | Typ | Config | Pflicht |
|
||||||
|
|------|-----|--------|---------|
|
||||||
|
| `title` | text | localized: true | required |
|
||||||
|
| `slug` | text | unique | required |
|
||||||
|
| `tagline` | text | localized: true, maxLength: 150 | - |
|
||||||
|
| `description` | richText | localized: true | - |
|
||||||
|
| `logo` | upload | relationTo: 'media' | - |
|
||||||
|
| `coverImage` | upload | relationTo: 'media' | - |
|
||||||
|
| `brandColor` | text | placeholder: '#B08D57' | - |
|
||||||
|
| `accentColor` | text | placeholder: '#FFFFFF' | - |
|
||||||
|
| `youtubePlaylistId` | text | - | - |
|
||||||
|
| `youtubePlaylistUrl` | text | URL-Validierung | - |
|
||||||
|
| `order` | number | defaultValue: 0 | - |
|
||||||
|
| `isActive` | checkbox | defaultValue: true | required |
|
||||||
|
| `tenant` | relationship | relationTo: 'tenants' | required |
|
||||||
|
|
||||||
|
**Admin Config:**
|
||||||
|
```typescript
|
||||||
|
admin: {
|
||||||
|
group: 'Content',
|
||||||
|
useAsTitle: 'title',
|
||||||
|
defaultColumns: ['title', 'slug', 'brandColor', 'isActive'],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 Block: `series-block`
|
||||||
|
|
||||||
|
**Datei:** `src/blocks/SeriesBlock.ts`
|
||||||
|
|
||||||
|
**Felder:**
|
||||||
|
|
||||||
|
| Feld | Typ | Default |
|
||||||
|
|------|-----|---------|
|
||||||
|
| `title` | text | - |
|
||||||
|
| `subtitle` | text | - |
|
||||||
|
| `layout` | select | 'grid' (grid, list, featured) |
|
||||||
|
| `showDescription` | checkbox | true |
|
||||||
|
| `showLogo` | checkbox | true |
|
||||||
|
| `limit` | number | 6 |
|
||||||
|
| `columns` | select | '3' (2, 3, 4) |
|
||||||
|
| `backgroundColor` | select | 'white' |
|
||||||
|
|
||||||
|
### 2.3 Block: `series-detail-block`
|
||||||
|
|
||||||
|
**Datei:** `src/blocks/SeriesDetailBlock.ts`
|
||||||
|
|
||||||
|
Für Serien-Einzelseiten mit Hero und Content.
|
||||||
|
|
||||||
|
**Felder:**
|
||||||
|
|
||||||
|
| Feld | Typ | Default |
|
||||||
|
|------|-----|---------|
|
||||||
|
| `series` | relationship | relationTo: 'series' |
|
||||||
|
| `showHero` | checkbox | true |
|
||||||
|
| `showDescription` | checkbox | true |
|
||||||
|
| `showRelatedPosts` | checkbox | true |
|
||||||
|
| `relatedPostsLimit` | number | 6 |
|
||||||
|
| `layout` | select | 'full' (full, compact) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 3: Video Embed Block
|
||||||
|
|
||||||
|
### 3.1 Block: `video-embed-block`
|
||||||
|
|
||||||
|
**Datei:** `src/blocks/VideoEmbedBlock.ts`
|
||||||
|
|
||||||
|
**Felder:**
|
||||||
|
|
||||||
|
| Feld | Typ | Config |
|
||||||
|
|------|-----|--------|
|
||||||
|
| `title` | text | optional |
|
||||||
|
| `videoSource` | select | youtube, vimeo, custom |
|
||||||
|
| `youtubeUrl` | text | condition: videoSource === 'youtube' |
|
||||||
|
| `vimeoUrl` | text | condition: videoSource === 'vimeo' |
|
||||||
|
| `customUrl` | text | condition: videoSource === 'custom' |
|
||||||
|
| `thumbnail` | upload | relationTo: 'media', optional |
|
||||||
|
| `caption` | text | localized: true |
|
||||||
|
| `privacyMode` | checkbox | defaultValue: true |
|
||||||
|
| `aspectRatio` | select | '16:9' (16:9, 4:3, 1:1, 9:16) |
|
||||||
|
| `maxWidth` | select | 'large' (full, large, medium, small) |
|
||||||
|
| `lazyLoad` | checkbox | defaultValue: true |
|
||||||
|
|
||||||
|
**YouTube URL Parser (Utility):**
|
||||||
|
```typescript
|
||||||
|
// src/lib/utils/youtube.ts
|
||||||
|
export function extractYouTubeId(url: string): string | null {
|
||||||
|
if (!url) return null
|
||||||
|
const patterns = [
|
||||||
|
/youtube\.com\/watch\?v=([^&]+)/,
|
||||||
|
/youtu\.be\/([^?]+)/,
|
||||||
|
/youtube\.com\/embed\/([^?]+)/,
|
||||||
|
/youtube\.com\/shorts\/([^?]+)/,
|
||||||
|
]
|
||||||
|
for (const pattern of patterns) {
|
||||||
|
const match = url.match(pattern)
|
||||||
|
if (match) return match[1]
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getYouTubeEmbedUrl(videoId: string, privacyMode = true): string {
|
||||||
|
const domain = privacyMode ? 'www.youtube-nocookie.com' : 'www.youtube.com'
|
||||||
|
return `https://${domain}/embed/${videoId}`
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getYouTubeThumbnail(videoId: string, quality: 'default' | 'hq' | 'maxres' = 'hq'): string {
|
||||||
|
const qualityMap = {
|
||||||
|
default: 'default',
|
||||||
|
hq: 'hqdefault',
|
||||||
|
maxres: 'maxresdefault',
|
||||||
|
}
|
||||||
|
return `https://img.youtube.com/vi/${videoId}/${qualityMap[quality]}.jpg`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 4: Stats Block
|
||||||
|
|
||||||
|
### 4.1 Block: `stats-block`
|
||||||
|
|
||||||
|
**Datei:** `src/blocks/StatsBlock.ts`
|
||||||
|
|
||||||
|
**Felder:**
|
||||||
|
|
||||||
|
| Feld | Typ | Config |
|
||||||
|
|------|-----|--------|
|
||||||
|
| `title` | text | optional |
|
||||||
|
| `subtitle` | text | optional |
|
||||||
|
| `stats` | array | siehe Stats Item |
|
||||||
|
| `layout` | select | 'row' (row, grid, cards) |
|
||||||
|
| `columns` | select | '4' (2, 3, 4, 5) |
|
||||||
|
| `animated` | checkbox | defaultValue: false |
|
||||||
|
| `backgroundColor` | select | 'white' (white, ivory, sand, dark) |
|
||||||
|
|
||||||
|
**Stats Array Item:**
|
||||||
|
|
||||||
|
| Feld | Typ | Config |
|
||||||
|
|------|-----|--------|
|
||||||
|
| `value` | text | required, z.B. "42.000" |
|
||||||
|
| `prefix` | text | optional, z.B. "€", ">" |
|
||||||
|
| `suffix` | text | optional, z.B. "+", "%", "K" |
|
||||||
|
| `label` | text | required, localized |
|
||||||
|
| `description` | text | optional, localized |
|
||||||
|
| `icon` | text | optional, Lucide icon name |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 5: Featured Content Block
|
||||||
|
|
||||||
|
### 5.1 Block: `featured-content-block`
|
||||||
|
|
||||||
|
**Datei:** `src/blocks/FeaturedContentBlock.ts`
|
||||||
|
|
||||||
|
**Felder:**
|
||||||
|
|
||||||
|
| Feld | Typ | Config |
|
||||||
|
|------|-----|--------|
|
||||||
|
| `title` | text | localized |
|
||||||
|
| `subtitle` | text | localized |
|
||||||
|
| `items` | array | siehe Items Array |
|
||||||
|
| `layout` | select | 'grid' (grid, carousel, list, featured-grid) |
|
||||||
|
| `columns` | select | '3' (2, 3, 4) |
|
||||||
|
| `showDates` | checkbox | defaultValue: true |
|
||||||
|
| `backgroundColor` | select | 'white' |
|
||||||
|
|
||||||
|
**Items Array:**
|
||||||
|
|
||||||
|
| Feld | Typ | Config |
|
||||||
|
|------|-----|--------|
|
||||||
|
| `itemType` | select | required: post, video, series, external |
|
||||||
|
| `post` | relationship | relationTo: 'posts', condition: itemType === 'post' |
|
||||||
|
| `video` | relationship | relationTo: 'videos', condition: itemType === 'video' |
|
||||||
|
| `series` | relationship | relationTo: 'series', condition: itemType === 'series' |
|
||||||
|
| `externalTitle` | text | condition: itemType === 'external' |
|
||||||
|
| `externalUrl` | text | condition: itemType === 'external' |
|
||||||
|
| `externalImage` | upload | relationTo: 'media', condition: itemType === 'external' |
|
||||||
|
| `externalDescription` | textarea | condition: itemType === 'external' |
|
||||||
|
| `customLabel` | text | optional, z.B. "NEU", "TRENDING" |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementierungs-Reihenfolge
|
||||||
|
|
||||||
|
### Schritt 1: Collections erstellen
|
||||||
|
1. `src/collections/Favorites.ts`
|
||||||
|
2. `src/collections/Series.ts`
|
||||||
|
|
||||||
|
### Schritt 2: Collections in payload.config.ts registrieren
|
||||||
|
```typescript
|
||||||
|
// In payload.config.ts
|
||||||
|
import { Favorites } from './collections/Favorites'
|
||||||
|
import { Series } from './collections/Series'
|
||||||
|
|
||||||
|
// In collections Array hinzufügen:
|
||||||
|
collections: [
|
||||||
|
// ... bestehende
|
||||||
|
Favorites,
|
||||||
|
Series,
|
||||||
|
],
|
||||||
|
```
|
||||||
|
|
||||||
|
### Schritt 3: Blocks erstellen
|
||||||
|
1. `src/blocks/FavoritesBlock.ts`
|
||||||
|
2. `src/blocks/SeriesBlock.ts`
|
||||||
|
3. `src/blocks/SeriesDetailBlock.ts`
|
||||||
|
4. `src/blocks/VideoEmbedBlock.ts`
|
||||||
|
5. `src/blocks/StatsBlock.ts`
|
||||||
|
6. `src/blocks/FeaturedContentBlock.ts`
|
||||||
|
|
||||||
|
### Schritt 4: Blocks in Pages registrieren
|
||||||
|
```typescript
|
||||||
|
// In src/collections/Pages.ts -> layout field -> blocks array
|
||||||
|
import { FavoritesBlock } from '../blocks/FavoritesBlock'
|
||||||
|
import { SeriesBlock } from '../blocks/SeriesBlock'
|
||||||
|
import { SeriesDetailBlock } from '../blocks/SeriesDetailBlock'
|
||||||
|
import { VideoEmbedBlock } from '../blocks/VideoEmbedBlock'
|
||||||
|
import { StatsBlock } from '../blocks/StatsBlock'
|
||||||
|
import { FeaturedContentBlock } from '../blocks/FeaturedContentBlock'
|
||||||
|
|
||||||
|
// blocks: [
|
||||||
|
// ... bestehende,
|
||||||
|
// FavoritesBlock,
|
||||||
|
// SeriesBlock,
|
||||||
|
// SeriesDetailBlock,
|
||||||
|
// VideoEmbedBlock,
|
||||||
|
// StatsBlock,
|
||||||
|
// FeaturedContentBlock,
|
||||||
|
// ]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Schritt 5: Utility-Funktionen erstellen
|
||||||
|
1. `src/lib/utils/youtube.ts`
|
||||||
|
|
||||||
|
### Schritt 6: Migration erstellen
|
||||||
|
```bash
|
||||||
|
pnpm payload migrate:create blogwoman_collections
|
||||||
|
```
|
||||||
|
|
||||||
|
### Schritt 7: Build & Test
|
||||||
|
```bash
|
||||||
|
pnpm lint --fix
|
||||||
|
pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Erfolgskriterien
|
||||||
|
|
||||||
|
### Funktional
|
||||||
|
- [ ] Favorites Collection: CRUD über Admin Panel funktioniert
|
||||||
|
- [ ] Favorites: Filterung nach Kategorie in API (`/api/favorites?where[category][equals]=fashion`)
|
||||||
|
- [ ] Favorites: Tenant-Isolation funktioniert
|
||||||
|
- [ ] Favorites Block: In Pages verwendbar
|
||||||
|
- [ ] Series Collection: CRUD funktioniert
|
||||||
|
- [ ] Series: Localization (de/en) funktioniert
|
||||||
|
- [ ] Series Block: In Pages verwendbar
|
||||||
|
- [ ] Series Detail Block: Zeigt Serie mit related Posts
|
||||||
|
- [ ] Video Embed Block: YouTube-URLs werden korrekt geparst
|
||||||
|
- [ ] Video Embed Block: Privacy Mode (youtube-nocookie) funktioniert
|
||||||
|
- [ ] Stats Block: Zeigt Statistiken in verschiedenen Layouts
|
||||||
|
- [ ] Featured Content Block: Verschiedene Content-Typen mischbar
|
||||||
|
|
||||||
|
### Technisch
|
||||||
|
- [ ] `pnpm lint` ohne Errors
|
||||||
|
- [ ] `pnpm build` erfolgreich
|
||||||
|
- [ ] Keine TypeScript-Fehler
|
||||||
|
- [ ] Migration erstellt und ausführbar
|
||||||
|
- [ ] API-Endpoints erreichbar:
|
||||||
|
- GET /api/favorites
|
||||||
|
- GET /api/series
|
||||||
|
|
||||||
|
### Admin UX
|
||||||
|
- [ ] Collections erscheinen unter "Content" Gruppe
|
||||||
|
- [ ] Blocks haben deutsche Labels
|
||||||
|
- [ ] Conditional Fields funktionieren (z.B. bei itemType)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Escape Hatch
|
||||||
|
|
||||||
|
Falls nach 20+ Iterationen blockiert:
|
||||||
|
|
||||||
|
1. **Dokumentiere in BLOCKERS.md:**
|
||||||
|
- Was genau nicht funktioniert
|
||||||
|
- Fehlermeldungen (vollständig)
|
||||||
|
- Versuchte Lösungsansätze
|
||||||
|
|
||||||
|
2. **Teile das Problem auf:**
|
||||||
|
- Nur Collections ohne Blocks
|
||||||
|
- Nur einen Block isoliert
|
||||||
|
|
||||||
|
3. **Prüfe Abhängigkeiten:**
|
||||||
|
- Ist Payload-Version kompatibel?
|
||||||
|
- Fehlen Import-Statements?
|
||||||
|
- Gibt es Naming-Konflikte?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referenzen
|
||||||
|
|
||||||
|
### Bestehende Collection als Vorlage
|
||||||
|
- `src/collections/Posts.ts` (für Struktur)
|
||||||
|
- `src/collections/Testimonials.ts` (für einfache Collection)
|
||||||
|
- `src/collections/Videos.ts` (falls vorhanden)
|
||||||
|
|
||||||
|
### Bestehende Blocks als Vorlage
|
||||||
|
- `src/blocks/PostsListBlock.ts`
|
||||||
|
- `src/blocks/TestimonialsBlock.ts`
|
||||||
|
- `src/blocks/CardGridBlock.ts`
|
||||||
|
|
||||||
|
### Payload Docs
|
||||||
|
- Collections: https://payloadcms.com/docs/configuration/collections
|
||||||
|
- Blocks: https://payloadcms.com/docs/fields/blocks
|
||||||
|
- Conditional Logic: https://payloadcms.com/docs/fields/overview#conditional-logic
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verzeichnis
|
||||||
|
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── collections/
|
||||||
|
│ ├── Favorites.ts # NEU
|
||||||
|
│ └── Series.ts # NEU
|
||||||
|
├── blocks/
|
||||||
|
│ ├── FavoritesBlock.ts # NEU
|
||||||
|
│ ├── SeriesBlock.ts # NEU
|
||||||
|
│ ├── SeriesDetailBlock.ts # NEU
|
||||||
|
│ ├── VideoEmbedBlock.ts # NEU
|
||||||
|
│ ├── StatsBlock.ts # NEU
|
||||||
|
│ └── FeaturedContentBlock.ts # NEU
|
||||||
|
├── lib/
|
||||||
|
│ └── utils/
|
||||||
|
│ └── youtube.ts # NEU
|
||||||
|
└── migrations/
|
||||||
|
└── YYYYMMDD_HHMMSS_blogwoman_collections.ts # NEU (auto-generiert)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fertig?
|
||||||
|
|
||||||
|
Wenn ALLE Erfolgskriterien erfüllt sind:
|
||||||
|
- Alle Collections erstellt und registriert
|
||||||
|
- Alle Blocks erstellt und in Pages registriert
|
||||||
|
- `pnpm lint` ohne Errors
|
||||||
|
- `pnpm build` erfolgreich
|
||||||
|
- Migration erstellt
|
||||||
|
|
||||||
|
Dann schreibe als letzte Zeile:
|
||||||
|
|
||||||
|
<promise>BLOGWOMAN_PAYLOAD_COMPLETE</promise>
|
||||||
1012
scripts/seed-blogwoman-continue.ts
Normal file
1012
scripts/seed-blogwoman-continue.ts
Normal file
File diff suppressed because it is too large
Load diff
1480
scripts/seed-blogwoman.ts
Normal file
1480
scripts/seed-blogwoman.ts
Normal file
File diff suppressed because it is too large
Load diff
511
src/migrations/20260109_030000_add_blogwoman_block_tables.ts
Normal file
511
src/migrations/20260109_030000_add_blogwoman_block_tables.ts
Normal file
|
|
@ -0,0 +1,511 @@
|
||||||
|
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migration: Add BlogWoman Block Tables
|
||||||
|
*
|
||||||
|
* Creates the missing pages_blocks_* tables for BlogWoman blocks:
|
||||||
|
* - favorites-block
|
||||||
|
* - series-block
|
||||||
|
* - series-detail-block
|
||||||
|
* - featured-content-block
|
||||||
|
*/
|
||||||
|
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
|
||||||
|
await db.execute(sql`
|
||||||
|
-- =====================================================
|
||||||
|
-- ENUM TYPES for BlogWoman Blocks
|
||||||
|
-- =====================================================
|
||||||
|
|
||||||
|
-- FavoritesBlock ENUMs
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_favorites_block_category" AS ENUM('all', 'fashion', 'beauty', 'travel', 'tech', 'home');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_favorites_block_layout" AS ENUM('grid', 'list', 'carousel');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_favorites_block_columns" AS ENUM('2', '3', '4');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_favorites_block_background_color" AS ENUM('white', 'ivory', 'sand', 'light', 'dark');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- SeriesBlock ENUMs
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_series_block_layout" AS ENUM('grid', 'list', 'featured');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_series_block_columns" AS ENUM('2', '3', '4');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_series_block_background_color" AS ENUM('white', 'ivory', 'sand', 'light', 'dark');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- SeriesDetailBlock ENUMs
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_series_detail_block_layout" AS ENUM('full', 'compact');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_series_detail_block_hero_height" AS ENUM('small', 'medium', 'large', 'fullscreen');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_series_detail_block_hero_text_align" AS ENUM('left', 'center', 'right');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- FeaturedContentBlock ENUMs
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_featured_content_block_layout" AS ENUM('grid', 'carousel', 'list', 'featured-grid');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_featured_content_block_columns" AS ENUM('2', '3', '4');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_featured_content_block_background_color" AS ENUM('white', 'ivory', 'sand', 'light', 'dark');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_featured_content_block_card_bg" AS ENUM('white', 'transparent', 'light');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_featured_content_block_card_img_ratio" AS ENUM('16:9', '4:3', '1:1', '3:2');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_featured_content_block_card_hover" AS ENUM('none', 'lift', 'zoom', 'shadow');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
CREATE TYPE "public"."enum_pages_blocks_featured_content_block_items_item_type" AS ENUM('post', 'video', 'series', 'external');
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- =====================================================
|
||||||
|
-- FAVORITES BLOCK TABLES
|
||||||
|
-- =====================================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_favorites_block" (
|
||||||
|
"_order" integer NOT NULL,
|
||||||
|
"_parent_id" integer NOT NULL,
|
||||||
|
"_path" text NOT NULL,
|
||||||
|
"id" varchar PRIMARY KEY NOT NULL,
|
||||||
|
"category" "enum_pages_blocks_favorites_block_category" DEFAULT 'all',
|
||||||
|
"show_featured_only" boolean DEFAULT false,
|
||||||
|
"limit" numeric DEFAULT 8,
|
||||||
|
"layout" "enum_pages_blocks_favorites_block_layout" DEFAULT 'grid',
|
||||||
|
"columns" "enum_pages_blocks_favorites_block_columns" DEFAULT '4',
|
||||||
|
"show_price" boolean DEFAULT true,
|
||||||
|
"show_badge" boolean DEFAULT true,
|
||||||
|
"show_description" boolean DEFAULT false,
|
||||||
|
"show_category" boolean DEFAULT false,
|
||||||
|
"background_color" "enum_pages_blocks_favorites_block_background_color" DEFAULT 'white',
|
||||||
|
"cta_show_cta" boolean DEFAULT false,
|
||||||
|
"cta_cta_url" varchar,
|
||||||
|
"block_name" varchar
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_favorites_block_locales" (
|
||||||
|
"title" varchar,
|
||||||
|
"subtitle" varchar,
|
||||||
|
"cta_cta_text" varchar DEFAULT 'Alle Favoriten ansehen',
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"_locale" "_locales" NOT NULL,
|
||||||
|
"_parent_id" varchar NOT NULL,
|
||||||
|
CONSTRAINT "pages_blocks_favorites_block_locales_locale_parent_id_unique" UNIQUE("_locale","_parent_id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- =====================================================
|
||||||
|
-- SERIES BLOCK TABLES
|
||||||
|
-- =====================================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_series_block" (
|
||||||
|
"_order" integer NOT NULL,
|
||||||
|
"_parent_id" integer NOT NULL,
|
||||||
|
"_path" text NOT NULL,
|
||||||
|
"id" varchar PRIMARY KEY NOT NULL,
|
||||||
|
"layout" "enum_pages_blocks_series_block_layout" DEFAULT 'grid',
|
||||||
|
"columns" "enum_pages_blocks_series_block_columns" DEFAULT '3',
|
||||||
|
"show_description" boolean DEFAULT true,
|
||||||
|
"show_logo" boolean DEFAULT true,
|
||||||
|
"show_tagline" boolean DEFAULT true,
|
||||||
|
"use_brand_colors" boolean DEFAULT true,
|
||||||
|
"limit" numeric DEFAULT 6,
|
||||||
|
"background_color" "enum_pages_blocks_series_block_background_color" DEFAULT 'white',
|
||||||
|
"cta_show_cta" boolean DEFAULT false,
|
||||||
|
"cta_cta_url" varchar,
|
||||||
|
"block_name" varchar
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_series_block_locales" (
|
||||||
|
"title" varchar,
|
||||||
|
"subtitle" varchar,
|
||||||
|
"cta_cta_text" varchar DEFAULT 'Alle Serien ansehen',
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"_locale" "_locales" NOT NULL,
|
||||||
|
"_parent_id" varchar NOT NULL,
|
||||||
|
CONSTRAINT "pages_blocks_series_block_locales_locale_parent_id_unique" UNIQUE("_locale","_parent_id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- =====================================================
|
||||||
|
-- SERIES DETAIL BLOCK TABLES
|
||||||
|
-- =====================================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_series_detail_block" (
|
||||||
|
"_order" integer NOT NULL,
|
||||||
|
"_parent_id" integer NOT NULL,
|
||||||
|
"_path" text NOT NULL,
|
||||||
|
"id" varchar PRIMARY KEY NOT NULL,
|
||||||
|
"series_id" integer,
|
||||||
|
"show_hero" boolean DEFAULT true,
|
||||||
|
"show_description" boolean DEFAULT true,
|
||||||
|
"show_brand_colors" boolean DEFAULT true,
|
||||||
|
"show_related_posts" boolean DEFAULT true,
|
||||||
|
"related_posts_limit" numeric DEFAULT 6,
|
||||||
|
"show_youtube_playlist" boolean DEFAULT true,
|
||||||
|
"layout" "enum_pages_blocks_series_detail_block_layout" DEFAULT 'full',
|
||||||
|
"hero_height" "enum_pages_blocks_series_detail_block_hero_height" DEFAULT 'medium',
|
||||||
|
"hero_overlay" boolean DEFAULT true,
|
||||||
|
"hero_text_align" "enum_pages_blocks_series_detail_block_hero_text_align" DEFAULT 'center',
|
||||||
|
"block_name" varchar
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_series_detail_block_locales" (
|
||||||
|
"related_posts_title" varchar DEFAULT 'Beiträge aus dieser Serie',
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"_locale" "_locales" NOT NULL,
|
||||||
|
"_parent_id" varchar NOT NULL,
|
||||||
|
CONSTRAINT "pages_blocks_series_detail_block_locales_locale_parent_id_unique" UNIQUE("_locale","_parent_id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Relationship table for series field
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_series_detail_block_rels" (
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"order" integer,
|
||||||
|
"parent_id" varchar NOT NULL,
|
||||||
|
"path" varchar NOT NULL,
|
||||||
|
"series_id" integer
|
||||||
|
);
|
||||||
|
|
||||||
|
-- =====================================================
|
||||||
|
-- FEATURED CONTENT BLOCK TABLES
|
||||||
|
-- =====================================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_featured_content_block" (
|
||||||
|
"_order" integer NOT NULL,
|
||||||
|
"_parent_id" integer NOT NULL,
|
||||||
|
"_path" text NOT NULL,
|
||||||
|
"id" varchar PRIMARY KEY NOT NULL,
|
||||||
|
"layout" "enum_pages_blocks_featured_content_block_layout" DEFAULT 'grid',
|
||||||
|
"columns" "enum_pages_blocks_featured_content_block_columns" DEFAULT '3',
|
||||||
|
"show_dates" boolean DEFAULT true,
|
||||||
|
"show_type" boolean DEFAULT true,
|
||||||
|
"show_description" boolean DEFAULT true,
|
||||||
|
"show_custom_labels" boolean DEFAULT true,
|
||||||
|
"background_color" "enum_pages_blocks_featured_content_block_background_color" DEFAULT 'white',
|
||||||
|
"card_bg" "enum_pages_blocks_featured_content_block_card_bg" DEFAULT 'white',
|
||||||
|
"card_shadow" boolean DEFAULT true,
|
||||||
|
"card_border" boolean DEFAULT false,
|
||||||
|
"card_img_ratio" "enum_pages_blocks_featured_content_block_card_img_ratio" DEFAULT '16:9',
|
||||||
|
"card_hover" "enum_pages_blocks_featured_content_block_card_hover" DEFAULT 'lift',
|
||||||
|
"cta_show_cta" boolean DEFAULT false,
|
||||||
|
"cta_cta_url" varchar,
|
||||||
|
"block_name" varchar
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_featured_content_block_locales" (
|
||||||
|
"title" varchar,
|
||||||
|
"subtitle" varchar,
|
||||||
|
"cta_cta_text" varchar DEFAULT 'Alle ansehen',
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"_locale" "_locales" NOT NULL,
|
||||||
|
"_parent_id" varchar NOT NULL,
|
||||||
|
CONSTRAINT "pages_blocks_featured_content_block_locales_locale_parent_id_unique" UNIQUE("_locale","_parent_id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Items array table for featured content
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_featured_content_block_items" (
|
||||||
|
"_order" integer NOT NULL,
|
||||||
|
"_parent_id" varchar NOT NULL,
|
||||||
|
"id" varchar PRIMARY KEY NOT NULL,
|
||||||
|
"item_type" "enum_pages_blocks_featured_content_block_items_item_type",
|
||||||
|
"post_id" integer,
|
||||||
|
"video_id" integer,
|
||||||
|
"series_id" integer,
|
||||||
|
"external_url" varchar,
|
||||||
|
"external_image_id" integer,
|
||||||
|
"featured" boolean DEFAULT false
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_featured_content_block_items_locales" (
|
||||||
|
"external_title" varchar,
|
||||||
|
"external_description" varchar,
|
||||||
|
"custom_label" varchar,
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"_locale" "_locales" NOT NULL,
|
||||||
|
"_parent_id" varchar NOT NULL,
|
||||||
|
CONSTRAINT "pages_blocks_featured_content_block_items_locales_locale_parent_id_unique" UNIQUE("_locale","_parent_id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Relationship table for items (post, video, series references)
|
||||||
|
CREATE TABLE IF NOT EXISTS "pages_blocks_featured_content_block_items_rels" (
|
||||||
|
"id" serial PRIMARY KEY NOT NULL,
|
||||||
|
"order" integer,
|
||||||
|
"parent_id" varchar NOT NULL,
|
||||||
|
"path" varchar NOT NULL,
|
||||||
|
"posts_id" integer,
|
||||||
|
"videos_id" integer,
|
||||||
|
"series_id" integer
|
||||||
|
);
|
||||||
|
|
||||||
|
-- =====================================================
|
||||||
|
-- INDEXES
|
||||||
|
-- =====================================================
|
||||||
|
|
||||||
|
-- Favorites Block indexes
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_favorites_block_order_idx" ON "pages_blocks_favorites_block" ("_order");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_favorites_block_parent_id_idx" ON "pages_blocks_favorites_block" ("_parent_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_favorites_block_path_idx" ON "pages_blocks_favorites_block" ("_path");
|
||||||
|
|
||||||
|
-- Series Block indexes
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_block_order_idx" ON "pages_blocks_series_block" ("_order");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_block_parent_id_idx" ON "pages_blocks_series_block" ("_parent_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_block_path_idx" ON "pages_blocks_series_block" ("_path");
|
||||||
|
|
||||||
|
-- Series Detail Block indexes
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_detail_block_order_idx" ON "pages_blocks_series_detail_block" ("_order");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_detail_block_parent_id_idx" ON "pages_blocks_series_detail_block" ("_parent_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_detail_block_path_idx" ON "pages_blocks_series_detail_block" ("_path");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_detail_block_series_idx" ON "pages_blocks_series_detail_block" ("series_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_detail_block_rels_order_idx" ON "pages_blocks_series_detail_block_rels" ("order");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_detail_block_rels_parent_fk" ON "pages_blocks_series_detail_block_rels" ("parent_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_detail_block_rels_path_idx" ON "pages_blocks_series_detail_block_rels" ("path");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_series_detail_block_rels_series_idx" ON "pages_blocks_series_detail_block_rels" ("series_id");
|
||||||
|
|
||||||
|
-- Featured Content Block indexes
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_order_idx" ON "pages_blocks_featured_content_block" ("_order");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_parent_id_idx" ON "pages_blocks_featured_content_block" ("_parent_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_path_idx" ON "pages_blocks_featured_content_block" ("_path");
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_items_order_idx" ON "pages_blocks_featured_content_block_items" ("_order");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_items_parent_fk" ON "pages_blocks_featured_content_block_items" ("_parent_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_items_post_idx" ON "pages_blocks_featured_content_block_items" ("post_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_items_video_idx" ON "pages_blocks_featured_content_block_items" ("video_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_items_series_idx" ON "pages_blocks_featured_content_block_items" ("series_id");
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_items_rels_order_idx" ON "pages_blocks_featured_content_block_items_rels" ("order");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_items_rels_parent_fk" ON "pages_blocks_featured_content_block_items_rels" ("parent_id");
|
||||||
|
CREATE INDEX IF NOT EXISTS "pages_blocks_featured_content_block_items_rels_path_idx" ON "pages_blocks_featured_content_block_items_rels" ("path");
|
||||||
|
|
||||||
|
-- =====================================================
|
||||||
|
-- FOREIGN KEY CONSTRAINTS
|
||||||
|
-- =====================================================
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_favorites_block" ADD CONSTRAINT "pages_blocks_favorites_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_favorites_block_locales" ADD CONSTRAINT "pages_blocks_favorites_block_locales_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_favorites_block"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_series_block" ADD CONSTRAINT "pages_blocks_series_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_series_block_locales" ADD CONSTRAINT "pages_blocks_series_block_locales_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_series_block"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_series_detail_block" ADD CONSTRAINT "pages_blocks_series_detail_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_series_detail_block_locales" ADD CONSTRAINT "pages_blocks_series_detail_block_locales_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_series_detail_block"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_series_detail_block_rels" ADD CONSTRAINT "pages_blocks_series_detail_block_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."pages_blocks_series_detail_block"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_series_detail_block_rels" ADD CONSTRAINT "pages_blocks_series_detail_block_rels_series_fk" FOREIGN KEY ("series_id") REFERENCES "public"."series"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_series_detail_block" ADD CONSTRAINT "pages_blocks_series_detail_block_series_fk" FOREIGN KEY ("series_id") REFERENCES "public"."series"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block" ADD CONSTRAINT "pages_blocks_featured_content_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_locales" ADD CONSTRAINT "pages_blocks_featured_content_block_locales_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_featured_content_block"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items" ADD CONSTRAINT "pages_blocks_featured_content_block_items_parent_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_featured_content_block"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items" ADD CONSTRAINT "pages_blocks_featured_content_block_items_external_image_fk" FOREIGN KEY ("external_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items" ADD CONSTRAINT "pages_blocks_featured_content_block_items_post_fk" FOREIGN KEY ("post_id") REFERENCES "public"."posts"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items" ADD CONSTRAINT "pages_blocks_featured_content_block_items_video_fk" FOREIGN KEY ("video_id") REFERENCES "public"."videos"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items" ADD CONSTRAINT "pages_blocks_featured_content_block_items_series_fk" FOREIGN KEY ("series_id") REFERENCES "public"."series"("id") ON DELETE set null ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items_locales" ADD CONSTRAINT "pages_blocks_featured_content_block_items_locales_parent_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_featured_content_block_items"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items_rels" ADD CONSTRAINT "pages_blocks_featured_content_block_items_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."pages_blocks_featured_content_block_items"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items_rels" ADD CONSTRAINT "pages_blocks_featured_content_block_items_rels_posts_fk" FOREIGN KEY ("posts_id") REFERENCES "public"."posts"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items_rels" ADD CONSTRAINT "pages_blocks_featured_content_block_items_rels_videos_fk" FOREIGN KEY ("videos_id") REFERENCES "public"."videos"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$ BEGIN
|
||||||
|
ALTER TABLE "pages_blocks_featured_content_block_items_rels" ADD CONSTRAINT "pages_blocks_featured_content_block_items_rels_series_fk" FOREIGN KEY ("series_id") REFERENCES "public"."series"("id") ON DELETE cascade ON UPDATE no action;
|
||||||
|
EXCEPTION
|
||||||
|
WHEN duplicate_object THEN null;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
|
||||||
|
await db.execute(sql`
|
||||||
|
-- Drop tables in reverse order (child tables first)
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_featured_content_block_items_rels";
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_featured_content_block_items_locales";
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_featured_content_block_items";
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_featured_content_block_locales";
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_featured_content_block";
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_series_detail_block_rels";
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_series_detail_block_locales";
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_series_detail_block";
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_series_block_locales";
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_series_block";
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_favorites_block_locales";
|
||||||
|
DROP TABLE IF EXISTS "pages_blocks_favorites_block";
|
||||||
|
|
||||||
|
-- Drop ENUMs
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_featured_content_block_items_item_type";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_featured_content_block_card_hover";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_featured_content_block_card_img_ratio";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_featured_content_block_card_bg";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_featured_content_block_background_color";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_featured_content_block_columns";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_featured_content_block_layout";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_series_detail_block_hero_text_align";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_series_detail_block_hero_height";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_series_detail_block_layout";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_series_block_background_color";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_series_block_columns";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_series_block_layout";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_favorites_block_background_color";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_favorites_block_columns";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_favorites_block_layout";
|
||||||
|
DROP TYPE IF EXISTS "enum_pages_blocks_favorites_block_category";
|
||||||
|
`);
|
||||||
|
}
|
||||||
|
|
@ -27,6 +27,7 @@ import * as migration_20260108_231200_add_video_embed_block_tables from './20260
|
||||||
import * as migration_20260108_231400_add_pages_rels_missing_columns from './20260108_231400_add_pages_rels_missing_columns';
|
import * as migration_20260108_231400_add_pages_rels_missing_columns from './20260108_231400_add_pages_rels_missing_columns';
|
||||||
import * as migration_20260109_020000_add_blogwoman_collections from './20260109_020000_add_blogwoman_collections';
|
import * as migration_20260109_020000_add_blogwoman_collections from './20260109_020000_add_blogwoman_collections';
|
||||||
import * as migration_20260109_023000_add_locations_hours_structured from './20260109_023000_add_locations_hours_structured';
|
import * as migration_20260109_023000_add_locations_hours_structured from './20260109_023000_add_locations_hours_structured';
|
||||||
|
import * as migration_20260109_030000_add_blogwoman_block_tables from './20260109_030000_add_blogwoman_block_tables';
|
||||||
|
|
||||||
export const migrations = [
|
export const migrations = [
|
||||||
{
|
{
|
||||||
|
|
@ -174,4 +175,9 @@ export const migrations = [
|
||||||
down: migration_20260109_023000_add_locations_hours_structured.down,
|
down: migration_20260109_023000_add_locations_hours_structured.down,
|
||||||
name: '20260109_023000_add_locations_hours_structured'
|
name: '20260109_023000_add_locations_hours_structured'
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
up: migration_20260109_030000_add_blogwoman_block_tables.up,
|
||||||
|
down: migration_20260109_030000_add_blogwoman_block_tables.down,
|
||||||
|
name: '20260109_030000_add_blogwoman_block_tables'
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue