mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-17 20:54:11 +00:00
docs: add YouTube Operations Hub extensions design
Design for 4 extensions: YouTube API Integration (metrics sync, video upload, comment import), Analytics Dashboard (comparison, trends, ROI), Workflow Automation (auto-status, deadline reminders, capacity planning), Content Calendar (FullCalendar, drag & drop, conflict detection). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
8907653744
commit
2e32a958bc
1 changed files with 481 additions and 0 deletions
|
|
@ -0,0 +1,481 @@
|
||||||
|
# YouTube Operations Hub - Erweiterungen Design
|
||||||
|
|
||||||
|
**Datum:** 2026-02-14
|
||||||
|
**Status:** Genehmigt
|
||||||
|
**Geschätzter Aufwand:** ~80 Stunden (4 Phasen)
|
||||||
|
|
||||||
|
## Zusammenfassung
|
||||||
|
|
||||||
|
Implementierung der 4 Erweiterungsmöglichkeiten aus dem YouTube Operations Hub (Abschnitt 11):
|
||||||
|
|
||||||
|
1. **YouTube API Integration** - Metriken-Sync, Video-Upload, Kommentar-Import
|
||||||
|
2. **Analytics Dashboard** - Performance-Vergleich, Trend-Analyse, ROI
|
||||||
|
3. **Workflow-Automatisierung** - Status-Änderungen, Deadline-Erinnerungen, Kapazitätsplanung
|
||||||
|
4. **Content-Kalender** - Visuelle Übersicht, Drag & Drop, Konflikt-Erkennung
|
||||||
|
|
||||||
|
## Bestandsanalyse
|
||||||
|
|
||||||
|
### Vorhandene Infrastruktur
|
||||||
|
- **YouTubeClient** (`src/lib/integrations/youtube/YouTubeClient.ts`) - nur Comment-Methoden
|
||||||
|
- **OAuth 2.0** - funktioniert, Scopes: `youtube.readonly`, `youtube.force-ssl`, `youtube`
|
||||||
|
- **YouTubeContent Collection** - `performance.*` Felder existieren (nie befüllt)
|
||||||
|
- **YouTubeChannels Collection** - `currentMetrics.*` Felder (nur bei OAuth-Connect aktualisiert)
|
||||||
|
- **BullMQ** - Email/PDF-Worker laufen, Queue-Infrastruktur vorhanden
|
||||||
|
- **Recharts 3.6.0** - bereits installiert
|
||||||
|
- **YouTubeAnalyticsDashboard** - existiert mit 4 Tabs (Daten nur aus CMS)
|
||||||
|
- **CommentsSyncService** - importiert nur Top-Level-Kommentare
|
||||||
|
|
||||||
|
### Fehlende Komponenten
|
||||||
|
- `youtube.videos.list()` API-Aufrufe (Metriken)
|
||||||
|
- `youtube.videos.insert()` API-Aufrufe (Upload)
|
||||||
|
- `youtubeAnalytics` API v2 (detaillierte Analytics)
|
||||||
|
- OAuth-Scopes: `youtube.upload`, `yt-analytics.readonly`
|
||||||
|
- Reply-Thread-Import bei Kommentaren
|
||||||
|
- Deadline-Scheduler/Cron
|
||||||
|
- Kalender-Bibliothek (FullCalendar)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 1: YouTube API Integration (~30h)
|
||||||
|
|
||||||
|
### 1.1 Metriken-Sync Service
|
||||||
|
|
||||||
|
**Neue Datei:** `src/lib/integrations/youtube/VideoMetricsSyncService.ts`
|
||||||
|
|
||||||
|
```
|
||||||
|
YouTubeClient.getVideoStatistics(videoIds[])
|
||||||
|
→ youtube.videos.list({ part: 'statistics,snippet', id: videoIds })
|
||||||
|
→ Batch-Update: YouTubeContent.performance.* Felder
|
||||||
|
```
|
||||||
|
|
||||||
|
**Sync-Strategie:**
|
||||||
|
- Batch-Verarbeitung: Max 50 Video-IDs pro API-Call (YouTube-Limit)
|
||||||
|
- Inkrementeller Sync: Nur Videos mit Status `published` oder `tracked`
|
||||||
|
- Frequenz: Alle 6 Stunden via Cron (`/api/cron/youtube-metrics-sync`)
|
||||||
|
- Quota-Budget: ~300 Einheiten/Tag (bei 150 Videos = 3 Calls x 100 Quota)
|
||||||
|
|
||||||
|
**Befüllte Felder in YouTubeContent:**
|
||||||
|
| Feld | API-Quelle | Typ |
|
||||||
|
|------|-----------|-----|
|
||||||
|
| `performance.views` | `statistics.viewCount` | number |
|
||||||
|
| `performance.likes` | `statistics.likeCount` | number |
|
||||||
|
| `performance.comments` | `statistics.commentCount` | number |
|
||||||
|
| `performance.estimatedMinutesWatched` | Analytics API | number |
|
||||||
|
| `performance.averageViewDuration` | Analytics API | number |
|
||||||
|
| `performance.ctr` | Analytics API | number |
|
||||||
|
| `performance.impressions` | Analytics API | number |
|
||||||
|
| `performance.subscribersGained` | Analytics API | number |
|
||||||
|
|
||||||
|
**Neue Datei:** `src/lib/integrations/youtube/ChannelMetricsSyncService.ts`
|
||||||
|
|
||||||
|
```
|
||||||
|
YouTubeClient.getChannelStatistics(channelId)
|
||||||
|
→ youtube.channels.list({ part: 'statistics', id: channelId })
|
||||||
|
→ Update: YouTubeChannels.currentMetrics.* Felder
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.2 Erweiterter Kommentar-Import
|
||||||
|
|
||||||
|
**Änderung:** `src/lib/integrations/youtube/CommentsSyncService.ts`
|
||||||
|
|
||||||
|
Erweiterungen:
|
||||||
|
- Reply-Threads importieren (youtube.comments.list für parentId)
|
||||||
|
- `parentComment` Relationship-Feld in CommunityInteractions nutzen
|
||||||
|
- Thread-Tiefe: Max 2 Ebenen (YouTube-Limit)
|
||||||
|
- Neue Kommentare seit letztem Sync (publishedAfter-Filter)
|
||||||
|
|
||||||
|
### 1.3 Video-Upload Service
|
||||||
|
|
||||||
|
**Neue Datei:** `src/lib/integrations/youtube/VideoUploadService.ts`
|
||||||
|
|
||||||
|
**Upload-Flow:**
|
||||||
|
```
|
||||||
|
Admin UI "Veröffentlichen" Button
|
||||||
|
→ API Route POST /api/youtube/upload
|
||||||
|
→ BullMQ Job in youtube-upload Queue
|
||||||
|
→ VideoUploadWorker:
|
||||||
|
1. Media-Datei aus Payload laden
|
||||||
|
2. youtube.videos.insert() mit Resumable Upload
|
||||||
|
3. YouTubeContent Status → 'published'
|
||||||
|
4. YouTube-Video-ID speichern
|
||||||
|
5. Notification erstellen
|
||||||
|
```
|
||||||
|
|
||||||
|
**Neue Dateien:**
|
||||||
|
- `src/lib/queue/jobs/youtube-upload-job.ts`
|
||||||
|
- `src/lib/queue/workers/youtube-upload-worker.ts`
|
||||||
|
- `src/app/(payload)/api/youtube/upload/route.ts`
|
||||||
|
|
||||||
|
**OAuth-Scope hinzufügen:**
|
||||||
|
- `src/lib/integrations/youtube/oauth.ts`: Scope `https://www.googleapis.com/auth/youtube.upload`
|
||||||
|
|
||||||
|
**Upload-Metadaten (aus YouTubeContent-Feldern):**
|
||||||
|
- `youtube.metadata.title` → Video-Titel
|
||||||
|
- `youtube.metadata.description` → Beschreibung
|
||||||
|
- `youtube.metadata.tags` → Tags
|
||||||
|
- `youtube.metadata.categoryId` → Kategorie
|
||||||
|
- `youtube.metadata.visibility` → public/unlisted/private
|
||||||
|
- `youtube.metadata.language` → Sprache
|
||||||
|
- `scheduledPublishDate` → Geplante Veröffentlichung
|
||||||
|
|
||||||
|
**Quota-Tracking:**
|
||||||
|
- Neue Collection oder Felder in YouTubeChannels: `quotaUsedToday`, `quotaResetAt`
|
||||||
|
- Video-Upload: ~1.600 Quota-Einheiten pro Upload
|
||||||
|
- Tägliches Limit: 10.000 Einheiten (Standard)
|
||||||
|
- Warnung bei >80% Auslastung via NotificationService
|
||||||
|
|
||||||
|
### 1.4 Cron-Jobs
|
||||||
|
|
||||||
|
| Endpoint | Schedule | Beschreibung |
|
||||||
|
|----------|----------|--------------|
|
||||||
|
| `/api/cron/youtube-metrics-sync` | `0 */6 * * *` | Video-Metriken alle 6h |
|
||||||
|
| `/api/cron/youtube-channel-sync` | `0 4 * * *` | Kanal-Statistiken täglich |
|
||||||
|
|
||||||
|
**Änderung:** `vercel.json` - Neue Cron-Einträge
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 2: Analytics Dashboard (~16h)
|
||||||
|
|
||||||
|
### 2.1 YouTube Analytics API Client
|
||||||
|
|
||||||
|
**Neue Datei:** `src/lib/integrations/youtube/YouTubeAnalyticsClient.ts`
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Methoden:
|
||||||
|
getVideoAnalytics(videoId, startDate, endDate, metrics[])
|
||||||
|
getChannelAnalytics(channelId, startDate, endDate, metrics[])
|
||||||
|
getTopVideos(channelId, metric, limit)
|
||||||
|
getDemographics(channelId, startDate, endDate)
|
||||||
|
```
|
||||||
|
|
||||||
|
**OAuth-Scope hinzufügen:**
|
||||||
|
- `yt-analytics.readonly` in `src/lib/integrations/youtube/oauth.ts`
|
||||||
|
|
||||||
|
### 2.2 Performance-Vergleich Tab
|
||||||
|
|
||||||
|
**Erweiterung:** `src/components/admin/YouTubeAnalyticsDashboard.tsx`
|
||||||
|
|
||||||
|
Neuer Tab "Vergleich" mit:
|
||||||
|
- Multi-Select für Videos (max 5)
|
||||||
|
- Metriken-Auswahl: Views, Likes, CTR, Watch Time
|
||||||
|
- Zeitreihen-Chart (Recharts LineChart mit mehreren Serien)
|
||||||
|
- Normalisierte Ansicht (prozentual) für unterschiedliche Größenordnungen
|
||||||
|
- Tabelle mit Delta-Werten
|
||||||
|
|
||||||
|
### 2.3 Trend-Analyse Tab
|
||||||
|
|
||||||
|
Neuer Tab "Trends" mit:
|
||||||
|
- Automatische Trend-Erkennung (gleitender Durchschnitt, 7/30 Tage)
|
||||||
|
- Wachstumsrate pro Metrik (WoW, MoM)
|
||||||
|
- Prognose-Linie (lineare Regression, nächste 30 Tage)
|
||||||
|
- Saisonalitäts-Erkennung (Wochentag-Heatmap)
|
||||||
|
- Best/Worst Performer Ranking
|
||||||
|
|
||||||
|
**Berechnung im Backend:** `src/app/(payload)/api/youtube/analytics/route.ts`
|
||||||
|
- Neuer Query-Parameter: `tab=trends`
|
||||||
|
- Berechnungen serverseitig für Performance
|
||||||
|
|
||||||
|
### 2.4 ROI-Berechnung Tab
|
||||||
|
|
||||||
|
Neuer Tab "ROI" mit:
|
||||||
|
- Neue Felder in YouTubeContent:
|
||||||
|
- `costs.estimatedProductionHours` (number)
|
||||||
|
- `costs.estimatedProductionCost` (number, EUR)
|
||||||
|
- `costs.estimatedRevenue` (number, EUR - manuell oder via Analytics API)
|
||||||
|
- ROI-Formel: `(Revenue - Cost) / Cost * 100`
|
||||||
|
- CPV (Cost per View): `Cost / Views`
|
||||||
|
- Revenue per View: `Revenue / Views`
|
||||||
|
- Break-Even-Analyse
|
||||||
|
- Chart: Kosten vs. Einnahmen über Zeit
|
||||||
|
|
||||||
|
**Keine separate Collection** - pragmatischer Ansatz mit Feldern direkt in YouTubeContent.
|
||||||
|
|
||||||
|
### 2.5 API-Erweiterungen
|
||||||
|
|
||||||
|
**Änderung:** `src/app/(payload)/api/youtube/analytics/route.ts`
|
||||||
|
|
||||||
|
Neue Query-Parameter:
|
||||||
|
- `tab=comparison&videoIds=id1,id2,id3`
|
||||||
|
- `tab=trends&metric=views&period=30d`
|
||||||
|
- `tab=roi&channelId=X`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 3: Workflow-Automatisierung (~14h)
|
||||||
|
|
||||||
|
### 3.1 Automatische Status-Übergänge
|
||||||
|
|
||||||
|
**Neue Datei:** `src/hooks/youtubeContent/autoStatusTransitions.ts`
|
||||||
|
|
||||||
|
Regeln (konfigurierbar):
|
||||||
|
| Bedingung | Aktion |
|
||||||
|
|-----------|--------|
|
||||||
|
| Alle Checklisten-Items erledigt | Status → nächste Phase |
|
||||||
|
| Video auf YouTube veröffentlicht | Status → `published` |
|
||||||
|
| 7 Tage nach Veröffentlichung | Status → `tracked` |
|
||||||
|
| Upload-Job abgeschlossen | Status → `published` |
|
||||||
|
|
||||||
|
**Hook-Typ:** `afterChange` auf YouTubeContent
|
||||||
|
- Prüft Checklisten-Completion via YtTasks
|
||||||
|
- Erstellt Notification bei automatischem Übergang
|
||||||
|
- Audit-Log-Eintrag
|
||||||
|
|
||||||
|
### 3.2 Deadline-Erinnerungen
|
||||||
|
|
||||||
|
**Neue Datei:** `src/app/(payload)/api/cron/deadline-reminders/route.ts`
|
||||||
|
|
||||||
|
**Schedule:** `0 9 * * 1-5` (Mo-Fr 9:00 UTC)
|
||||||
|
|
||||||
|
**Prüfungen:**
|
||||||
|
1. `editDeadline` in 2 Tagen → Erinnerung
|
||||||
|
2. `editDeadline` überschritten → Warnung (Priorität: high)
|
||||||
|
3. `reviewDeadline` in 1 Tag → Erinnerung
|
||||||
|
4. `scheduledPublishDate` in 3 Tagen → Erinnerung
|
||||||
|
5. Batch-Deadline (`YtBatches.targetCompletionDate`) in 3 Tagen → Erinnerung
|
||||||
|
|
||||||
|
**Notification-Typen:** Nutzt bestehendes `NotificationService` + `YtNotifications`:
|
||||||
|
- `task_due` - Deadline naht
|
||||||
|
- `task_overdue` - Deadline überschritten
|
||||||
|
- Neuer Typ: `deadline_warning` (3 Tage vorher)
|
||||||
|
|
||||||
|
**Zustellung:**
|
||||||
|
- YtNotifications Collection (Admin-Inbox)
|
||||||
|
- Optional: E-Mail via AlertService (konfigurierbar pro User)
|
||||||
|
|
||||||
|
### 3.3 Team-Kapazitätsplanung
|
||||||
|
|
||||||
|
**Neue Datei:** `src/app/(payload)/api/youtube/capacity/route.ts`
|
||||||
|
|
||||||
|
**Datenquellen:**
|
||||||
|
- YtTasks (zugewiesene Aufgaben pro User)
|
||||||
|
- YouTubeContent (Videos in Produktion pro Assignee)
|
||||||
|
- YtBatches (geplante Batches)
|
||||||
|
|
||||||
|
**Berechnung:**
|
||||||
|
```
|
||||||
|
Pro Team-Mitglied:
|
||||||
|
- Aktive Tasks (status: in_progress, pending)
|
||||||
|
- Geschätzte Stunden (aus Tasks estimatedHours)
|
||||||
|
- Videos in Pipeline (zugewiesen, nicht abgeschlossen)
|
||||||
|
- Auslastung = aktive Stunden / verfügbare Stunden (40h/Woche default)
|
||||||
|
```
|
||||||
|
|
||||||
|
**UI-Komponente:** Integration in YouTubeAnalyticsDashboard
|
||||||
|
- Neuer Tab "Team" oder Widget im bestehenden "Pipeline" Tab
|
||||||
|
- Balkendiagramm: Auslastung pro Person
|
||||||
|
- Farbcodierung: Grün (<70%), Gelb (70-90%), Rot (>90%)
|
||||||
|
- Warnung bei Überbelastung via NotificationService
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 4: Content-Kalender (~20h)
|
||||||
|
|
||||||
|
### 4.1 Bibliothek & Setup
|
||||||
|
|
||||||
|
**Neue Dependency:** `@fullcalendar/react` + Plugins
|
||||||
|
- `@fullcalendar/core`
|
||||||
|
- `@fullcalendar/daygrid`
|
||||||
|
- `@fullcalendar/timegrid`
|
||||||
|
- `@fullcalendar/interaction` (Drag & Drop)
|
||||||
|
- `@fullcalendar/list`
|
||||||
|
|
||||||
|
### 4.2 Kalender API
|
||||||
|
|
||||||
|
**Neue Datei:** `src/app/(payload)/api/youtube/calendar/route.ts`
|
||||||
|
|
||||||
|
**GET** - Events abrufen:
|
||||||
|
```
|
||||||
|
?channelId=X&start=2026-01-01&end=2026-02-28
|
||||||
|
```
|
||||||
|
|
||||||
|
**Response-Format:**
|
||||||
|
```typescript
|
||||||
|
{
|
||||||
|
events: [{
|
||||||
|
id: string, // YouTubeContent ID
|
||||||
|
title: string, // Video-Titel
|
||||||
|
start: string, // scheduledPublishDate (ISO)
|
||||||
|
end: string, // scheduledPublishDate + 1h
|
||||||
|
color: string, // Channel branding.primaryColor
|
||||||
|
extendedProps: {
|
||||||
|
status: string,
|
||||||
|
contentType: 'video' | 'short',
|
||||||
|
channelName: string,
|
||||||
|
seriesName?: string,
|
||||||
|
hasConflict: boolean,
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**PATCH** - Datum per Drag & Drop ändern:
|
||||||
|
```
|
||||||
|
{ contentId: string, newDate: string }
|
||||||
|
```
|
||||||
|
- Validierung: Nur Videos mit Status vor `published`
|
||||||
|
- Konflik-Prüfung vor Speicherung
|
||||||
|
- Audit-Log-Eintrag
|
||||||
|
|
||||||
|
### 4.3 Content-Kalender Komponente
|
||||||
|
|
||||||
|
**Neue Datei:** `src/components/admin/ContentCalendar.tsx`
|
||||||
|
|
||||||
|
Features:
|
||||||
|
- Monats-, Wochen-, Tages-, Listen-Ansicht
|
||||||
|
- Farbcodierung nach Kanal (`branding.primaryColor`)
|
||||||
|
- Status-Icons auf Events (Draft, Review, Ready, Published)
|
||||||
|
- Tooltip mit Video-Details bei Hover
|
||||||
|
- Click → Navigation zum YouTubeContent-Dokument
|
||||||
|
|
||||||
|
**Neue Datei:** `src/components/admin/ContentCalendar.module.scss`
|
||||||
|
- BEM-Konventionen
|
||||||
|
- Payload CSS-Variablen für Dark/Light Mode
|
||||||
|
- Responsive Layout
|
||||||
|
|
||||||
|
### 4.4 Drag & Drop
|
||||||
|
|
||||||
|
FullCalendar's eingebautes `interaction` Plugin:
|
||||||
|
- Event-Verschiebung → PATCH API-Call
|
||||||
|
- Bestätigungsdialog vor Speicherung
|
||||||
|
- Undo-Möglichkeit (vorheriges Datum merken)
|
||||||
|
- Nur für Videos vor Status `published`
|
||||||
|
|
||||||
|
### 4.5 Konflikt-Erkennung
|
||||||
|
|
||||||
|
**Neue Datei:** `src/lib/youtube/ConflictDetectionService.ts`
|
||||||
|
|
||||||
|
**Regeln:**
|
||||||
|
1. **Zeitkonflikt:** Zwei Videos am selben Tag auf demselben Kanal
|
||||||
|
2. **Serien-Konflikt:** Serien-Folge vor vorheriger Folge geplant
|
||||||
|
3. **Frequenz-Konflikt:** Mehr Videos als `publishingSchedule.longformPerWeek` / `shortsPerWeek`
|
||||||
|
4. **Wochenend-Warnung:** Video am Wochenende geplant (konfigurierbar)
|
||||||
|
|
||||||
|
**Anzeige:**
|
||||||
|
- Rote Markierung auf Kalender-Events mit Konflikten
|
||||||
|
- Warnung-Banner im Kalender
|
||||||
|
- Konflikte als Tooltip auf betroffenen Events
|
||||||
|
- API-Response enthält `hasConflict: boolean` pro Event
|
||||||
|
|
||||||
|
### 4.6 Admin View Registrierung
|
||||||
|
|
||||||
|
**Änderung:** `src/payload.config.ts`
|
||||||
|
|
||||||
|
Neuer Custom View: `/admin/content-calendar`
|
||||||
|
- Registrierung analog zu `YouTubeAnalyticsDashboard`
|
||||||
|
- Navigation-Link via `afterNavLinks`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Technische Querschnittsthemen
|
||||||
|
|
||||||
|
### OAuth-Scope-Erweiterungen
|
||||||
|
|
||||||
|
**Datei:** `src/lib/integrations/youtube/oauth.ts`
|
||||||
|
|
||||||
|
Neue Scopes:
|
||||||
|
```typescript
|
||||||
|
const SCOPES = [
|
||||||
|
'https://www.googleapis.com/auth/youtube.readonly',
|
||||||
|
'https://www.googleapis.com/auth/youtube.force-ssl',
|
||||||
|
'https://www.googleapis.com/auth/youtube',
|
||||||
|
'https://www.googleapis.com/auth/youtube.upload', // NEU
|
||||||
|
'https://www.googleapis.com/auth/yt-analytics.readonly', // NEU
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
**Hinweis:** Bestehende OAuth-Tokens müssen nach Scope-Änderung neu autorisiert werden. Re-Auth-Flow in Admin UI einbauen.
|
||||||
|
|
||||||
|
### Quota-Management
|
||||||
|
|
||||||
|
YouTube Data API v3 Quota: 10.000 Einheiten/Tag (Standard)
|
||||||
|
|
||||||
|
| Operation | Kosten | Häufigkeit | Tägliche Kosten |
|
||||||
|
|-----------|--------|------------|-----------------|
|
||||||
|
| videos.list (50 IDs) | 100 | 4x/Tag | 400 |
|
||||||
|
| channels.list | 100 | 1x/Tag | 100 |
|
||||||
|
| commentThreads.list | 100 | 4x/Tag | 400 |
|
||||||
|
| comments.list (Replies) | 100 | 4x/Tag | 400 |
|
||||||
|
| videos.insert (Upload) | 1.600 | ~2/Tag | 3.200 |
|
||||||
|
| **Gesamt** | | | **~4.500** |
|
||||||
|
|
||||||
|
Budget: ~45% des Tageslimits. Spielraum für manuelle API-Calls.
|
||||||
|
|
||||||
|
### Migration
|
||||||
|
|
||||||
|
Neue Felder in YouTubeContent (Phase 2 ROI):
|
||||||
|
```sql
|
||||||
|
ALTER TABLE youtube_content
|
||||||
|
ADD COLUMN IF NOT EXISTS "costs_estimated_production_hours" numeric,
|
||||||
|
ADD COLUMN IF NOT EXISTS "costs_estimated_production_cost" numeric,
|
||||||
|
ADD COLUMN IF NOT EXISTS "costs_estimated_revenue" numeric;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
|
||||||
|
Alle neuen Services folgen bestehendem Pattern:
|
||||||
|
- Try/Catch mit strukturiertem Logging (SafeLogger)
|
||||||
|
- YouTube API-Fehler: Retry mit exponential Backoff (max 3)
|
||||||
|
- Quota-Exceeded (403): Job delayed auf nächsten Tag
|
||||||
|
- Token-Expired (401): Auto-Refresh via TokenRefreshService
|
||||||
|
- Upload-Fehler: Resumable Upload mit Checkpoint
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Abhängigkeiten zwischen Phasen
|
||||||
|
|
||||||
|
```
|
||||||
|
Phase 1 (API) ──────────► Phase 2 (Analytics)
|
||||||
|
│ │
|
||||||
|
│ Metriken-Daten │ Dashboard-Patterns
|
||||||
|
│ verfügbar │
|
||||||
|
▼ ▼
|
||||||
|
Phase 3 (Workflow) ──────► Phase 4 (Kalender)
|
||||||
|
│ │
|
||||||
|
│ Status-Logik │ Scheduling-Daten
|
||||||
|
│ Deadline-System │ Konflikt-Erkennung
|
||||||
|
└──────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Phase 1 muss zuerst abgeschlossen werden (Datengrundlage für Analytics).
|
||||||
|
Phasen 3 und 4 können teilweise parallel entwickelt werden.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Neue Dateien (Übersicht)
|
||||||
|
|
||||||
|
### Phase 1
|
||||||
|
- `src/lib/integrations/youtube/VideoMetricsSyncService.ts`
|
||||||
|
- `src/lib/integrations/youtube/ChannelMetricsSyncService.ts`
|
||||||
|
- `src/lib/integrations/youtube/VideoUploadService.ts`
|
||||||
|
- `src/lib/queue/jobs/youtube-upload-job.ts`
|
||||||
|
- `src/lib/queue/workers/youtube-upload-worker.ts`
|
||||||
|
- `src/app/(payload)/api/youtube/upload/route.ts`
|
||||||
|
- `src/app/(payload)/api/cron/youtube-metrics-sync/route.ts`
|
||||||
|
- `src/app/(payload)/api/cron/youtube-channel-sync/route.ts`
|
||||||
|
|
||||||
|
### Phase 2
|
||||||
|
- `src/lib/integrations/youtube/YouTubeAnalyticsClient.ts`
|
||||||
|
|
||||||
|
### Phase 3
|
||||||
|
- `src/hooks/youtubeContent/autoStatusTransitions.ts`
|
||||||
|
- `src/app/(payload)/api/cron/deadline-reminders/route.ts`
|
||||||
|
- `src/app/(payload)/api/youtube/capacity/route.ts`
|
||||||
|
|
||||||
|
### Phase 4
|
||||||
|
- `src/components/admin/ContentCalendar.tsx`
|
||||||
|
- `src/components/admin/ContentCalendar.module.scss`
|
||||||
|
- `src/lib/youtube/ConflictDetectionService.ts`
|
||||||
|
- `src/app/(payload)/api/youtube/calendar/route.ts`
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- `src/lib/integrations/youtube/YouTubeClient.ts` (neue Methoden)
|
||||||
|
- `src/lib/integrations/youtube/oauth.ts` (neue Scopes)
|
||||||
|
- `src/lib/integrations/youtube/CommentsSyncService.ts` (Reply-Threads)
|
||||||
|
- `src/collections/YouTubeContent.ts` (ROI-Felder)
|
||||||
|
- `src/app/(payload)/api/youtube/analytics/route.ts` (neue Tabs)
|
||||||
|
- `src/components/admin/YouTubeAnalyticsDashboard.tsx` (neue Tabs)
|
||||||
|
- `src/lib/queue/queue-service.ts` (youtube-upload Queue)
|
||||||
|
- `src/payload.config.ts` (Content Calendar View)
|
||||||
|
- `vercel.json` (neue Cron-Jobs)
|
||||||
|
- `package.json` (FullCalendar Dependencies)
|
||||||
Loading…
Reference in a new issue