From af86a16061f8c5eaef3a6771f3aaf40c5b8e0a34 Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Fri, 19 Jun 2026 10:11:48 +0000 Subject: [PATCH] Optimierung 2.9: HandlesAdminPressReleaseActions::findAdminPR() Den ~15x duplizierten Admin-Lookup PressRelease::withoutGlobalScopes() ->findOrFail($id) in einen findAdminPR()-Helfer (Concern) zentralisiert; index/edit/show nutzen ihn. Die eager-load-Query in show::with() bleibt unberuehrt (anderer Zweck). Bewusst NICHT vereinheitlicht: das Status-Badge-Mapping divergiert real (index: archived/draft -> muted; edit/show: -> hub via default) -> waere eine Design-Entscheidung ueber kanonische Badge-Farben, keine mechanische Dedup. Tests: volle Suite gruen (799 passed, 1 skipped). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../HandlesAdminPressReleaseActions.php | 19 +++++++++++++++++++ .../admin/press-releases/edit.blade.php | 19 ++++++++++--------- .../admin/press-releases/index.blade.php | 7 ++++--- .../admin/press-releases/show.blade.php | 8 +++++--- 4 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 app/Livewire/Concerns/HandlesAdminPressReleaseActions.php diff --git a/app/Livewire/Concerns/HandlesAdminPressReleaseActions.php b/app/Livewire/Concerns/HandlesAdminPressReleaseActions.php new file mode 100644 index 00000000..69faae13 --- /dev/null +++ b/app/Livewire/Concerns/HandlesAdminPressReleaseActions.php @@ -0,0 +1,19 @@ +findOrFail($id); + } +} diff --git a/resources/views/livewire/admin/press-releases/edit.blade.php b/resources/views/livewire/admin/press-releases/edit.blade.php index dc790a9f..ddfedd32 100644 --- a/resources/views/livewire/admin/press-releases/edit.blade.php +++ b/resources/views/livewire/admin/press-releases/edit.blade.php @@ -23,6 +23,7 @@ use Livewire\Attributes\Title; use Livewire\Volt\Component; new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] class extends Component { + use \App\Livewire\Concerns\HandlesAdminPressReleaseActions; use \App\Livewire\Concerns\InteractsWithPressReleaseContacts; use \App\Livewire\Concerns\InteractsWithPressReleaseScheduling; use \App\Livewire\Concerns\InteractsWithPressReleaseTags; @@ -90,7 +91,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl { $this->id = $id; - $pr = PressRelease::withoutGlobalScopes()->findOrFail($id); + $pr = $this->findAdminPR($id); $this->portal = $pr->portal->value; $this->language = $pr->language; @@ -166,7 +167,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl throw $e; } - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); if ($pr->title !== $this->title || $pr->portal !== $this->portal || $pr->language !== $this->language) { $slug = $pr->generateUniqueSlug($this->title, [ @@ -216,7 +217,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl public function submitForReview(): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); try { app(PressReleaseService::class)->submitForReview($pr); @@ -269,7 +270,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl public function publish(): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); try { app(PressReleaseService::class)->publish($pr); @@ -286,7 +287,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl public function reject(): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); app(PressReleaseService::class)->reject($pr); $this->currentStatus = PressReleaseStatus::Rejected->value; Flux::toast(text: __('Pressemitteilung abgelehnt. Autor wurde benachrichtigt.'), variant: 'warning'); @@ -294,7 +295,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl public function backToDraft(): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); app(PressReleaseService::class)->backToDraft($pr); $this->currentStatus = PressReleaseStatus::Draft->value; Flux::toast(text: __('Zurück auf Entwurf gesetzt.'), variant: 'success'); @@ -302,7 +303,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl public function archive(): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); app(PressReleaseService::class)->archive($pr); $this->currentStatus = PressReleaseStatus::Archived->value; $this->targetStatus = $this->currentStatus; @@ -322,7 +323,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl } $status = PressReleaseStatus::from($this->targetStatus); - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); app(PressReleaseService::class)->changeStatusFromAdmin($pr, $status); @@ -335,7 +336,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung bearbeiten')] cl public function deletePressRelease(): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); $wasPublished = $pr->status === PressReleaseStatus::Published; app(PressReleaseService::class)->deleteFromAdmin($pr); diff --git a/resources/views/livewire/admin/press-releases/index.blade.php b/resources/views/livewire/admin/press-releases/index.blade.php index bd1571f5..3f912d1b 100644 --- a/resources/views/livewire/admin/press-releases/index.blade.php +++ b/resources/views/livewire/admin/press-releases/index.blade.php @@ -20,6 +20,7 @@ use Livewire\WithPagination; new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class extends Component { + use \App\Livewire\Concerns\HandlesAdminPressReleaseActions; use WithPagination; public string $search = ''; @@ -162,7 +163,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten public function publish(int $id): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($id); + $pr = $this->findAdminPR($id); try { app(PressReleaseService::class)->publish($pr); @@ -186,7 +187,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten public function reject(int $id): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($id); + $pr = $this->findAdminPR($id); try { app(PressReleaseService::class)->reject($pr, __('Bitte überarbeiten Sie die Pressemitteilung.')); @@ -201,7 +202,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilungen')] class exten public function archive(int $id): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($id); + $pr = $this->findAdminPR($id); try { app(PressReleaseService::class)->archive($pr); diff --git a/resources/views/livewire/admin/press-releases/show.blade.php b/resources/views/livewire/admin/press-releases/show.blade.php index d46218cd..ca26e667 100644 --- a/resources/views/livewire/admin/press-releases/show.blade.php +++ b/resources/views/livewire/admin/press-releases/show.blade.php @@ -12,6 +12,8 @@ use Livewire\Volt\Component; new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends Component { + use \App\Livewire\Concerns\HandlesAdminPressReleaseActions; + #[Locked] public int $id; @@ -24,7 +26,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends public function publish(): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); try { app(PressReleaseService::class)->publish($pr); @@ -50,7 +52,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends 'rejectReason' => ['required', 'string', 'min:5', 'max:2000'], ]); - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); app(PressReleaseService::class)->reject($pr, trim($this->rejectReason)); $this->rejectReason = ''; @@ -61,7 +63,7 @@ new #[Layout('components.layouts.app'), Title('Pressemitteilung')] class extends public function archive(): void { - $pr = PressRelease::withoutGlobalScopes()->findOrFail($this->id); + $pr = $this->findAdminPR($this->id); app(PressReleaseService::class)->archive($pr); Flux::toast(text: __('Archiviert.'), variant: 'success'); Flux::modal('confirm-show-archive')->close();