22-05-2026 Optimierung der User und Admin Panels
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled

This commit is contained in:
Kevin Adametz 2026-05-22 11:18:59 +02:00
parent d2ba22c0cf
commit e8c47b7553
73 changed files with 10282 additions and 1546 deletions

View file

@ -9,6 +9,7 @@ use App\Models\AdminPreset;
use App\Models\PressRelease;
use App\Models\PressReleaseStatusLog;
use App\Services\Admin\AdminPerformanceCache;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Mail;
@ -44,7 +45,7 @@ class PressReleaseService
$this->logStatusChange($pressRelease, $previous, PressReleaseStatus::Review, null, 'customer');
}
public function publish(PressRelease $pressRelease): void
public function publish(PressRelease $pressRelease, string $source = 'admin'): void
{
$this->assertStatus($pressRelease, [PressReleaseStatus::Review]);
@ -62,13 +63,42 @@ class PressReleaseService
$pressRelease->update([
'status' => PressReleaseStatus::Published->value,
'published_at' => $pressRelease->published_at ?? now(),
'published_at' => $this->resolvePublishedAt($pressRelease),
]);
$this->logStatusChange($pressRelease, $previous, PressReleaseStatus::Published, null, 'admin');
$this->logStatusChange($pressRelease, $previous, PressReleaseStatus::Published, null, $source);
$this->notifyAuthor($pressRelease, 'published');
}
/**
* Bestimmt das wirksame `published_at` einer PM.
*
* Reihenfolge:
* 1. Bereits gesetztes `published_at` bleibt erhalten (z.B. Re-Publish)
* 2. `scheduled_at` (geplanter Veröffentlichungstermin) hat Vorrang vor "jetzt"
* 3. `embargo_at` (Sperrfrist) verschiebt zusätzlich nach hinten egal ob
* Scheduled vorhanden ist oder nicht
* 4. Fallback: now()
*
* Damit wirken sowohl Scheduling als auch Embargo automatisch über den
* vorhandenen Sichtbarkeits-Filter `where(published_at <= now())` im
* öffentlichen Listing.
*/
private function resolvePublishedAt(PressRelease $pressRelease): Carbon
{
if ($pressRelease->published_at) {
return $pressRelease->published_at;
}
$base = $pressRelease->scheduled_at ?: now();
if ($pressRelease->embargo_at && $pressRelease->embargo_at->greaterThan($base)) {
return $pressRelease->embargo_at;
}
return $base;
}
public function reject(PressRelease $pressRelease, ?string $reason = null): void
{
$this->assertStatus($pressRelease, [PressReleaseStatus::Review]);