Refactoring-Plan (Phasen 1–5)
Durchnummerierter, phasenweiser Refactoring-Plan. Jede Phase kann einzeln freigegeben und umgesetzt werden.
Phase 1: Kritische Fixes (Quick Wins)
Sofort umsetzbare Korrekturen die Best-Practice-Verstöße oder potenzielle Bugs beheben.
1.1 session()->flash() durch Toast-Dispatch ersetzen
| Eigenschaft | Wert |
|---|---|
| Priorität | Mittel |
| Aufwand | ~30 Min |
| Risiko | Niedrig |
Laut CLAUDE.md ist session()->flash() verboten — alle Benachrichtigungen müssen über Toast-Dispatch laufen.
Verbleibende Stellen:
| Datei | Zeile(n) | Kontext | Lösung |
|---|---|---|---|
app/Http/Controllers/Watchers/ToggleFavoriteController.php | 52, 56 | Favorit togglen (POST + Redirect) | Zu Livewire-Action konvertieren |
bootstrap/app.php | 96 | CSRF 419-Fehler (Pre-Livewire) | ✅ Akzeptabel — Bridge-Pattern |
Hinweis: Der ToggleFavoriteController ist ein traditioneller Controller mit return back(). Die Flash-Messages werden über NotificationCenter::dispatchFlashToasts() korrekt als Toast-Events dispatcht. Der sauberste Fix wäre die Konvertierung zu einer Livewire-Action.
Location: app/Http/Controllers/Watchers/ToggleFavoriteController.php
1.1b Toast-Pattern-Inkonsistenz: Flux::toast() vs dispatch('show-toast')
| Eigenschaft | Wert |
|---|---|
| Priorität | Niedrig |
| Aufwand | ~20 Min |
| Risiko | Niedrig |
Das Projekt verwendet zwei verschiedene Toast-Patterns — beide funktionieren, aber die Inkonsistenz erschwert die Wartung:
| Pattern | Stellen | Components |
|---|---|---|
$this->dispatch('show-toast', [...]) | 122+ | Alle Standard-Components |
Flux::toast(...) | ~13 | Explore/*, Admin/TagManagement |
Aktion: Alle Flux::toast() Aufrufe durch $this->dispatch('show-toast', [...]) ersetzen für einheitliches Pattern.
Location: app/Livewire/Explore/*.php, app/Livewire/Admin/TagManagement/Index.php
1.2 env() in Code durch config() ersetzen
| Eigenschaft | Wert |
|---|---|
| Priorität | Niedrig |
| Aufwand | ~15 Min |
| Risiko | Niedrig |
Laravel Best Practice: env() darf nur in Config-Dateien verwendet werden, im Code immer config(). Nach config:cache liefert env() im Code null zurück.
ERLEDIGT (2026-03-06): Sentry wurde vollständig entfernt und durch Flare (spatie/laravel-flare) + Nightwatch (laravel/nightwatch) ersetzt.
SentryRelease.phpexistiert nicht mehr. Dieser Punkt ist obsolet.
Phase 2: Custom Code → Flux UI Pro Migration
Ersetzen von handgebautem HTML/CSS durch Flux UI Pro Components für konsistente UI und weniger Wartungsaufwand.
2.1 Custom Modal → <flux:modal> (1 verbleibend)
| Eigenschaft | Wert |
|---|---|
| Priorität | Niedrig |
| Aufwand | ~30 Min |
| Risiko | Niedrig |
Status: Die Modals in admin/related-channels, admin/social-profiles und die meisten in watchers/index wurden bereits auf <flux:modal> migriert.
Verbleibendes Custom-Modal:
| Datei | Kontext |
|---|---|
resources/views/livewire/watchers/index.blade.php | Workspace-Edit-Modal (raw HTML mit Alpine) |
Location: resources/views/livewire/watchers/index.blade.php
2.2 Custom HTML-Tabellen → <flux:table>
| Eigenschaft | Wert |
|---|---|
| Priorität | Mittel |
| Aufwand | ~20 Min pro Tabelle |
| Risiko | Niedrig |
Zwei Admin-Seiten verwenden noch <table> HTML statt <flux:table>:
| Datei | Kontext |
|---|---|
resources/views/livewire/admin/log-queue/index.blade.php | Queue-Status-Tabelle |
resources/views/livewire/admin/statistics/index.blade.php | Diverse Statistik-Tabellen |
Location: Betroffene Blade-Views
2.3 Raw HTML <input type="checkbox"> → <flux:checkbox>
| Eigenschaft | Wert |
|---|---|
| Priorität | Niedrig |
| Aufwand | ~10 Min |
| Risiko | Niedrig |
Eine Stelle verwendet noch rohes HTML-Checkbox statt Flux UI:
| Datei | Kontext |
|---|---|
resources/views/livewire/watchers/index.blade.php | "Low Priority Import" Checkbox |
Location: resources/views/livewire/watchers/index.blade.php
Phase 3: Component-Refactoring (Große Dateien aufteilen)
Die größten Livewire-Components und Services in kleinere, fokussierte Einheiten aufteilen.
3.1 Dashboard/Index.php aufteilen (1352 Zeilen)
| Eigenschaft | Wert |
|---|---|
| Priorität | Hoch |
| Aufwand | ~2-3 Stunden |
| Risiko | Mittel (viele Tests betroffen) |
Größte Livewire-Component im Projekt. Enthält Dashboard-Logik, Leaderboard-Queries, Rollup-Daten und Chart-Konfiguration.
Vorschlag:
| Neue Component / Partial | Verantwortung |
|---|---|
Dashboard\Index | Haupt-Container, Period-Switcher, Layout |
Dashboard\LeaderboardPanel | Leaderboard-Queries + Rendering |
Dashboard\MetricsOverview | Stat-Boxes, KPI-Berechnung |
Dashboard\GrowthChart | Chart-Logik (Follower Growth) |
Dashboard\ActivityFeed | Recent Activity / Scrape-Status |
Location: app/Livewire/Dashboard/Index.php
3.2 Watchers/Index.php aufteilen (1108 Zeilen)
| Eigenschaft | Wert |
|---|---|
| Priorität | Hoch |
| Aufwand | ~2-3 Stunden |
| Risiko | Mittel |
Vorschlag:
| Neue Component / Partial | Verantwortung |
|---|---|
Watchers\Index | Haupt-Container, Layout, Pagination |
Watchers\FilterBar | Such- und Filter-Logik |
Watchers\BulkActions | Bulk-Import, Bulk-Delete, CSV-Export |
Watchers\WatcherCard | Einzelne Watcher-Card-Darstellung |
Location: app/Livewire/Watchers/Index.php
3.3 Watchers/Show.php aufteilen (1095 Zeilen)
| Eigenschaft | Wert |
|---|---|
| Priorität | Mittel |
| Aufwand | ~2-3 Stunden |
| Risiko | Mittel |
Vorschlag:
| Neue Component / Partial | Verantwortung |
|---|---|
Watchers\Show | Haupt-Container, Profil-Header |
Watchers\MetricsChart | Chart-Rendering, Zeitraum-Wechsel |
Watchers\ProfileDetails | Profil-Details, Social Links |
Watchers\VideoList | YouTube-Video-Tabelle |
Watchers\AdminActions | Admin-only Aktionen (Block, Sanitize, Prune) |
Location: app/Livewire/Watchers/Show.php
3.4 SystemHealthService aufteilen (727 Zeilen)
| Eigenschaft | Wert |
|---|---|
| Priorität | Mittel |
| Aufwand | ~1-2 Stunden |
| Risiko | Niedrig |
Vorschlag:
| Neue Service-Klasse | Verantwortung |
|---|---|
SystemHealthService | Orchestrator, Gesamtstatus |
QueueHealthChecker | Queue-Status, Failed Jobs, Stuck Jobs |
ScrapingHealthChecker | Scrape-Metriken, API-Status, Collector |
DatabaseHealthChecker | DB-Size, Connection, Slow Queries |
Location: app/Services/Health/SystemHealthService.php
3.5 CrossPlatformRelatedCalculator aufteilen (742 Zeilen)
| Eigenschaft | Wert |
|---|---|
| Priorität | Mittel |
| Aufwand | ~1-2 Stunden |
| Risiko | Niedrig |
Vorschlag:
| Neue Service-Klasse | Verantwortung |
|---|---|
CrossPlatformRelatedCalculator | Orchestrator |
CrossPlatformUrlMatcher | URL-basierte Erkennung |
CrossPlatformNameMatcher | Name-/Handle-basierte Erkennung |
CrossPlatformScorer | Confidence-Score-Berechnung |
Location: app/Services/Social/CrossPlatformRelatedCalculator.php
Phase 4: Template-Cleanup
4.1 @php Logik aus Blade-Templates extrahieren
| Eigenschaft | Wert |
|---|---|
| Priorität | Mittel |
| Aufwand | ~1-2 Stunden |
| Risiko | Niedrig |
Mehrere Templates enthalten umfangreiche @php ... @endphp Blöcke mit Business-Logik. Diese Logik gehört in die Livewire-Component (Computed Properties) oder in Services.
Betroffene Dateien (Auswahl):
| Datei | Logik | Verschieben nach |
|---|---|---|
resources/views/livewire/watchers/show.blade.php | Chart-Daten-Transformation | Show.php Computed Property |
resources/views/livewire/dashboard/index.blade.php | Leaderboard-Formatierung | Index.php Computed Property |
resources/views/livewire/explore/index.blade.php | Stat-Berechnung | Index.php Computed Property |
4.2 Loading States vereinheitlichen
| Eigenschaft | Wert |
|---|---|
| Priorität | Niedrig |
| Aufwand | ~1 Stunde |
| Risiko | Niedrig |
Verschiedene Loading-Patterns im Einsatz. Standardisieren auf Flux-Pattern.
Location: Diverse Blade-Views
Phase 5: Code-Qualität & Dokumentation
5.1 PHPDoc für öffentliche Service-Methoden
| Eigenschaft | Wert |
|---|---|
| Priorität | Niedrig |
| Aufwand | ~2 Stunden |
| Risiko | Keins |
Mehrere Services haben keine oder unvollständige PHPDoc-Kommentare:
| Service | Fehlende Docs |
|---|---|
ExploreMetricsCalculator | Public methods calculate(), updateTrendingFlags() |
ProfileScoreCalculator | Formel-Dokumentation |
CrossPlatformRelatedCalculator | Matching-Algorithmus |
SocialProfileLinkSyncer | Sync-Logik, Rejected-Link-Handling |
Location: app/Services/
5.2 Eager Loading Reviews
| Eigenschaft | Wert |
|---|---|
| Priorität | Mittel |
| Aufwand | ~1 Stunde |
| Risiko | Niedrig |
Potenzielle N+1 Query-Probleme:
| Component | Relation | Kontext |
|---|---|---|
Watchers/Index | watcher.socialProfile.latestMetric | Watcher-Liste |
Explore/Browse | profile.tags, profile.score | Profil-Grid |
Dashboard/Index | leaderboard.profiles.metrics | Leaderboard |
Aktion: Model::preventLazyLoading(!app()->isProduction()) in AppServiceProvider aktivieren, N+1 Queries identifizieren und mit with() / withCount() beheben.
5.3 DB::raw() Audit
| Eigenschaft | Wert |
|---|---|
| Priorität | Niedrig |
| Aufwand | ~30 Min (Review) |
| Risiko | Keins |
Es gibt 37+ DB::raw() Stellen im Code. Ein Stichproben-Audit zeigt, dass alle aktuell sicher sind (keine User-Input-Interpolation). Trotzdem sollte ein vollständiger Review dokumentiert werden.
Location: app/Services/, app/Console/Commands/, app/Livewire/
Zusammenfassung
| Phase | Items | Priorität | Geschätzter Aufwand |
|---|---|---|---|
| Phase 1: Kritische Fixes | 3 | Hoch–Mittel | ~1 Stunde |
| Phase 2: Flux UI Migration | 3 | Mittel–Niedrig | ~1-2 Stunden |
| Phase 3: Component-Refactoring | 5 | Hoch–Mittel | ~8-12 Stunden |
| Phase 4: Template-Cleanup | 2 | Mittel–Niedrig | ~2-3 Stunden |
| Phase 5: Code-Qualität | 3 | Mittel–Niedrig | ~3-4 Stunden |
| Gesamt | 16 Items | ~15-22 Stunden |
Empfohlene Reihenfolge: Phase 1 → Phase 2 → Phase 3.1 (Dashboard) → Phase 3.2 (Watchers/Index) → Rest nach Bedarf.