Tops & Flops
Tops & Flops zeigt globale Leaderboards ueber alle getracken Profile hinweg. Im Gegensatz zum Dashboard (Workspace-bezogen) operiert Tops & Flops auf dem gesamten Datenbestand.
Globale vs. Dashboard-Leaderboards
| Aspekt | Dashboard | Tops & Flops |
|---|---|---|
| Scope | Ein Workspace | Alle Profile global |
| Datenquelle | dashboard_leaderboard_snapshots | dashboard_global_snapshots |
| Zugang | Workspace-Mitglieder | Alle authentifizierten User |
| Filter | Favoriten | Tier, Metrik |
Datenquelle: Global Snapshots
Die Tabelle dashboard_global_snapshots speichert vorberechnete Rankings:
| Feld | Beschreibung |
|---|---|
period | Zeitraum (z.B. 7d) |
metric | Metrik (followers, views, videos, posts, following, score) |
tier | Follower-Tier oder all |
end_date | End-Datum der Periode |
winners | JSON-Array der Top-Profile (aufsteigend nach Delta) |
losers | JSON-Array der Flop-Profile (absteigend nach Delta) |
chart | JSON-Array mit aggregierten Chart-Daten |
Location: app/Console/Commands/BuildDashboardLeaderboardSnapshots.php
Konfiguration
Tops & Flops ist ueber config('postbox.tops_flops') konfigurierbar:
# Kandidaten-Pool fuer die Leaderboard-Berechnung
POSTBOX_LEADERBOARD_CANDIDATE_LIMIT=500
# Angezeigte Eintraege pro Liste (Winners/Losers)
POSTBOX_TOPS_FLOPS_DISPLAY_LIMIT=25
# Pool-Groesse fuer die Snapshot-Berechnung
POSTBOX_TOPS_FLOPS_POOL_SIZE=50
| ENV Variable | Default | Beschreibung |
|---|---|---|
POSTBOX_LEADERBOARD_CANDIDATE_LIMIT | 500 | Wie viele Profile pro Metrik/Tier als Kandidaten herangezogen werden |
POSTBOX_TOPS_FLOPS_DISPLAY_LIMIT | 25 | Angezeigte Eintraege pro Winners/Losers-Liste |
POSTBOX_TOPS_FLOPS_POOL_SIZE | 50 | Pool-Groesse fuer BuildGlobalLeaderboardSnapshots |
Zeitraeume
Aktuell wird ausschliesslich die 7-Tage-Periode verwendet:
public string $period = '7d';
Date-Navigation (vor/zurueck) ist verfuegbar mit Schritten von 7 Tagen. Das End-Datum ist auf "gestern" geclampt.
$yesterday = now()->subDay()->startOfDay();
// Fruehestes Datum
$earliestDataDate = Carbon::parse('2026-01-08')->startOfDay();
Metriken
Sechs Metriken stehen zur Auswahl:
| Key | Label | Beschreibung |
|---|---|---|
followers | Follower | Follower-Wachstum (Default) |
views | Views | View-Wachstum (YouTube) |
videos | Videos | Neue Videos (YouTube) |
posts | Beitraege | Neue Beitraege (Instagram) |
following | Following | Following-Aenderung (Instagram) |
score | Postbox Score | Score-Veraenderung |
Platform-Filter
Der Platform-Filter zeigt die Anzahl der Profile pro Plattform in Klammern:
- "Alle Plattformen (50)"
- "YouTube (35)"
- "Instagram (15)"
Counts werden aus den ungefilterten Snapshot-Daten berechnet (kein zusaetzlicher DB-Query). Filtert die Winners/Losers-Listen nach Plattform.
Tier-Filter
Profile koennen nach Follower-Tier gefiltert werden:
| Tier | Follower-Bereich |
|---|---|
all | Alle Profile (Default) |
micro | 0 - 10.000 |
small | 10.000 - 100.000 |
medium | 100.000 - 500.000 |
large | 500.000 - 1.000.000 |
mega | 1.000.000+ |
Priority Profiles Concept
Die Leaderboard-Berechnung unterscheidet zwischen:
- Leaders: Profile, die aktuell in den Top-Listen erscheinen
- Candidates: Profile, die potenziell in die Top-Listen aufsteigen koennten
Leaders erhalten Prioritaet bei der taeglichen Datenaktualisierung, um sicherzustellen, dass die angezeigten Rankings auf aktuellen Daten basieren.
Location: app/Services/Dashboard/LeaderboardPriorityService.php
Tracking-Status
Fuer jedes angezeigte Profil wird geprueft, ob der User es bereits in einem Workspace trackt:
// Nur fuer die angezeigten Profile (max ~50 IDs) pruefen - OOM Fix
$profileIds = collect($this->winners)
->merge($this->losers)
->pluck('social_profile_id')
->unique()
->all();
Der Admin-Workspace wird bei der Tracking-Pruefung ausgeschlossen.
Add-to-Workspace
User koennen Profile direkt aus den Tops & Flops in einen Workspace uebernehmen:
- User klickt "Hinzufuegen" bei einem Profil
- Waehlt Ziel-Workspace aus Dropdown
addToWorkspace()erstellt Watcher + WatcherSource- Favoriten- und Admin-Workspace sind als Ziel gesperrt
Location: app/Livewire/TopsFlops/Index.php (Methode addToWorkspace())
Chart: Forward-Fill und Fallback-Fenster
Die Entwicklung-Charts (global) nutzen dasselbe Forward-Fill-Verfahren wie die Dashboard-Charts. Da Profile nicht taeglich aktualisiert werden (3-Tage-Rotation normal, 7-Tage-Rotation Low-Priority), wird ein Fallback-Fenster von 8 Tagen verwendet (max(instagram, youtube, low_priority) + 1).
Details zum Forward-Fill-Algorithmus: siehe Dashboard > Chart-Daten.
Datenfluss
UI (TopsFlops/Index)
--> Livewire Component laedt Global Snapshot
--> dashboard_global_snapshots (Tabelle)
--> Vorberechnet durch BuildGlobalLeaderboardSnapshots
--> Basierend auf social_profile_daily_metrics
UI-Darstellung
Die Winners- und Losers-Listen zeigen jeweils maximal 25 Eintraege:
- Position (1-25)
- Profil-Name, Handle, Platform-Badge
- Aktueller Wert der Metrik
- Delta (Veraenderung in der Periode)
- "Bereits getrackt"-Indikator oder "Hinzufuegen"-Button
- Listview-Toggle: "Tops", "Flops" oder "Beide"
Chart-Darstellung mit Y-Achsen-Formatierung:
- Unter 1M: Gruppierte Ganzzahlen
- Ab 1M: Kompakte Notation (1,2M)
Location: app/Livewire/TopsFlops/Index.php, resources/views/livewire/tops-flops/index.blade.php