E-Mail-Praeferenzen: Opt-out je Mail-Typ + One-Click-Unsubscribe ohne Login

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Kevin Adametz 2026-07-10 17:15:05 +00:00
parent 06d80b255b
commit 51da374173
21 changed files with 746 additions and 9 deletions

View file

@ -0,0 +1,65 @@
<?php
namespace App\Enums;
/**
* Abbestellbare Benachrichtigungs-Mails (Opt-out je Typ).
*
* Umfasst bewusst nur Benachrichtigungen zum PM-Lebenszyklus — keine
* System-/Transaktionsmails (Passwort-Reset, Magic-Link, Kündigungs-/
* Widerrufsbestätigungen), die rechtlich bzw. funktional zwingend sind.
* Jeder Case entspricht genau einer Mailable-Klasse; vor dem Versand wird
* geprüft, ob der Empfänger den Typ abbestellt hat
* (User::wantsEmailNotification()).
*/
enum EmailNotificationType: string
{
case PressReleasePublished = 'press_release_published';
case PressReleaseRejected = 'press_release_rejected';
case PressReleaseDepublished = 'press_release_depublished';
public function label(): string
{
return match ($this) {
self::PressReleasePublished => 'Pressemitteilung veröffentlicht',
self::PressReleaseRejected => 'Pressemitteilung abgelehnt',
self::PressReleaseDepublished => 'Pressemitteilung depubliziert',
};
}
/**
* Beschreibung für die Präferenzen-Einstellung im Kundenbereich.
*/
public function settingsDescription(): string
{
return match ($this) {
self::PressReleasePublished => 'Benachrichtigung, sobald eine von Ihnen eingereichte Pressemitteilung geprüft und veröffentlicht wurde.',
self::PressReleaseRejected => 'Benachrichtigung, wenn eine eingereichte Pressemitteilung abgelehnt wurde — inklusive Ablehnungsgrund.',
self::PressReleaseDepublished => 'Bestätigung, wenn eine beauftragte Depublikation durchgeführt wurde.',
};
}
/**
* „Warum erhalten Sie diese E-Mail?"-Begründung im Mail-Footer.
*/
public function mailReason(): string
{
return match ($this) {
self::PressReleasePublished => 'Sie wurden als Pressekontakt hinterlegt und werden daher über die Veröffentlichung Ihrer Pressemitteilungen informiert.',
self::PressReleaseRejected => 'Sie wurden als Pressekontakt hinterlegt und werden daher über die Ablehnung Ihrer eingereichten Pressemitteilungen informiert.',
self::PressReleaseDepublished => 'Sie haben die Depublikation dieser Pressemitteilung beauftragt und erhalten daher diese Bestätigung.',
};
}
/**
* Was der Empfänger mit dem Abmelde-Link abbestellt (Mail-Footer).
*/
public function unsubscribeLabel(): string
{
return match ($this) {
self::PressReleasePublished => 'Benachrichtigungen über das Veröffentlichen Ihrer Pressemitteilungen',
self::PressReleaseRejected => 'Benachrichtigungen über die Ablehnung Ihrer Pressemitteilungen',
self::PressReleaseDepublished => 'Bestätigungen über die Depublikation Ihrer Pressemitteilungen',
};
}
}