*/ private const DEFAULTS = [ MaintenanceAnnouncementMail::class => self::URGENT, MaintenanceCancelledMail::class => self::URGENT, CloudSuspendedMail::class => self::URGENT, CloudResumedMail::class => self::URGENT, InvoiceMail::class => self::CALM, DunningNoticeMail::class => self::CALM, DormantAccountWarningMail::class => self::CALM, ]; /** Die Schlange, in die diese Mailklasse gehört. */ public static function for(string $mailableClass): string { if (self::isLocked($mailableClass)) { return self::DIRECT; } $stored = (array) Settings::get('mail.lanes', []); $lane = $stored[$mailableClass] ?? self::DEFAULTS[$mailableClass] ?? self::CALM; return in_array($lane, [self::DIRECT, self::URGENT, self::CALM], true) ? $lane : self::CALM; } public static function isLocked(string $mailableClass): bool { return in_array($mailableClass, self::LOCKED, true); } /** Verschiebt eine Mailklasse. Wirft, wenn sie gesperrt ist. */ public static function assign(string $mailableClass, string $lane): void { if (self::isLocked($mailableClass)) { throw new RuntimeException( "{$mailableClass} fährt immer direkt: darauf wartet gerade jemand." ); } $stored = (array) Settings::get('mail.lanes', []); $stored[$mailableClass] = $lane; Settings::set('mail.lanes', $stored); } /** * Jede bekannte Mailklasse mit ihrer Spur, für die Konsole. * * @return array */ public static function all(): array { $classes = array_merge(self::LOCKED, array_keys(self::DEFAULTS)); return collect($classes) ->mapWithKeys(fn (string $class) => [$class => self::for($class)]) ->all(); } }