- Fortifys sieben 2FA-Verwaltungsrouten antworten mit 404 (Middleware über fortify.middleware); die Sicherheitsseite verlangt weiter den zweiten Faktor (U09) - PressReleasePolicy/CompanyPolicy::before() bejahen nur aktive Super-Admins (7.2) - API-Update prüft bei Portalwechsel die bestehende Kategorie gegen das neue Portal (U10) - Aggregation: Zeitbudget 480 s unter dem Lock von 600 s, Marke nur unter Zeilensperre vom erwarteten Stand aus, sonst Fehler-Exit (U13) - Newsletter-Bereinigungsmigration behält je Paar die sent-Zeile (U08) - E-Mail-Wechsel stößt den Rechte-Sync sofort an; company-memberships:audit --classify zeigt vorher die Kandidaten und begrenzt mit --before (7.1) - Detailseite wählt bei Slug-Kollision wie der Melde-Resolver (7.5) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
108 lines
3.2 KiB
PHP
108 lines
3.2 KiB
PHP
<?php
|
||
|
||
namespace App\Policies;
|
||
|
||
use App\Enums\PressReleaseStatus;
|
||
use App\Models\PressRelease;
|
||
use App\Models\User;
|
||
|
||
class PressReleasePolicy
|
||
{
|
||
/**
|
||
* Kurzschluss nur für AKTIVE Super-Admins (Audit 7.2): ein deaktiviertes
|
||
* Konto fällt auf die regulären Prüfungen zurück, die es ablehnen.
|
||
*/
|
||
public function before(User $user): ?bool
|
||
{
|
||
return ($user->is_super_admin && $user->is_active) ? true : null;
|
||
}
|
||
|
||
public function viewAny(User $user): bool
|
||
{
|
||
return $user->canAccessCustomer();
|
||
}
|
||
|
||
public function view(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
if ($user->canAccessAdmin()) {
|
||
return true;
|
||
}
|
||
|
||
return $this->canManage($user, $pressRelease);
|
||
}
|
||
|
||
public function create(User $user): bool
|
||
{
|
||
return $user->canAccessCustomer();
|
||
}
|
||
|
||
public function update(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
if (! $this->canManage($user, $pressRelease) && ! $user->canAccessAdmin()) {
|
||
return false;
|
||
}
|
||
|
||
return in_array(
|
||
$pressRelease->status,
|
||
[PressReleaseStatus::Draft, PressReleaseStatus::Rejected, PressReleaseStatus::Review],
|
||
true,
|
||
) || $user->canAccessAdmin();
|
||
}
|
||
|
||
public function submitForReview(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
return $this->canManage($user, $pressRelease)
|
||
&& in_array($pressRelease->status, [PressReleaseStatus::Draft, PressReleaseStatus::Rejected], true);
|
||
}
|
||
|
||
public function delete(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
if ($user->canAccessAdmin()) {
|
||
return true;
|
||
}
|
||
|
||
return $this->canManage($user, $pressRelease)
|
||
&& $pressRelease->status !== PressReleaseStatus::Published;
|
||
}
|
||
|
||
public function restore(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
return $user->canAccessAdmin();
|
||
}
|
||
|
||
public function forceDelete(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
return $user->is_super_admin === true;
|
||
}
|
||
|
||
public function publish(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
return $user->canAccessAdmin() && $user->can('press-releases:publish');
|
||
}
|
||
|
||
/**
|
||
* Veröffentlichungsnachweis darf laden, wer die PM verwalten darf (Autor
|
||
* oder Firmenmitglied) bzw. ein Admin. Ob der Nachweis bereits gekauft
|
||
* wurde, prüft der ProofPdfService separat.
|
||
*/
|
||
public function downloadProof(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
return $user->canAccessAdmin() || $this->canManage($user, $pressRelease);
|
||
}
|
||
|
||
/**
|
||
* Zugriff auf eine PM hat der Autor ODER ein Mitglied der zugeordneten
|
||
* Firma (Owner/Team-Mitglied). So sehen/bearbeiten Firmenkontakte – inkl.
|
||
* der per Magic-Link lazy angelegten Accounts – die PMs ihrer Firma.
|
||
*/
|
||
private function canManage(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
return $this->isAuthor($user, $pressRelease)
|
||
|| $user->canAccessCompany($pressRelease->company_id);
|
||
}
|
||
|
||
private function isAuthor(User $user, PressRelease $pressRelease): bool
|
||
{
|
||
return $pressRelease->user_id === $user->id;
|
||
}
|
||
}
|