CluPilotCloud/app/Providers/MailPaceServiceProvider.php

50 lines
1.8 KiB
PHP

<?php
namespace App\Providers;
use App\Jobs\PacedMail;
use App\Services\Mail\MailLane;
use App\Support\Settings;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Mail\SendQueuedMailable;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\ServiceProvider;
/**
* Der Takt der beiden gedrosselten Spuren.
*
* Die Bindung ist die ganze Verkabelung: `Mailable::newQueuedJob()` erzeugt den
* Auftrag über den Container, also fährt ab hier jede Mail über PacedMail —
* ohne dass eine Absendestelle davon weiß.
*
* `Limit::perMinutes($minuten, $anzahl)` — Minuten zuerst. Die Reihenfolge ist
* anders herum, als man sie liest, und ein vertauschtes Paar wäre ein Takt von
* fünf Mails in dreißig Minuten statt dreißig in fünf.
*
* Die direkte Spur bekommt gar keine Drossel angemeldet, nicht bloß ein hohes
* Kontingent: dort wartet gerade ein Mensch, der eben geklickt hat.
*/
class MailPaceServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->bind(SendQueuedMailable::class, PacedMail::class);
}
public function boot(): void
{
// Die Einstellungen werden im Rückruf gelesen, nicht hier: der Rückruf
// läuft im Arbeiter je Auftrag, und eine Änderung des Betreibers wirkt
// damit ab dem nächsten Auftrag statt erst ab dem nächsten Neustart.
RateLimiter::for(MailLane::URGENT, fn () => Limit::perMinutes(
(int) Settings::get('mail.pace.urgent.minutes', 5),
(int) Settings::get('mail.pace.urgent.count', 30),
));
RateLimiter::for(MailLane::CALM, fn () => Limit::perMinutes(
(int) Settings::get('mail.pace.calm.minutes', 10),
(int) Settings::get('mail.pace.calm.count', 20),
));
}
}