Admin/Statistics/Index
Admin-Dashboard mit vier kumulativen Wachstums-Charts (Flux UI Chart-Komponenten) und globalem Zeitraum-Filter (Default: 1 Tag). Alle Chart-Daten werden mit 1h-TTL gecacht.
Route: /admin/statistics
View: resources/views/livewire/admin/statistics/index.blade.php
Location: app/Livewire/Admin/Statistics/Index.php
Autorisierung: Gate::allows('admin') in mount()
Public Properties
Jeder Chart liefert seine Daten als Array für die Flux Chart-Komponente:
| Praefix | ChartData-Property | Beschreibung |
|---|---|---|
platform | $platformChartData | Plattform-Verteilung (YouTube, Instagram) |
user | $userChartData | Workspaces & Watchers |
status | $statusChartData | Users & Profil-Status |
mail | $mailChartData | Mail-Zustellung |
Jedes ChartData-Array enthält series (Datenreihen mit date_label im d.m.Y-Format) und wird direkt an die Flux <flux:chart> Blade-Komponente übergeben. Manuelle Tick- und Max-Berechnungen (buildDateTicks, buildNiceTicks, niceStep) wurden entfernt — Flux handhabt Achsen-Skalierung automatisch.
Ein globaler $range-Filter steuert alle 4 Charts gleichzeitig. Akzeptierte Werte: '1d' (Default), '7d', '30d', 'all'.
Charts
1. Plattform-Verteilung (calculatePlatformData)
Kumulatives Wachstum der Social Profiles pro Plattform (YouTube, Instagram).
Serien: youtube, instagram
Datenquelle: SocialProfile::created_at aggregiert per DATE()
Methode: Base-Count vor startDate + taegl. Inkremente
2. Workspaces & Watchers (calculateUserData)
Kumulatives Wachstum der Workspaces und Watchers.
Serien: workspaces, watchers
Ausschluss: Admin-Workspace (AdminWorkspaceManager::ADMIN_WORKSPACE_ID) und Favoriten-Workspaces (FavoriteManager::FAVORITES_WORKSPACE_NAME)
Datenquelle: Workspace::created_at, Watcher::created_at
3. Users & Profil-Status (calculateStatusData)
Kumulatives Wachstum von Users, Blocked Profiles, Sanitized Profiles, Profiles mit Kontaktdaten, und Profiles mit genehmigten Kontaktdaten.
Serien: users, blocked, sanitized, with_contacts, approved_contacts
Datenquellen:
User::created_atSocialProfile::blocked_atSocialProfile::sanitized_atSocialProfileLink::created_at(DISTINCTsocial_profile_id)SocialProfileLink::approved_at(DISTINCTsocial_profile_id)
4. Mail-Zustellung (calculateMailData)
Taegliche E-Mail-Statistiken (gesendet vs. fehlgeschlagen).
Serien: sent, failed
Datenquelle: NotificationStat (Channels: email, email_failed)
Actions
| Method | Beschreibung |
|---|---|
updatedRange() | Alle Charts fuer neuen Zeitraum berechnen |
refreshCharts() | Cache aller Charts invalidieren und neu berechnen |
toggleMailPause() | Mailversand pausieren/fortsetzen (via MailFloodGuard) |
sendTestMail() | Synchrone Test-E-Mail an den eingeloggten Admin senden |
Mail-System Box
Die Mail-System-Karte zeigt Echtzeit-Metriken des MailFloodGuard und bietet zwei Aktionen:
Mailversand testen
Sendet synchron (nicht via Queue) eine AdminTestMail an die E-Mail-Adresse des eingeloggten Admins. Die E-Mail enthaelt:
- App-Informationen (Name, URL, Environment, PHP/Laravel-Version, Mail-Driver)
- Mail-System-Status (Pausiert, Mails/Minute, Mails/Stunde)
- User-Informationen (Name, E-Mail, ID, Zeitpunkt)
Synchroner Versand statt Queue, damit der Admin sofort Feedback bekommt ob der Mailversand funktioniert.
Mailable: App\Mail\AdminTestMail
View: resources/views/emails/admin-test.blade.php
Mailversand pausieren/fortsetzen
Toggled den Pause-Status des MailFloodGuard. Pausierte E-Mails bleiben in der Queue und werden nach Freigabe automatisch verarbeitet.
Computed: mailStatus
#[Computed]
public function mailStatus(): array
// Returns: per_minute, per_hour, paused, threshold_minute, threshold_hour, sent_24h, failed_24h
Datenquellen: MailFloodGuard::getStatus() (Redis-Counters) + MailLog (24h Sent/Failed Counts).
Cache-Strategie
Jeder Chart wird unter einem Range-spezifischen Key gecacht:
admin:statistics:platforms:{range} → 1h TTL
admin:statistics:users:{range} → 1h TTL
admin:statistics:status:{range} → 1h TTL
admin:statistics:mail:{range} → 1h TTL
refreshCharts() loescht alle 4 Cache-Keys fuer die aktuellen Ranges und berechnet die Charts neu.
Chart-Rendering
Charts nutzen native Flux UI <flux:chart> Komponenten. Achsen-Skalierung, Tooltips und Responsivität werden von Flux gehandhabt. Delta-Tooltips zeigen Δ-Werte mit signDisplay: 'always'.
Startdatum-Logik
| Range | Startdatum |
|---|---|
1d | now() - 1 Tag (Default) |
7d | now() - 7 Tage |
30d | now() - 30 Tage |
all | MIN(social_profiles.created_at) oder now() - 1 Jahr als Fallback |