diff --git a/docs/anleitungen/API_ANLEITUNG.md b/docs/anleitungen/API_ANLEITUNG.md index 8d71ac7..96d4f44 100644 --- a/docs/anleitungen/API_ANLEITUNG.md +++ b/docs/anleitungen/API_ANLEITUNG.md @@ -863,32 +863,209 @@ export function NewsletterForm() { ## Rate Limiting -Aktuell gibt es kein Rate Limiting. Für Production-Umgebungen sollte ein Reverse Proxy (z.B. Caddy, nginx) mit Rate Limiting konfiguriert werden. +Das System verwendet einen zentralen Rate-Limiter mit Redis-Backend (Fallback auf In-Memory). + +### Vordefinierte Limits + +| Limiter | Limit | Fenster | Verwendung | +|---------|-------|---------|------------| +| `publicApiLimiter` | 60 Requests | 1 Minute | Öffentliche API-Endpunkte | +| `authLimiter` | 5 Requests | 15 Minuten | Login-Versuche | +| `emailLimiter` | 10 Requests | 1 Minute | E-Mail-Versand | +| `searchLimiter` | 30 Requests | 1 Minute | Suche & Posts-API | +| `formLimiter` | 5 Requests | 10 Minuten | Formular-Submissions, Newsletter | + +### Response bei Rate-Limit + +```json +{ + "error": "Too many requests", + "retryAfter": 60 +} +``` + +**HTTP Status:** 429 Too Many Requests + +**Headers:** +- `X-RateLimit-Limit`: Maximale Requests +- `X-RateLimit-Remaining`: Verbleibende Requests +- `X-RateLimit-Reset`: Reset-Zeitpunkt (Unix Timestamp) +- `Retry-After`: Sekunden bis zum Reset --- ## Alle Collections Übersicht +### Core Collections + | Collection | Slug | Öffentlich | Beschreibung | |------------|------|------------|--------------| | Users | `users` | Nein | Benutzer-Verwaltung | | Tenants | `tenants` | Nein | Mandanten | -| Media | `media` | Ja | Bilder und Dateien | +| Media | `media` | Ja | Bilder und Dateien (11 responsive Sizes) | | Pages | `pages` | Ja | Seiten mit Blocks | -| Posts | `posts` | Ja | Blog-Artikel und News | + +### Content Collections + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| +| Posts | `posts` | Ja | Blog, News, Presse, Ankündigungen | | Categories | `categories` | Ja | Kategorien für Posts | -| Social Links | `social-links` | Ja | Social Media Links | +| Tags | `tags` | Ja | Tags für Posts | +| Authors | `authors` | Ja | Autoren für Posts | | Testimonials | `testimonials` | Ja | Kundenbewertungen | -| Newsletter Subscribers | `newsletter-subscribers` | Create: Ja | Newsletter-Anmeldungen | +| FAQs | `faqs` | Ja | Häufig gestellte Fragen | +| Social Links | `social-links` | Ja | Social Media Links | + +### Team & Services + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| +| Team | `team` | Ja | Team-Mitglieder | +| Service Categories | `service-categories` | Ja | Kategorien für Leistungen | +| Services | `services` | Ja | Leistungen/Dienstleistungen | +| Jobs | `jobs` | Ja | Stellenangebote | + +### Portfolio & Media + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| +| Portfolios | `portfolios` | Ja | Portfolio-Galerien | +| Portfolio Categories | `portfolio-categories` | Ja | Kategorien für Portfolios | +| Videos | `videos` | Ja | Video-Bibliothek (YouTube/Vimeo/Upload) | +| Video Categories | `video-categories` | Ja | Kategorien für Videos | + +### Products (E-Commerce) + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| +| Products | `products` | Ja | Produkte | +| Product Categories | `product-categories` | Ja | Produkt-Kategorien | + +### Feature Collections + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| +| Locations | `locations` | Ja | Standorte/Filialen | +| Partners | `partners` | Ja | Partner/Kunden (Logos) | +| Downloads | `downloads` | Ja | Download-Dateien | +| Events | `events` | Ja | Veranstaltungen | +| Timelines | `timelines` | Ja | Chronologische Events | +| Workflows | `workflows` | Ja | Prozess-Darstellungen | + +### BlogWoman Collections (NEU) + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| +| Favorites | `favorites` | Ja | Affiliate-Produkte mit Kategorien/Badges | +| Series | `series` | Ja | YouTube-Serien mit Branding | + +### Formulare & Newsletter + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| +| Forms | `forms` | Nein | Formular-Builder (Plugin) | +| Form Submissions | `form-submissions` | Nein | Formular-Einsendungen mit CRM-Workflow | +| Newsletter Subscribers | `newsletter-subscribers` | Create: Ja | Newsletter mit Double Opt-In | + +### Consent & Privacy (DSGVO) + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| | Cookie Configurations | `cookie-configurations` | Ja (Tenant-isoliert) | Cookie-Banner Konfiguration | | Cookie Inventory | `cookie-inventory` | Ja (Tenant-isoliert) | Cookie-Dokumentation | | Consent Logs | `consent-logs` | Nein (API-Key) | WORM Audit-Trail | -| Privacy Policy Settings | `privacy-policy-settings` | Ja (Tenant-isoliert) | Datenschutzerklärungs-Konfiguration | +| Privacy Policy Settings | `privacy-policy-settings` | Ja (Tenant-isoliert) | Datenschutz-Konfiguration | + +### Tenant-spezifische Collections + +| Collection | Slug | Tenant | Beschreibung | +|------------|------|--------|--------------| +| Bookings | `bookings` | porwoll.de | Fotografie-Buchungen | +| Certifications | `certifications` | C2S | Zertifizierungen | +| Projects | `projects` | gunshin.de | Game-Development-Projekte | + +### System Collections + +| Collection | Slug | Öffentlich | Beschreibung | +|------------|------|------------|--------------| +| Site Settings | `site-settings` | Ja (Tenant-isoliert) | Website-Einstellungen | +| Navigations | `navigations` | Ja (Tenant-isoliert) | Navigationsmenüs | +| Email Logs | `email-logs` | Nein | E-Mail-Protokollierung | +| Audit Logs | `audit-logs` | Nein | Security Audit Trail | +| Redirects | `redirects` | Nein | URL-Weiterleitungen (Plugin) | + +--- + +## BlogWoman APIs (NEU) + +### Favorites API (Affiliate-Produkte) + +```bash +# Alle Favorites eines Tenants +curl "https://pl.porwoll.tech/api/favorites?where[tenant][equals]=1" + +# Nach Kategorie filtern +curl "https://pl.porwoll.tech/api/favorites?where[tenant][equals]=1&where[category][equals]=fashion" + +# Nach Badge filtern +curl "https://pl.porwoll.tech/api/favorites?where[tenant][equals]=1&where[badge][equals]=bestseller" + +# Nach Preisbereich filtern +curl "https://pl.porwoll.tech/api/favorites?where[tenant][equals]=1&where[priceRange][equals]=mid" +``` + +**Felder:** + +| Feld | Typ | Beschreibung | +|------|-----|--------------| +| `title` | string | Produktname | +| `slug` | string | URL-Pfad | +| `description` | richtext | Beschreibung | +| `image` | relation | Produktbild | +| `affiliateUrl` | string | Affiliate-Link | +| `price` | string | Preis (Freitext) | +| `category` | select | fashion, beauty, travel, tech, home | +| `badge` | select | investment-piece, daily-driver, grfi-approved, new, bestseller | +| `priceRange` | select | budget, mid, premium, luxury | +| `isActive` | boolean | Sichtbarkeit | + +### Series API (YouTube-Serien) + +```bash +# Alle Serien eines Tenants +curl "https://pl.porwoll.tech/api/series?where[tenant][equals]=1" + +# Nur aktive Serien +curl "https://pl.porwoll.tech/api/series?where[tenant][equals]=1&where[isActive][equals]=true" + +# Einzelne Serie nach Slug +curl "https://pl.porwoll.tech/api/series?where[tenant][equals]=1&where[slug][equals]=grfi" +``` + +**Felder:** + +| Feld | Typ | Beschreibung | +|------|-----|--------------| +| `title` | string | Serienname (lokalisiert) | +| `slug` | string | URL-Pfad | +| `description` | richtext | Beschreibung (lokalisiert) | +| `logo` | relation | Serien-Logo | +| `coverImage` | relation | Cover-Bild | +| `brandColor` | string | Hex-Farbcode | +| `youtubePlaylistId` | string | YouTube Playlist ID | +| `isActive` | boolean | Sichtbarkeit | --- ## Weitere Ressourcen - **Admin Panel:** https://pl.porwoll.tech/admin +- **API-Dokumentation (Swagger):** https://pl.porwoll.tech/api/docs +- **OpenAPI JSON:** https://pl.porwoll.tech/api/openapi.json - **Payload CMS Docs:** https://payloadcms.com/docs - **GraphQL Playground:** https://pl.porwoll.tech/api/graphql (wenn aktiviert) + +--- + +*Letzte Aktualisierung: 08.01.2026* diff --git a/docs/anleitungen/FRONTEND.md b/docs/anleitungen/FRONTEND.md index 367b3ea..0dc1750 100644 --- a/docs/anleitungen/FRONTEND.md +++ b/docs/anleitungen/FRONTEND.md @@ -146,15 +146,24 @@ NEXT_PUBLIC_TENANT_SLUG=c2s | Videos | `GET /api/videos` | Video-Bibliothek | | Timelines | `GET /api/timelines` | Chronologische Events | | Workflows | `GET /api/workflows` | Prozess-Darstellungen | +| Favorites | `GET /api/favorites` | Affiliate-Produkte (BlogWoman) | +| Series | `GET /api/series` | YouTube-Serien (BlogWoman) | -### Globals (SEO & Settings aus Production) +### Site Settings & Navigation (Tenant-isolierte Collections) + +> **Hinweis:** SiteSettings und Navigations wurden zu tenant-spezifischen Collections umgewandelt. + +| Collection | Endpoint | Beschreibung | +|------------|----------|--------------| +| Site Settings | `GET /api/site-settings?where[tenant][equals]=4` | Logo, Name, Kontakt, Adresse | +| Navigation | `GET /api/navigations?where[tenant][equals]=4` | Menü-Struktur | +| Privacy Policy | `GET /api/privacy-policy-settings?where[tenant][equals]=4` | Datenschutz | + +### Globals (Systemweit) | Global | Endpoint | Beschreibung | |--------|----------|--------------| -| Site Settings | `GET /api/globals/site-settings` | Logo, Name, Kontakt | -| Navigation | `GET /api/globals/navigation` | Menü-Struktur | | SEO Settings | `GET /api/globals/seo-settings` | Default SEO (Production) | -| Privacy Policy | `GET /api/globals/privacy-policy-settings` | Datenschutz | ### Spezielle Endpoints @@ -463,4 +472,4 @@ journalctl -u frontend-porwoll -f --- -*Letzte Aktualisierung: 18.12.2025* +*Letzte Aktualisierung: 08.01.2026* diff --git a/docs/anleitungen/UNIVERSAL_FEATURES.md b/docs/anleitungen/UNIVERSAL_FEATURES.md index 90e8b18..cf0ed04 100644 --- a/docs/anleitungen/UNIVERSAL_FEATURES.md +++ b/docs/anleitungen/UNIVERSAL_FEATURES.md @@ -1,6 +1,6 @@ # Universal Features - Dokumentation -*Letzte Aktualisierung: 18. Dezember 2025* +*Letzte Aktualisierung: 08. Januar 2026* ## Übersicht @@ -280,12 +280,83 @@ fetch('https://cms.c2sgmbh.de/api/workflows?tenant=4&type=project&locale=de') --- +### 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 | @@ -297,6 +368,16 @@ Alle Blocks können in der Pages Collection verwendet werden. | 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` @@ -416,6 +497,110 @@ Leistungen aus der Services Collection. --- +### 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: @@ -433,6 +618,8 @@ multiTenantPlugin({ services: {}, timelines: {}, workflows: {}, + favorites: {}, // BlogWoman + series: {}, // BlogWoman // ... weitere Collections }, }) @@ -469,7 +656,9 @@ src/ │ ├── Services.ts │ ├── ServiceCategories.ts │ ├── Timelines.ts -│ └── Workflows.ts +│ ├── Workflows.ts +│ ├── Favorites.ts # BlogWoman +│ └── Series.ts # BlogWoman ├── blocks/ │ ├── PostsListBlock.ts │ ├── TestimonialsBlock.ts @@ -479,6 +668,11 @@ src/ │ ├── 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 @@ -521,6 +715,20 @@ src/ ## 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 @@ -547,4 +755,4 @@ src/ --- -*Letzte Aktualisierung: 18. Dezember 2025* +*Letzte Aktualisierung: 08. Januar 2026*