CluPilotCloud/app/Mail/OperatorInvitationMail.php

73 lines
2.6 KiB
PHP

<?php
namespace App\Mail;
use App\Mail\Concerns\RidesALane;
use App\Mail\Concerns\SendsFromMailbox;
use App\Models\Operator;
use App\Services\Mail\MailCatalogue;
use App\Services\Mail\MailPurpose;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
/**
* „Sie wurden in die CluPilot-Konsole eingeladen."
*
* Diese Mail trägt AUSDRÜCKLICH kein Passwort. Vorher erzeugte die Konsole
* eines und zeigte es dem Inhaber einmal an, damit er es „sicher weitergibt" —
* für einen Zugang, der die ganze Flotte und jede Kundeninstanz verwaltet. Ein
* Passwort, das zwei Menschen kennen, gehört keinem von beiden; und was einmal
* durch einen Chat gegangen ist, steht dort für immer.
*
* Sie trägt deshalb nur zweierlei: den Link, an dem der Eingeladene sein
* eigenes Passwort vergibt, und den NAMEN dessen, der eingeladen hat. Der Name
* ist kein Beiwerk: eine Mail, die einem Menschen einen Zugang zu einer Konsole
* anbietet, ist von aussen nicht von einem Phishing-Versuch zu unterscheiden —
* ausser dadurch, dass darin steht, wen er gerade danach fragen kann.
*/
class OperatorInvitationMail extends Mailable implements ShouldQueue
{
use Queueable, RidesALane, SendsFromMailbox, SerializesModels;
public function __construct(
public Operator $operator,
public string $invitedBy,
public string $url,
public int $hours,
) {
$this->mailer(MailCatalogue::mailer('operator-invitation'));
}
/**
* Wie lange der Link in dieser Mail gilt, in Stunden.
*
* Aus der Broker-Einstellung gelesen statt danebengeschrieben: die Zahl
* steht im Text der Mail, im Hinweis unter dem Einladen-Formular und in der
* Vorschau — drei Orte mit derselben Zahl sind zwei Orte, an denen sie
* falsch wird. Die Frist selbst ist in config/auth.php begründet.
*/
public static function validHours(): int
{
return (int) round(((int) config('auth.passwords.operators.expire', 60)) / 60);
}
public function envelope(): Envelope
{
return $this->mailboxEnvelope(MailPurpose::SYSTEM, __('operator_invitation.subject'), 'operator-invitation');
}
public function content(): Content
{
return new Content(view: 'mail.operator-invitation', with: [
'name' => $this->operator->name,
'invitedBy' => $this->invitedBy,
'url' => $this->url,
'hours' => $this->hours,
]);
}
}