# Universal Features - Dokumentation

*Letzte Aktualisierung: 08. Januar 2026*

## Übersicht

Die Universal Features erweitern das Payload CMS um wiederverwendbare Collections und Blocks für Blog, News, Testimonials, Newsletter, FAQ, Team und Prozess-Darstellungen. Alle Features sind Multi-Tenant-fähig.

**Wichtig:** Frontends verwenden die **Production-API** (cms.c2sgmbh.de).

---

## API-Endpoints für Frontend

### Collections

| Collection | Endpoint | Beschreibung |
|------------|----------|--------------|
| Posts | `GET /api/posts` | Blog, News, Presse |
| Testimonials | `GET /api/testimonials` | Kundenbewertungen |
| FAQs | `GET /api/faqs` | FAQ-Einträge |
| Team | `GET /api/team` | Team-Mitglieder |
| Services | `GET /api/services` | Leistungen |
| Timelines | `GET /api/timelines` | Chronologische Events |
| Workflows | `GET /api/workflows` | Prozess-Darstellungen |

### Beispiel: Posts laden

```typescript
// Featured Blog-Posts für Tenant C2S laden
const posts = await fetch(
  'https://cms.c2sgmbh.de/api/posts?where[tenant][equals]=4&where[type][equals]=blog&where[isFeatured][equals]=true&locale=de&limit=6'
).then(r => r.json())
```

### Newsletter API

| Endpoint | Methode | Beschreibung |
|----------|---------|--------------|
| `/api/newsletter/subscribe` | POST | Newsletter-Anmeldung |
| `/api/newsletter/confirm` | GET/POST | Double Opt-In Bestätigung |
| `/api/newsletter/unsubscribe` | GET/POST | Abmeldung |

```typescript
// Newsletter-Anmeldung
const response = await fetch('https://cms.c2sgmbh.de/api/newsletter/subscribe', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    email: 'user@example.com',
    firstName: 'Max',
    tenantId: 4,
    source: 'footer'
  })
})
```

---

## Collections

### 1. Posts Collection

**Pfad:** `src/collections/Posts.ts`
**Slug:** `posts`
**Admin-Gruppe:** Content

Die Posts Collection dient zur Verwaltung von Blog-Artikeln, News, Pressemitteilungen und Ankündigungen.

#### Felder

| Feld | Typ | Beschreibung | Pflicht |
|------|-----|--------------|---------|
| `title` | Text | Titel des Beitrags | Ja |
| `slug` | Text | URL-Pfad (unique) | Ja |
| `type` | Select | Art des Beitrags | Ja |
| `isFeatured` | Checkbox | Hervorgehobener Beitrag | Nein |
| `excerpt` | Textarea | Kurzfassung (max. 300 Zeichen) | Nein |
| `featuredImage` | Upload | Beitragsbild | Nein |
| `content` | RichText | Hauptinhalt | Ja |
| `categories` | Relationship | Kategorien (hasMany) | Nein |
| `author` | Text | Autorname | Nein |
| `status` | Select | draft/published/archived | Nein |
| `publishedAt` | Date | Veröffentlichungsdatum | Nein |
| `meta` | Group | SEO-Einstellungen | Nein |

#### Post-Typen

- `blog` - Blog-Artikel (Standard)
- `news` - News/Aktuelles
- `press` - Pressemitteilung
- `announcement` - Ankündigung

---

### 2. Testimonials Collection

**Pfad:** `src/collections/Testimonials.ts`
**Slug:** `testimonials`
**Admin-Gruppe:** Content

Kundenstimmen und Bewertungen für Referenz-Seiten.

#### Felder

| Feld | Typ | Beschreibung | Pflicht |
|------|-----|--------------|---------|
| `quote` | Textarea | Zitat/Bewertungstext | Ja |
| `author` | Text | Name des Kunden | Ja |
| `role` | Text | Position/Rolle | Nein |
| `company` | Text | Unternehmen | Nein |
| `image` | Upload | Portrait-Foto | Nein |
| `rating` | Number | Bewertung 1-5 Sterne | Nein |
| `source` | Text | Quelle (z.B. "Google Reviews") | Nein |
| `sourceUrl` | Text | Link zur Original-Bewertung | Nein |
| `date` | Date | Datum der Bewertung | Nein |
| `isActive` | Checkbox | Sichtbarkeit | Nein |
| `order` | Number | Sortierung | Nein |

---

### 3. Newsletter Subscribers Collection

**Pfad:** `src/collections/NewsletterSubscribers.ts`
**Slug:** `newsletter-subscribers`
**Admin-Gruppe:** Marketing

DSGVO-konforme Speicherung von Newsletter-Anmeldungen mit Double Opt-In.

#### Felder

| Feld | Typ | Beschreibung | Pflicht |
|------|-----|--------------|---------|
| `email` | Email | E-Mail-Adresse | Ja |
| `firstName` | Text | Vorname | Nein |
| `lastName` | Text | Nachname | Nein |
| `status` | Select | Anmeldestatus | Ja |
| `interests` | Select (hasMany) | Interessengebiete | Nein |
| `source` | Text | Anmeldequelle | Nein |
| `subscribedAt` | Date | Anmeldedatum (auto) | Nein |
| `confirmedAt` | Date | Bestätigungsdatum (auto) | Nein |
| `unsubscribedAt` | Date | Abmeldedatum (auto) | Nein |
| `confirmationToken` | Text | Token für Double Opt-In (auto) | Nein |
| `ipAddress` | Text | IP-Adresse (DSGVO) | Nein |
| `userAgent` | Text | Browser-Info | Nein |

#### Double Opt-In Flow

1. User meldet sich an → Status: `pending`, Token generiert
2. E-Mail mit Bestätigungs-Link wird automatisch gesendet
3. User klickt Link → Status: `confirmed`
4. Willkommens-E-Mail wird gesendet
5. Abmeldung jederzeit über Link möglich

#### Status-Werte

- `pending` - Ausstehend (Double Opt-In)
- `confirmed` - Bestätigt
- `unsubscribed` - Abgemeldet
- `bounced` - E-Mail nicht zustellbar

---

### 4. FAQs Collection

**Pfad:** `src/collections/FAQs.ts`
**Slug:** `faqs`
**Admin-Gruppe:** Content

Häufig gestellte Fragen mit Kategorisierung.

#### Felder

| Feld | Typ | Beschreibung | Pflicht |
|------|-----|--------------|---------|
| `question` | Text | Frage | Ja |
| `answer` | RichText | Antwort | Ja |
| `category` | Text | Kategorie | Nein |
| `order` | Number | Sortierung | Nein |
| `isActive` | Checkbox | Sichtbarkeit | Nein |

---

### 5. Team Collection

**Pfad:** `src/collections/Team.ts`
**Slug:** `team`
**Admin-Gruppe:** Content

Team-Mitglieder und Mitarbeiter.

#### Felder

| Feld | Typ | Beschreibung | Pflicht |
|------|-----|--------------|---------|
| `name` | Text | Name | Ja |
| `role` | Text | Position/Rolle | Nein |
| `image` | Upload | Portrait-Foto | Nein |
| `bio` | Textarea | Kurzbiografie | Nein |
| `email` | Email | E-Mail-Adresse | Nein |
| `phone` | Text | Telefon | Nein |
| `socialLinks` | Array | Social Media Links | Nein |
| `order` | Number | Sortierung | Nein |
| `isActive` | Checkbox | Sichtbarkeit | Nein |

---

### 6. Services Collection

**Pfad:** `src/collections/Services.ts`
**Slug:** `services`
**Admin-Gruppe:** Content

Leistungen und Dienstleistungen.

#### Felder

| Feld | Typ | Beschreibung | Pflicht |
|------|-----|--------------|---------|
| `title` | Text | Leistungsname | Ja |
| `slug` | Text | URL-Pfad | Ja |
| `excerpt` | Textarea | Kurzbeschreibung | Nein |
| `content` | RichText | Detailbeschreibung | Nein |
| `icon` | Text | Icon-Name | Nein |
| `image` | Upload | Bild | Nein |
| `category` | Relationship | Service-Kategorie | Nein |
| `order` | Number | Sortierung | Nein |

---

### 7. Timelines Collection

**Pfad:** `src/collections/Timelines.ts`
**Slug:** `timelines`
**Admin-Gruppe:** Content

Chronologische Events für Geschichte, Meilensteine, Releases.

#### API

```typescript
// Timeline laden
fetch('https://cms.c2sgmbh.de/api/timelines?tenant=4&slug=company-history&locale=de')
```

#### Timeline-Typen

- `history` - Unternehmensgeschichte
- `milestones` - Projektmeilensteine
- `releases` - Produkt-Releases
- `career` - Karriere/Lebenslauf
- `events` - Ereignisse
- `process` - Prozess/Ablauf

---

### 8. Workflows Collection

**Pfad:** `src/collections/Workflows.ts`
**Slug:** `workflows`
**Admin-Gruppe:** Content

Komplexe Prozesse mit Phasen, Abhängigkeiten und Status-Tracking.

#### API

```typescript
// Workflow laden
fetch('https://cms.c2sgmbh.de/api/workflows?tenant=4&type=project&locale=de')
```

#### Workflow-Typen

- `project` - Projektabläufe
- `business` - Geschäftsprozesse
- `approval` - Genehmigungs-Workflows
- `onboarding` - Mitarbeiter-/Kundeneinführung
- `support` - Support/Service-Prozesse
- `development` - Entwicklungsprozesse

---

### 9. Favorites Collection (BlogWoman)

**Pfad:** `src/collections/Favorites.ts`
**Slug:** `favorites`
**Admin-Gruppe:** Content

Affiliate-Produkte für Blogger/Influencer mit Kategorien und Badges.

#### API

```typescript
// Alle Favorites eines Tenants
fetch('https://cms.c2sgmbh.de/api/favorites?where[tenant][equals]=4&locale=de')

// Nach Kategorie filtern
fetch('https://cms.c2sgmbh.de/api/favorites?where[tenant][equals]=4&where[category][equals]=fashion')
```

#### Felder

| Feld | Typ | Beschreibung | Pflicht |
|------|-----|--------------|---------|
| `title` | Text | Produktname | Ja |
| `slug` | Text | URL-Pfad (auto) | Ja |
| `description` | RichText | Beschreibung (lokalisiert) | Nein |
| `image` | Upload | Produktbild | Nein |
| `affiliateUrl` | Text | Affiliate-Link | Ja |
| `price` | Text | Preis (Freitext) | Nein |
| `category` | Select | fashion, beauty, travel, tech, home | Nein |
| `badge` | Select | investment-piece, daily-driver, grfi-approved, new, bestseller | Nein |
| `priceRange` | Select | budget, mid, premium, luxury | Nein |
| `isActive` | Checkbox | Sichtbarkeit | Nein |
| `order` | Number | Sortierung | Nein |

---

### 10. Series Collection (BlogWoman)

**Pfad:** `src/collections/Series.ts`
**Slug:** `series`
**Admin-Gruppe:** Content

YouTube-Serien mit eigenem Branding für Content-Reihen.

#### API

```typescript
// Alle Serien eines Tenants
fetch('https://cms.c2sgmbh.de/api/series?where[tenant][equals]=4&locale=de')

// Einzelne Serie nach Slug
fetch('https://cms.c2sgmbh.de/api/series?where[tenant][equals]=4&where[slug][equals]=grfi')
```

#### Felder

| Feld | Typ | Beschreibung | Pflicht |
|------|-----|--------------|---------|
| `title` | Text | Serienname (lokalisiert) | Ja |
| `slug` | Text | URL-Pfad (auto) | Ja |
| `description` | RichText | Beschreibung (lokalisiert) | Nein |
| `logo` | Upload | Serien-Logo | Nein |
| `coverImage` | Upload | Cover-Bild für Hero | Nein |
| `brandColor` | Text | Hex-Farbcode (#RRGGBB) | Nein |
| `youtubePlaylistId` | Text | YouTube Playlist ID | Nein |
| `isActive` | Checkbox | Sichtbarkeit | Nein |

---

## Blocks

Alle Blocks können in der Pages Collection verwendet werden.

### Block-Übersicht

#### Content Blocks

| Block | Slug | Beschreibung |
|-------|------|--------------|
| Posts List | `posts-list-block` | Blog/News-Liste |
| Testimonials | `testimonials-block` | Kundenstimmen |
| Newsletter | `newsletter-block` | Anmeldeformular |
| Process Steps | `process-steps-block` | Prozess-Schritte |
| Timeline | `timeline-block` | Chronologie |
| FAQ | `faq-block` | FAQ-Akkordeon |
| Team | `team-block` | Team-Mitglieder |
| Services | `services-block` | Leistungen |

#### BlogWoman Blocks (NEU)

| Block | Slug | Beschreibung |
|-------|------|--------------|
| Favorites | `favorites-block` | Affiliate-Produkte Grid/Liste/Karussell |
| Series | `series-block` | YouTube-Serien Übersicht |
| Series Detail | `series-detail-block` | Serien-Einzelseite mit Hero |
| Video Embed | `video-embed-block` | YouTube/Vimeo Embed mit Privacy Mode |
| Featured Content | `featured-content-block` | Kuratierte Mixed-Content Sammlung |

### 1. Posts List Block

**Slug:** `posts-list-block`

Zeigt eine Liste von Blog-Artikeln, News oder anderen Post-Typen an.

#### Konfigurationsoptionen

| Option | Typ | Standard | Beschreibung |
|--------|-----|----------|--------------|
| `title` | Text | - | Überschrift |
| `subtitle` | Text | - | Untertitel |
| `postType` | Select | blog | Beitragstyp-Filter |
| `layout` | Select | grid | Darstellung |
| `columns` | Select | 3 | Spaltenanzahl (bei Grid) |
| `limit` | Number | 6 | Anzahl Beiträge |
| `showFeaturedOnly` | Checkbox | false | Nur hervorgehobene |
| `filterByCategory` | Relationship | - | Kategorie-Filter |
| `showExcerpt` | Checkbox | true | Kurzfassung anzeigen |
| `showDate` | Checkbox | true | Datum anzeigen |
| `showAuthor` | Checkbox | false | Autor anzeigen |
| `showCategory` | Checkbox | true | Kategorie anzeigen |
| `showPagination` | Checkbox | false | Pagination |
| `showReadMore` | Checkbox | true | "Alle anzeigen" Link |
| `backgroundColor` | Select | white | Hintergrundfarbe |

#### Layout-Optionen

- `grid` - Karten im Grid
- `list` - Listenansicht
- `featured` - Featured + Grid
- `compact` - Kompakt (für Sidebar)
- `masonry` - Masonry-Layout

---

### 2. Testimonials Block

**Slug:** `testimonials-block`

Zeigt Kundenstimmen aus der Testimonials Collection.

#### Layout-Optionen

- `slider` - Karussell
- `grid` - Karten im Grid
- `single` - Einzeln (Featured)
- `masonry` - Masonry-Layout
- `list` - Listenansicht

---

### 3. Newsletter Block

**Slug:** `newsletter-block`

Anmeldeformular für Newsletter mit DSGVO-Hinweis.

#### Layout-Optionen

- `inline` - Eingabe + Button nebeneinander
- `stacked` - Untereinander
- `with-image` - Mit Bild (50/50)
- `minimal` - Nur Input
- `card` - Karten-Design

---

### 4. FAQ Block

**Slug:** `faq-block`

FAQ-Akkordeon mit Schema.org Markup.

#### Konfigurationsoptionen

| Option | Typ | Beschreibung |
|--------|-----|--------------|
| `title` | Text | Überschrift |
| `subtitle` | Text | Untertitel |
| `displayMode` | Select | all / selected / byCategory |
| `selectedFaqs` | Relationship | Handverlesene FAQs |
| `filterCategory` | Text | Kategorie-Filter |
| `layout` | Select | accordion / list / grid |
| `expandFirst` | Checkbox | Erste FAQ offen |
| `showSchema` | Checkbox | JSON-LD generieren |

---

### 5. Team Block

**Slug:** `team-block`

Team-Mitglieder aus der Team Collection.

#### Layout-Optionen

- `grid` - Karten im Grid
- `list` - Listenansicht
- `carousel` - Karussell
- `compact` - Kompakt

---

### 6. Services Block

**Slug:** `services-block`

Leistungen aus der Services Collection.

#### Layout-Optionen

- `grid` - Karten im Grid
- `list` - Listenansicht mit Details
- `icons` - Icon-Grid
- `tabs` - Tab-Navigation

---

### 7. Favorites Block (BlogWoman)

**Slug:** `favorites-block`

Zeigt Affiliate-Produkte aus der Favorites Collection.

#### Konfigurationsoptionen

| Option | Typ | Beschreibung |
|--------|-----|--------------|
| `title` | Text | Überschrift |
| `subtitle` | Text | Untertitel |
| `displayMode` | Select | all / selected / byCategory |
| `selectedFavorites` | Relationship | Handverlesene Favorites |
| `filterCategory` | Select | Kategorie-Filter |
| `layout` | Select | grid / list / carousel |
| `columns` | Select | 2 / 3 / 4 Spalten |
| `limit` | Number | Anzahl Produkte |
| `showPrice` | Checkbox | Preis anzeigen |
| `showBadge` | Checkbox | Badge anzeigen |

---

### 8. Series Block (BlogWoman)

**Slug:** `series-block`

Übersicht aller YouTube-Serien mit Filteroptionen.

#### Konfigurationsoptionen

| Option | Typ | Beschreibung |
|--------|-----|--------------|
| `title` | Text | Überschrift |
| `subtitle` | Text | Untertitel |
| `displayMode` | Select | all / selected |
| `selectedSeries` | Relationship | Handverlesene Serien |
| `layout` | Select | grid / list / featured |
| `showDescription` | Checkbox | Beschreibung anzeigen |

---

### 9. Series Detail Block (BlogWoman)

**Slug:** `series-detail-block`

Hero-Bereich für eine einzelne Serie mit Branding.

#### Konfigurationsoptionen

| Option | Typ | Beschreibung |
|--------|-----|--------------|
| `series` | Relationship | Serien-Referenz |
| `layout` | Select | hero / compact / sidebar |
| `showLogo` | Checkbox | Logo anzeigen |
| `showPlaylistLink` | Checkbox | YouTube-Link anzeigen |
| `useBrandColor` | Checkbox | Markenfarbe verwenden |

---

### 10. Video Embed Block (BlogWoman)

**Slug:** `video-embed-block`

Datenschutzfreundliches Video-Embedding für YouTube/Vimeo.

#### Konfigurationsoptionen

| Option | Typ | Beschreibung |
|--------|-----|--------------|
| `videoUrl` | Text | YouTube/Vimeo URL |
| `title` | Text | Video-Titel |
| `aspectRatio` | Select | 16:9 / 4:3 / 1:1 / 9:16 |
| `privacyMode` | Checkbox | youtube-nocookie.com verwenden |
| `autoplay` | Checkbox | Automatisch abspielen |
| `showControls` | Checkbox | Player-Controls anzeigen |
| `thumbnailImage` | Upload | Custom Thumbnail |

---

### 11. Featured Content Block (BlogWoman)

**Slug:** `featured-content-block`

Kuratierte Sammlung aus verschiedenen Content-Typen.

#### Konfigurationsoptionen

| Option | Typ | Beschreibung |
|--------|-----|--------------|
| `title` | Text | Überschrift |
| `subtitle` | Text | Untertitel |
| `items` | Array | Gemischte Content-Items |
| `layout` | Select | grid / masonry / featured |

**Item-Typen:**
- `post` - Blog-Artikel
- `video` - Video
- `favorite` - Affiliate-Produkt
- `series` - YouTube-Serie
- `external` - Externer Link

---

## Multi-Tenant Konfiguration

Alle Collections sind für Multi-Tenant konfiguriert:

```typescript
// payload.config.ts
multiTenantPlugin({
  tenantsSlug: 'tenants',
  collections: {
    posts: {},
    testimonials: {},
    'newsletter-subscribers': {},
    faqs: {},
    team: {},
    services: {},
    timelines: {},
    workflows: {},
    favorites: {},    // BlogWoman
    series: {},       // BlogWoman
    // ... weitere Collections
  },
})
```

### Tenant-Zuordnung

Jedes Dokument enthält ein `tenant`-Feld. Die Access-Control sorgt für Isolation:

- **Authentifizierte Admins:** Sehen alle Dokumente
- **Anonyme Requests:** Nur Dokumente des passenden Tenants

### Tenant-IDs

| ID | Name | Slug |
|----|------|------|
| 1 | porwoll.de | porwoll |
| 4 | Complex Care Solutions GmbH | c2s |
| 5 | Gunshin | gunshin |

---

## Dateien-Übersicht

```
src/
├── collections/
│   ├── Posts.ts
│   ├── Categories.ts
│   ├── Testimonials.ts
│   ├── NewsletterSubscribers.ts
│   ├── FAQs.ts
│   ├── Team.ts
│   ├── Services.ts
│   ├── ServiceCategories.ts
│   ├── Timelines.ts
│   ├── Workflows.ts
│   ├── Favorites.ts          # BlogWoman
│   └── Series.ts             # BlogWoman
├── blocks/
│   ├── PostsListBlock.ts
│   ├── TestimonialsBlock.ts
│   ├── NewsletterBlock.ts
│   ├── ProcessStepsBlock.ts
│   ├── TimelineBlock.ts
│   ├── FAQBlock.ts
│   ├── TeamBlock.ts
│   ├── ServicesBlock.ts
│   ├── FavoritesBlock.ts     # BlogWoman
│   ├── SeriesBlock.ts        # BlogWoman
│   ├── SeriesDetailBlock.ts  # BlogWoman
│   ├── VideoEmbedBlock.ts    # BlogWoman
│   ├── FeaturedContentBlock.ts # BlogWoman
│   └── index.ts
├── lib/
│   ├── tenantAccess.ts
│   └── email/
│       ├── newsletter-service.ts
│       └── newsletter-templates.ts
├── hooks/
│   └── sendNewsletterConfirmation.ts
└── app/(payload)/api/newsletter/
    ├── subscribe/route.ts
    ├── confirm/route.ts
    └── unsubscribe/route.ts
```

---

## URLs

### Production (für Frontends)

| Resource | URL |
|----------|-----|
| Posts API | https://cms.c2sgmbh.de/api/posts |
| Testimonials API | https://cms.c2sgmbh.de/api/testimonials |
| FAQs API | https://cms.c2sgmbh.de/api/faqs |
| Team API | https://cms.c2sgmbh.de/api/team |
| Services API | https://cms.c2sgmbh.de/api/services |
| Timelines API | https://cms.c2sgmbh.de/api/timelines |
| Workflows API | https://cms.c2sgmbh.de/api/workflows |
| Newsletter Subscribe | https://cms.c2sgmbh.de/api/newsletter/subscribe |

### Development

| Resource | URL |
|----------|-----|
| API Base | https://pl.porwoll.tech/api |
| Admin Panel | https://pl.porwoll.tech/admin |

---

## Changelog

### Version 1.3 (08.01.2026)

- **BlogWoman Collections hinzugefügt:**
  - Favorites Collection (Affiliate-Produkte)
  - Series Collection (YouTube-Serien)
- **BlogWoman Blocks hinzugefügt:**
  - FavoritesBlock (Grid/Liste/Karussell)
  - SeriesBlock (Serien-Übersicht)
  - SeriesDetailBlock (Serien-Hero)
  - VideoEmbedBlock (Privacy-Mode)
  - FeaturedContentBlock (Mixed-Content)
- Dateien-Übersicht aktualisiert
- Multi-Tenant Konfiguration erweitert

### Version 1.2 (18.12.2025)

- Dokumentation auf Production-URLs aktualisiert
- API-Endpoints für Frontend hinzugefügt
- Newsletter Double Opt-In Flow dokumentiert
- Timelines und Workflows Collections hinzugefügt
- FAQ, Team, Services Blocks dokumentiert

### Version 1.1 (14.12.2025)

- Timelines Collection für chronologische Darstellungen
- Workflows Collection für Prozesse
- FAQs Collection mit Kategorisierung
- Team Collection mit Social Links
- Services Collection mit Kategorien

### Version 1.0 (30.11.2025)

- Posts Collection um `type`, `isFeatured`, `excerpt` erweitert
- Testimonials Collection erstellt
- NewsletterSubscribers Collection erstellt (DSGVO-konform)
- 5 neue Blocks für Pages implementiert
- Multi-Tenant Integration für alle Collections

---

*Letzte Aktualisierung: 08. Januar 2026*
