Zum Hauptinhalt springen

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

AspektDashboardTops & Flops
ScopeEin WorkspaceAlle Profile global
Datenquelledashboard_leaderboard_snapshotsdashboard_global_snapshots
ZugangWorkspace-MitgliederAlle authentifizierten User
FilterFavoritenTier, Metrik

Datenquelle: Global Snapshots

Die Tabelle dashboard_global_snapshots speichert vorberechnete Rankings:

FeldBeschreibung
periodZeitraum (z.B. 7d)
metricMetrik (followers, views, videos, posts, following, score)
tierFollower-Tier oder all
end_dateEnd-Datum der Periode
winnersJSON-Array der Top-Profile (aufsteigend nach Delta)
losersJSON-Array der Flop-Profile (absteigend nach Delta)
chartJSON-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 VariableDefaultBeschreibung
POSTBOX_LEADERBOARD_CANDIDATE_LIMIT500Wie viele Profile pro Metrik/Tier als Kandidaten herangezogen werden
POSTBOX_TOPS_FLOPS_DISPLAY_LIMIT25Angezeigte Eintraege pro Winners/Losers-Liste
POSTBOX_TOPS_FLOPS_POOL_SIZE50Pool-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:

KeyLabelBeschreibung
followersFollowerFollower-Wachstum (Default)
viewsViewsView-Wachstum (YouTube)
videosVideosNeue Videos (YouTube)
postsBeitraegeNeue Beitraege (Instagram)
followingFollowingFollowing-Aenderung (Instagram)
scorePostbox ScoreScore-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:

TierFollower-Bereich
allAlle Profile (Default)
micro0 - 10.000
small10.000 - 100.000
medium100.000 - 500.000
large500.000 - 1.000.000
mega1.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:

  1. User klickt "Hinzufuegen" bei einem Profil
  2. Waehlt Ziel-Workspace aus Dropdown
  3. addToWorkspace() erstellt Watcher + WatcherSource
  4. 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