# Community Management Phase 1 - Implementation Report

**Datum:** 15. Januar 2026
**Version:** 1.0
**Status:** ✅ Abgeschlossen

---

## Executive Summary

Community Management Phase 1 ist ein umfassendes System zur Verwaltung von YouTube-Kommentaren und Social-Media-Interaktionen innerhalb des Payload CMS Admin-Panels. Das System ermöglicht effizientes Community-Management durch automatisierte Regeln, Sentiment-Analyse und eine zentrale Inbox-Ansicht.

---

## 1. Systemarchitektur

### 1.1 Komponenten-Übersicht

```
┌─────────────────────────────────────────────────────────────────────┐
│                        PAYLOAD CMS ADMIN                            │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐     │
│  │  Community      │  │  Community      │  │  Community      │     │
│  │  Inbox View     │  │  Rules          │  │  Templates      │     │
│  │  (Custom View)  │  │  (Collection)   │  │  (Collection)   │     │
│  └────────┬────────┘  └────────┬────────┘  └────────┬────────┘     │
│           │                    │                    │               │
│           └────────────────────┼────────────────────┘               │
│                                │                                    │
│                    ┌───────────▼───────────┐                        │
│                    │    Rules Engine       │                        │
│                    │    (Auto-Processing)  │                        │
│                    └───────────┬───────────┘                        │
│                                │                                    │
└────────────────────────────────┼────────────────────────────────────┘
                                 │
┌────────────────────────────────┼────────────────────────────────────┐
│                    DATENBANK (PostgreSQL)                           │
├────────────────────────────────┼────────────────────────────────────┤
│                                │                                    │
│  ┌─────────────────┐  ┌────────▼────────┐  ┌─────────────────┐     │
│  │ social_platforms│  │ community_      │  │ community_      │     │
│  │                 │  │ interactions    │  │ templates       │     │
│  └─────────────────┘  └─────────────────┘  └─────────────────┘     │
│                                                                     │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐     │
│  │ social_accounts │  │ community_rules │  │ youtube_channels│     │
│  └─────────────────┘  └─────────────────┘  └─────────────────┘     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
                                 │
                                 ▼
┌─────────────────────────────────────────────────────────────────────┐
│                      EXTERNE SERVICES                               │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐     │
│  │  YouTube API    │  │  OpenAI API     │  │  Export Service │     │
│  │  (Comments)     │  │  (Sentiment)    │  │  (PDF/Excel)    │     │
│  └─────────────────┘  └─────────────────┘  └─────────────────┘     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
```

### 1.2 Datenfluss

```
YouTube Kommentar
        │
        ▼
┌───────────────────┐
│  Cron Job         │  ← Alle 15 Minuten
│  (syncAllComments)│
└────────┬──────────┘
         │
         ▼
┌───────────────────┐
│  YouTube API      │
│  (Comments.list)  │
└────────┬──────────┘
         │
         ▼
┌───────────────────┐
│  Datenbank        │
│  (Interaction)    │
└────────┬──────────┘
         │
         ▼
┌───────────────────┐
│  Rules Engine     │  ← Automatische Verarbeitung
│  (processNew)     │
└────────┬──────────┘
         │
         ├─► Priorität setzen
         ├─► Zuweisen an User
         ├─► Flags setzen (Medical, Spam, etc.)
         ├─► Template vorschlagen
         └─► Notification senden
         │
         ▼
┌───────────────────┐
│  Community Inbox  │  ← Admin-Ansicht
│  (React View)     │
└───────────────────┘
```

---

## 2. Collections (Datenmodelle)

### 2.1 Community Interactions

**Slug:** `community-interactions`
**Beschreibung:** Zentrale Sammlung aller Social-Media-Interaktionen

| Feldgruppe | Felder | Beschreibung |
|------------|--------|--------------|
| **Quelle** | platform, socialAccount, linkedContent | Woher kommt die Interaction |
| **Typ & ID** | type, externalId, parentInteraction | Art und Identifikation |
| **Autor** | authorName, authorHandle, authorAvatarUrl, authorIsVerified, authorIsSubscriber, authorSubscriberCount | Informationen zum Kommentator |
| **Inhalt** | message, messageHtml, publishedAt, attachments | Der eigentliche Kommentar |
| **Analyse** | sentiment, sentimentScore, confidence, language, topics, suggestedTemplate, suggestedReply | AI-Analyse |
| **Flags** | isMedicalQuestion, requiresEscalation, isSpam, isFromInfluencer | Automatische Markierungen |
| **Workflow** | status, priority, assignedTo, responseDeadline | Bearbeitungsstatus |
| **Antwort** | responseText, usedTemplate, sentAt, sentBy, externalReplyId | Gesendete Antwort |
| **Engagement** | likes, replies, isHearted, isPinned | YouTube-Metriken |

**Status-Workflow:**
```
new → in_review → waiting → answered → closed
                     ↓
                  escalated
```

**Prioritäten:**
- `urgent` - Sofort bearbeiten (rot)
- `high` - Heute bearbeiten (orange)
- `normal` - Standard (grau)
- `low` - Wenn Zeit ist (grün)

### 2.2 Community Rules

**Slug:** `community-rules`
**Beschreibung:** Automatisierungsregeln für Interactions

| Feld | Typ | Beschreibung |
|------|-----|--------------|
| name | Text | Name der Regel |
| priority | Number | Ausführungsreihenfolge (niedrig = zuerst) |
| isActive | Checkbox | Regel aktiv? |
| channel | Relationship | Optional: Nur für diesen Kanal |
| platforms | Relationship[] | Optional: Nur für diese Plattformen |

**Trigger-Typen:**

| Trigger | Beschreibung | Zusätzliche Felder |
|---------|--------------|-------------------|
| `keyword` | Keyword-Match | keywords[] mit matchType (contains/exact/regex) |
| `sentiment` | Sentiment-Wert | sentimentValues[] (positive/negative/neutral/question) |
| `question_detected` | Frage erkannt | - |
| `medical_detected` | Medizinischer Inhalt | - |
| `influencer` | Influencer-Kommentar | influencerMinFollowers (default: 10000) |
| `all_new` | Alle neuen Kommentare | - |
| `contains_link` | Enthält URL | - |
| `contains_email` | Enthält E-Mail | - |

**Aktionen:**

| Aktion | Wert-Parameter | Beschreibung |
|--------|---------------|--------------|
| `set_priority` | urgent/high/normal/low | Priorität setzen |
| `assign_to` | targetUser | Zuweisen an Benutzer |
| `set_flag` | medical/spam/escalate | Flag setzen |
| `suggest_template` | targetTemplate | Antwort-Vorlage vorschlagen |
| `send_notification` | targetUser | Benachrichtigung senden |
| `flag_medical` | - | Als medizinische Frage markieren |
| `escalate` | - | Eskalieren |
| `mark_spam` | - | Als Spam markieren |
| `set_deadline` | Stunden | Deadline setzen |

### 2.3 Community Templates

**Slug:** `community-templates`
**Beschreibung:** Wiederverwendbare Antwort-Vorlagen

| Feld | Typ | Beschreibung |
|------|-----|--------------|
| name | Text (lokalisiert) | Template-Name |
| category | Select | Kategorie (greeting, faq, support, etc.) |
| template | Textarea (lokalisiert) | Template-Text mit Variablen |
| variables | Array | Definierte Variablen |
| channel | Relationship | Optional: Kanal-spezifisch |
| platforms | Relationship[] | Plattform-Filter |
| autoSuggest.keywords | Array | Keywords für Auto-Suggest |
| requiresReview | Checkbox | Vor dem Senden prüfen? |

**Variablen-Syntax:** `{{variableName}}`

**Beispiel-Template:**
```
Hallo {{authorName}}! 👋

Vielen Dank für deine Frage zu {{topic}}.

{{customResponse}}

Liebe Grüße,
{{channelName}} Team
```

### 2.4 Social Platforms

**Slug:** `social-platforms`
**Beschreibung:** Konfiguration der Social-Media-Plattformen

| Feld | Typ | Beschreibung |
|------|-----|--------------|
| name | Text | Plattform-Name |
| slug | Text | Eindeutiger Slug |
| icon | Text | Emoji oder Icon |
| color | Text | Hex-Farbcode |
| apiConfig | Group | API-Konfiguration |
| rateLimits | Group | API Rate Limits |
| interactionTypes | Array | Unterstützte Interaction-Typen |

**Vorkonfigurierte Plattform:**
- YouTube (slug: `youtube`, icon: 📺, color: #FF0000)

### 2.5 Social Accounts

**Slug:** `social-accounts`
**Beschreibung:** Verbundene Social-Media-Accounts

| Feld | Typ | Beschreibung |
|------|-----|--------------|
| platform | Relationship | Zugehörige Plattform |
| linkedChannel | Relationship | Verknüpfter YouTube-Kanal |
| displayName | Text | Anzeigename |
| accountHandle | Text | @handle |
| externalId | Text | Externe ID |
| credentials | Group | OAuth-Tokens (verschlüsselt) |
| syncSettings | Group | Sync-Konfiguration |

---

## 3. Admin Views

### 3.1 Community Inbox

**Route:** `/admin/views/community/inbox`
**Komponente:** `CommunityInbox.tsx`

#### Layout (Desktop)

```
┌─────────────────────────────────────────────────────────────────────────┐
│  Community Inbox                                        [Sync] [Export] │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │  Stats: 📊 127 Total │ 🆕 23 Neu │ 🔴 5 Urgent │ 🏥 3 Medical   │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │  Filters: [Status ▼] [Priority ▼] [Platform ▼] [🔍 Search...]   │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  ┌──────────────────────────┬──────────────────────────────────────┐   │
│  │                          │                                      │   │
│  │  📋 Interaction List     │  📄 Detail View                      │   │
│  │                          │                                      │   │
│  │  ┌────────────────────┐  │  ┌────────────────────────────────┐  │   │
│  │  │ 🔴 @user1          │  │  │  👤 @selectedUser              │  │   │
│  │  │ "Tolles Video!"    │◄─┼──│  ─────────────────────────────  │  │   │
│  │  │ 2h ago • YouTube   │  │  │  "Der vollständige Kommentar   │  │   │
│  │  └────────────────────┘  │  │   wird hier angezeigt..."      │  │   │
│  │                          │  │                                  │  │   │
│  │  ┌────────────────────┐  │  │  ─────────────────────────────  │  │   │
│  │  │ 🟡 @user2          │  │  │                                  │  │   │
│  │  │ "Frage zu..."      │  │  │  📊 Analyse                      │  │   │
│  │  │ 5h ago • YouTube   │  │  │  Sentiment: 😊 Positiv (0.85)   │  │   │
│  │  └────────────────────┘  │  │  Topics: #frage #produkt        │  │   │
│  │                          │  │                                  │  │   │
│  │  ┌────────────────────┐  │  │  ─────────────────────────────  │  │   │
│  │  │ 🟢 @user3          │  │  │                                  │  │   │
│  │  │ "Danke für..."     │  │  │  💬 Antwort                      │  │   │
│  │  │ 1d ago • YouTube   │  │  │  ┌────────────────────────────┐ │  │   │
│  │  └────────────────────┘  │  │  │ Template: [Auswählen ▼]    │ │  │   │
│  │                          │  │  │                            │ │  │   │
│  │  [Load More...]          │  │  │ [Antwort-Text hier...]     │ │  │   │
│  │                          │  │  │                            │ │  │   │
│  │                          │  │  └────────────────────────────┘ │  │   │
│  │                          │  │                                  │  │   │
│  │                          │  │  [💾 Speichern] [📤 Senden]      │  │   │
│  │                          │  │                                  │  │   │
│  └──────────────────────────┴──────────────────────────────────────┘   │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
```

#### Layout (Mobile)

```
┌─────────────────────────┐
│  Community Inbox    [≡] │
├─────────────────────────┤
│                         │
│  [Liste] [Detail] [⚙️]  │
│                         │
│  ┌───────────────────┐  │
│  │ 🔴 @user1         │  │
│  │ "Tolles Video!"   │  │
│  │ 2h ago            │  │
│  └───────────────────┘  │
│                         │
│  ┌───────────────────┐  │
│  │ 🟡 @user2         │  │
│  │ "Frage zu..."     │  │
│  │ 5h ago            │  │
│  └───────────────────┘  │
│                         │
│  ┌───────────────────┐  │
│  │ 🟢 @user3         │  │
│  │ "Danke für..."    │  │
│  │ 1d ago            │  │
│  └───────────────────┘  │
│                         │
└─────────────────────────┘
```

#### Farbkodierung

| Element | Farbe | Bedeutung |
|---------|-------|-----------|
| Priorität Urgent | `#dc2626` (Rot) | Sofort bearbeiten |
| Priorität High | `#f59e0b` (Orange) | Heute bearbeiten |
| Priorität Normal | `#6b7280` (Grau) | Standard |
| Priorität Low | `#10b981` (Grün) | Niedrig |
| Status New | `#3b82f6` (Blau) | Neu eingegangen |
| Status Answered | `#10b981` (Grün) | Beantwortet |
| Medical Flag | `#dc2626` (Rot) + 🏥 | Medizinische Frage |
| Influencer Flag | `#8b5cf6` (Lila) + ⭐ | Influencer |

#### Interaktionen

1. **Klick auf Interaction:** Öffnet Detail-Ansicht
2. **Filter anwenden:** Liste wird gefiltert
3. **Template auswählen:** Text wird in Antwort-Feld eingefügt
4. **Senden:** Antwort wird via YouTube API gepostet
5. **Sync:** Manuelle Synchronisation aller Kommentare
6. **Export:** Modal mit Format-Auswahl (PDF/Excel/CSV)

---

## 4. API Endpoints

### 4.1 Community APIs

| Endpoint | Methode | Beschreibung |
|----------|---------|--------------|
| `/api/community/stats` | GET | Statistiken (total, new, urgent, medical) |
| `/api/community/export` | POST | Export als PDF/Excel/CSV |
| `/api/community/reply` | POST | Antwort senden (via YouTube API) |
| `/api/community/sync-comments` | POST | Manuelle Synchronisation |

### 4.2 YouTube OAuth APIs

| Endpoint | Methode | Beschreibung |
|----------|---------|--------------|
| `/api/youtube/auth` | GET | OAuth-Flow starten |
| `/api/youtube/callback` | GET | OAuth-Callback |
| `/api/youtube/refresh-token` | POST | Token erneuern |

### 4.3 Collection APIs (Standard Payload)

| Endpoint | Beschreibung |
|----------|--------------|
| `/api/community-interactions` | CRUD für Interactions |
| `/api/community-rules` | CRUD für Rules |
| `/api/community-templates` | CRUD für Templates |
| `/api/social-platforms` | CRUD für Platforms |
| `/api/social-accounts` | CRUD für Accounts |

---

## 5. Rules Engine

### 5.1 Funktionsweise

```typescript
class RulesEngine {
  // Verarbeitet neue Interactions
  async processNewInteraction(interaction: Interaction): Promise<void>

  // Lädt aktive Regeln (sortiert nach Priorität)
  private async loadActiveRules(): Promise<Rule[]>

  // Prüft ob Trigger matcht
  private matchesTrigger(interaction: Interaction, rule: Rule): boolean

  // Führt Aktionen aus
  private executeActions(interaction: Interaction, actions: Action[]): Promise<void>
}
```

### 5.2 Beispiel-Regeln

**Regel 1: Medizinische Fragen**
```json
{
  "name": "Medizinische Fragen - Priorität hoch",
  "priority": 10,
  "trigger": {
    "type": "keyword",
    "keywords": [
      { "keyword": "arzt", "matchType": "contains" },
      { "keyword": "schmerz", "matchType": "contains" },
      { "keyword": "medikament", "matchType": "contains" }
    ]
  },
  "actions": [
    { "action": "set_priority", "value": "urgent" },
    { "action": "flag_medical" },
    { "action": "send_notification", "targetUser": "manager" }
  ]
}
```

**Regel 2: Influencer-Kommentare**
```json
{
  "name": "Influencer - Priorität urgent",
  "priority": 5,
  "trigger": {
    "type": "influencer",
    "influencerMinFollowers": 10000
  },
  "actions": [
    { "action": "set_priority", "value": "urgent" },
    { "action": "assign_to", "targetUser": "creator" }
  ]
}
```

**Regel 3: Spam-Erkennung**
```json
{
  "name": "Spam-Erkennung",
  "priority": 1,
  "trigger": {
    "type": "keyword",
    "keywords": [
      { "keyword": "free.*money", "matchType": "regex" },
      { "keyword": "click.*link", "matchType": "regex" }
    ]
  },
  "actions": [
    { "action": "mark_spam" },
    { "action": "set_priority", "value": "low" }
  ]
}
```

---

## 6. Scheduled Jobs

### 6.1 Comment Sync Cron

**Schedule:** `*/15 * * * *` (alle 15 Minuten)
**Job:** `syncAllComments`

```
1. Lade alle aktiven Social Accounts mit gültigen Tokens
2. Für jeden Account:
   a. Prüfe Rate Limits
   b. Hole neue Kommentare via YouTube API
   c. Speichere als Community Interactions
   d. Verarbeite mit Rules Engine
3. Logge Ergebnis
```

### 6.2 Token Refresh

**Trigger:** Vor Ablauf des Access Tokens
**Aktion:** Refresh Token verwenden für neuen Access Token

---

## 7. Berechtigungen

### 7.1 Rollen-Hierarchie

```
Super Admin
    │
    ├── YouTube Manager ──► Voller Zugriff auf YouTube & Community
    │
    ├── Community Manager ──► Voller Zugriff auf Community
    │
    ├── Community Moderator ──► Lesen & Antworten
    │
    └── Community Viewer ──► Nur Lesen
```

### 7.2 Access Control Matrix

| Aktion | Viewer | Moderator | Manager | Super Admin |
|--------|--------|-----------|---------|-------------|
| Interactions lesen | ✅ | ✅ | ✅ | ✅ |
| Interactions bearbeiten | ❌ | ✅ | ✅ | ✅ |
| Antworten senden | ❌ | ✅ | ✅ | ✅ |
| Rules verwalten | ❌ | ❌ | ✅ | ✅ |
| Templates verwalten | ❌ | ❌ | ✅ | ✅ |
| Export | ❌ | ✅ | ✅ | ✅ |
| OAuth verbinden | ❌ | ❌ | ✅ | ✅ |

---

## 8. Technische Details

### 8.1 Datenbank-Schema

**Haupttabellen:**
- `community_interactions` - Haupttabelle
- `community_interactions_attachments` - Anhänge (Array)
- `community_interactions_analysis_topics` - Topics (Array)
- `community_rules` - Regeln
- `community_rules_trigger_keywords` - Keywords (Array)
- `community_rules_trigger_sentiment_values` - Sentiment-Werte (hasMany Select)
- `community_rules_actions` - Aktionen (Array)
- `community_rules_rels` - Relationships
- `community_templates` - Templates
- `community_templates_locales` - Lokalisierte Felder
- `community_templates_variables` - Variablen (Array)
- `social_platforms` - Plattformen
- `social_accounts` - Accounts

### 8.2 Payload CMS Version

- **Payload:** 3.69.0
- **Next.js:** 15.5.9
- **React:** 19.2.3
- **Datenbank:** PostgreSQL 17.6

### 8.3 Abhängigkeiten

```json
{
  "googleapis": "^140.0.0",
  "exceljs": "^4.4.0"
}
```

---

## 9. Zukünftige Erweiterungen (Phase 2+)

### Geplant:
- [ ] Instagram Integration
- [ ] TikTok Integration
- [ ] AI-basierte Sentiment-Analyse (OpenAI)
- [ ] Auto-Reply für einfache Fragen
- [ ] Team-Zuweisungsregeln
- [ ] Analytics Dashboard
- [ ] Bulk-Aktionen
- [ ] Keyboard Shortcuts
- [ ] Notification Center

---

## 10. Dateistruktur

```
src/
├── collections/
│   ├── CommunityInteractions.ts
│   ├── CommunityRules.ts
│   ├── CommunityTemplates.ts
│   ├── SocialPlatforms.ts
│   └── SocialAccounts.ts
├── lib/
│   ├── communityAccess.ts          # Access Control
│   ├── services/
│   │   └── RulesEngine.ts          # Automatisierung
│   └── integrations/
│       └── youtube/
│           └── oauth.ts            # YouTube OAuth
├── jobs/
│   ├── scheduler.ts                # Cron-Jobs
│   └── syncAllComments.ts          # Comment Sync
└── app/(payload)/
    ├── admin/views/community/
    │   └── inbox/
    │       ├── page.tsx            # Page Route
    │       ├── CommunityInbox.tsx  # React Component
    │       └── inbox.scss          # Styles
    └── api/
        ├── community/
        │   ├── export/route.ts
        │   ├── stats/route.ts
        │   └── reply/route.ts
        └── youtube/
            ├── auth/route.ts
            ├── callback/route.ts
            └── refresh-token/route.ts
```

---

**Erstellt von:** Claude Opus 4.5
**Für:** Design AI / Dokumentation
**Projekt:** Payload CMS Multi-Tenant
