Zum Hauptinhalt springen

Admin Management Components

Verwaltungs-Components fuer User, Social Profiles, Tags, CMS-Seiten, AI Enhancements, Related Channels, Import-Status und Profil-Kategorien.

Admin/Users/Index

User-Verwaltung mit Suche, Admin-Filter, Sortierung und User-Blocking.

Route: /admin/users View: resources/views/livewire/admin/users/index.blade.php Location: app/Livewire/Admin/Users/Index.php

Public Properties

PropertyTypDefaultBeschreibung
$qstring''Suche nach Name/E-Mail
$adminFilterstring''Filter: '', 'admin', 'non-admin'
$blockedFilterstring''Filter: '', 'blocked'
$newsletterFilterstring''Filter: '', 'subscribed', 'pending', 'none'
$sortstring'created_at'Sortierspalte
$sortDirstring'desc'Sortierrichtung
$showBlockModalboolfalseBlock-Bestaetigung-Modal
$showHistoryModalboolfalseBlock-History-Modal
$blockReasonstring''Sperrgrund-Eingabe

Actions

MethodBeschreibung
sortBy(string $column)Spalte sortieren (toggle asc/desc)
blockUser(int $id)User sperren: blocked_at/blocked_by/block_reason setzen, Sessions loeschen, Token invalidieren, UserBlock Audit-Log
unblockUser(int $id)Sperre aufheben: blocked_at/blocked_by/block_reason nullen, UserBlock Audit-Log
showBlockHistory(int $id)Block-History-Modal oeffnen (alle Block/Unblock-Aktionen)

Newsletter-Filter

Der Newsletter-Filter ($newsletterFilter) filtert User nach Double-Opt-In-Status:

WertQueryBeschreibung
'subscribed'whereNotNull('newsletter_opted_in_at')Bestaetigt ✅
'pending'whereNotNull('newsletter_token')->whereNull('newsletter_opted_in_at')Ausstehend ⏳
'none'whereNull('newsletter_token')->whereNull('newsletter_opted_in_at')Kein Newsletter

In der Tabelle wird der Newsletter-Status als Badge angezeigt. Die Gesamtzahl der Abonnenten wird als $newsletterCount berechnet (User::whereNotNull('newsletter_opted_in_at')->count()).

Berechnete Spalten

Jeder User wird mit Subqueries angereichert:

  • last_login_at: Letzte Session-Aktivitaet aus sessions-Tabelle
  • workspaces_count: Anzahl Workspaces (withCount)
  • watchers_count: Anzahl Watchers ueber alle Workspaces (Subquery mit JOIN)

Admin-Status wird gegen config('postbox.admin_emails') geprueft (PostgreSQL: LOWER(email) = ANY(...)).

Sicherheit

  • Admin-Selbstsperre wird verhindert ($user->id === auth()->id())
  • CheckBlockedUser-Middleware sorgt fuer sofortiges Ausloggen gesperrter User
  • Fortify-Login lehnt gesperrte User mit generischer Fehlermeldung ab

Admin/SocialProfiles/Index

Zentrale Profil-Verwaltung mit Health-Stats, umfangreichen Filtern und Admin-Aktionen.

Route: /admin/social-profiles View: resources/views/livewire/admin/social-profiles/index.blade.php Location: app/Livewire/Admin/SocialProfiles/Index.php

Public Properties

PropertyTypDefaultBeschreibung
$qstring''Suche nach Handle, Title, External-ID
$platformstring'''', 'youtube', 'instagram'
$usagestring'''used' (hat Watchers), 'internal' (keine Watchers)
$trackingstring'''enabled', 'disabled'
$apiStatusstring'''active', 'inactive', 'error', 'unknown'
$autoDisabledstring'''yes', 'no'
$sanitizedstring'''yes', 'no'
$contactDatastring'''none', 'any', 'approved', 'email', 'url', oder Plattform-Name
$showDisableModalboolfalseDisable-Bestaetigungsmodal
$showPruneModalboolfalsePrune-Bestaetigungsmodal
$disableIdint|nullnullProfil-ID fuer Disable
$pruneIdint|nullnullProfil-ID fuer Prune

Health-Stats (Computed)

$this->healthStats = [
'total', 'tracking_enabled', 'tracking_disabled',
'sanitized', 'pending_retry', 'archived',
'blocked', 'no_metrics',
'api_active', 'api_error', 'api_inactive',
];

Actions

MethodBeschreibung
confirmDisable(int $id)Disable-Modal oeffnen (prueft Watcher-Referenzen)
disableTracking()Tracking deaktivieren (mit Re-Check der Referenzen)
confirmPrune(int $id)Prune-Modal oeffnen
prune()Profil + Metriken loeschen (nur wenn tracking=false, keine Watchers)
enableTracking(int $id)Tracking reaktivieren + Fail-Streak zuruecksetzen
retryProfile(int $id)RetryInactiveProfileScrape-Job dispatchen
applyScorePenalty(int $id)25% Score-Penalty setzen
removeScorePenalty(int $id)Score-Penalty entfernen

Prune-Sicherheitslogik

Vor dem Prune wird AdminWorkspaceManager::removeProfileFromAdminWorkspace() aufgerufen, dann der Watcher-Count erneut geladen. Nur Profile ohne Watcher-Referenzen und deaktiviertem Tracking koennen geloescht werden.


Admin/TagManagement/Index

Tag-Verwaltung: Blocken/Entblocken von AI-generierten Tags, Tag-Konsolidierung.

Route: /admin/tag-management View: resources/views/livewire/admin/tag-management/index.blade.php Location: app/Livewire/Admin/TagManagement/Index.php

Actions

MethodBeschreibung
blockTag(string $tag)Tag zur Blocklist hinzufuegen
unblockTag(string $tag)Tag von Blocklist entfernen

Geblockte Tags werden in der BlockedTag-Tabelle gespeichert und aus Explore-Tag-Cloud und Browse-Filtern ausgeblendet.


Admin/Pages/Index + Edit

CMS-Seitenverwaltung fuer statische Inhaltsseiten.

Route: /admin/pages, /admin/pages/create, /admin/pages/{page}/edit Location: app/Livewire/Admin/Pages/Index.php, app/Livewire/Admin/Pages/Edit.php

Pages/Index Actions

MethodBeschreibung
confirmDelete(int $id)Seite zum Loeschen vormerken
deletePage()Seite loeschen

Pages/Edit Properties

PropertyTypBeschreibung
$pagePage|nullExistierende Seite (Edit) oder null (Create)
$titlestringSeitentitel
$slugstringURL-Slug
$contentstringMarkdown-Inhalt
$is_publishedboolVeroeffentlicht-Status

Admin/AiEnhancements/Index

Uebersicht der AI Detection Ergebnisse (Sprache, Keywords, Kategorie).

Route: /admin/ai-enhancements View: resources/views/livewire/admin/ai-enhancements/index.blade.php Location: app/Livewire/Admin/AiEnhancements/Index.php

Zeigt Profile mit AI-generierten Daten (ai_language, ai_keywords, ai_category) und deren Detection-Status. Filter nach Plattform und Detection-Status. Das Detail-Modal enthaelt einen "AI bearbeiten"-Button der den AiFieldEditor oeffnet.


Admin/AiFieldEditor

Admin-only Modal-Component fuer manuelle Korrektur von AI-generierten Feldern.

View: resources/views/livewire/admin/ai-field-editor.blade.php Location: app/Livewire/Admin/AiFieldEditor.php

Wird via openAiFieldEditor Event geoeffnet und kann auf beliebigen Seiten eingebettet werden (Watcher Show, Public Explorer Show, AI Enhancements).

Public Properties

PropertyTypDefaultBeschreibung
$showModalboolfalseModal-Sichtbarkeit
$profileIdint|nullnullAktuell bearbeitetes Profil
$manualCategorystring''Kategorie-Eingabe
$manualDescriptionstring''Beschreibungs-Eingabe
$manualKeywordsInputstring''Keywords (komma-getrennt)
$overrideCategoryboolfalseToggle: Kategorie manuell ueberschreiben
$overrideDescriptionboolfalseToggle: Beschreibung manuell ueberschreiben
$overrideKeywordsboolfalseToggle: Keywords manuell ueberschreiben

Computed Properties

PropertyReturnBeschreibung
profileSocialProfile|nullProfil mit Images und Editor-Relation
crossPlatformRelationsarrayCross-Platform-Verknuepfungen (bidirektional, max 10)
overrideHistoryarrayLetzte 10 Audit-Log-Eintraege fuer dieses Profil
categoriesarrayAlle 26 verfuegbaren Kategorien

Actions

MethodBeschreibung
openEditor(int $profileId)Modal oeffnen, Formular mit aktuellen Werten fuellen
save()Manual Overrides speichern, Audit-Log schreiben, Explore-Sync
verifyCrossPlatform(int $relationId)Cross-Platform-Verknuepfung verifizieren
unverifyCrossPlatform(int $relationId)Verifikation aufheben
propagateToPartner(int $relatedProfileId)Kategorie + Keywords auf Partner-Profil uebertragen

Events

EventRichtungBeschreibung
openAiFieldEditorlistenOeffnet das Modal fuer eine Profil-ID
aiFieldsUpdateddispatchSignalisiert dass AI-Felder aktualisiert wurden
show-toastdispatchErfolgs-/Fehlermeldung

Admin/RelatedChannels/Index

Uebersicht und Verwaltung der Related-Channel-Beziehungen.

Route: /admin/related-channels View: resources/views/livewire/admin/related-channels/index.blade.php Location: app/Livewire/Admin/RelatedChannels/Index.php

Zeigt alle berechneten Related-Channel-Paare mit Score, Matching-Methode und Zeitstempel. Filter nach Source-Profil und Status.

Admin/ImportStatus/Index

Dashboard fuer Kontaktlink-Import-Status.

Route: /admin/import-status View: resources/views/livewire/admin/import-status/index.blade.php Location: app/Livewire/Admin/ImportStatus/Index.php

Zeigt alle importierbaren Kontaktlinks (YouTube/Instagram) mit Status (pending, completed, failed), Suche und Filtern. Stats-Cards zeigen Gesamtanzahl, Pending, Completed, Failed und verknuepfte Links.

Actions

MethodBeschreibung
KeineReine Monitoring-Seite ohne Schreibaktionen

Admin/ProfileCategories/Index

Verwaltung der AI-basierten Profil-Kategorien fuer Explore.

Route: /admin/profile-categories View: resources/views/livewire/admin/profile-categories/index.blade.php Location: app/Livewire/Admin/ProfileCategories/Index.php

Zeigt alle 26 Explore-Kategorien mit Profil-Counts, Coverage-Statistiken und Sync-Aktionen. Kategorien stammen aus ChannelLanguageDetector::CATEGORIES und werden ueber den ExploreCategorySeeder angelegt.

Computed Properties

PropertyReturnBeschreibung
categoriesCollectionAlle Kategorien sortiert nach sort_order
statsarrayCoverage: total_with_ai, total_in_explore, categorized, uncategorized, coverage_pct

Actions

MethodBeschreibung
runSeeder()Fuehrt den ExploreCategorySeeder aus (erstellt/aktualisiert alle 26 Kategorien)
runSync()Fuehrt den ExploreCategoryDetector aus (mappt AI-Kategorien auf Explore-Slugs)