53 lines
1.7 KiB
PHP
53 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace Modules\Core\Auth\Mail;
|
|
|
|
use Illuminate\Mail\Mailable;
|
|
use Illuminate\Mail\Mailables\Content;
|
|
use Illuminate\Mail\Mailables\Envelope;
|
|
|
|
/**
|
|
* The one OTP email template for every use of Auth\Services\OtpService —
|
|
* not just admin login. A code confirming a destructive Artisan command
|
|
* (e.g. Command\WipeCatalogCommand) reuses the exact same generation/
|
|
* validation mechanism as login, but "Your login code" as the subject
|
|
* would be actively misleading for that — the recipient never initiated a
|
|
* login. $purpose is a small, fixed set of known keys (see
|
|
* COPY_BY_PURPOSE), not free text — a typo'd/unknown purpose falls back
|
|
* to 'login' rather than rendering a blank subject/intro.
|
|
*/
|
|
class OtpMail extends Mailable
|
|
{
|
|
private const COPY_BY_PURPOSE = [
|
|
'login' => [
|
|
'subject' => 'Your login code',
|
|
'intro' => 'Your login code is:',
|
|
],
|
|
'wipe-catalog' => [
|
|
'subject' => 'Confirm: Wipe Catalog',
|
|
'intro' => 'Someone requested to permanently delete every product in the catalog. If this was you, enter this code to confirm:',
|
|
],
|
|
];
|
|
|
|
public function __construct(
|
|
public readonly string $name,
|
|
public readonly string $code,
|
|
public readonly string $purpose = 'login',
|
|
) {}
|
|
|
|
public function envelope(): Envelope
|
|
{
|
|
return new Envelope(subject: $this->copy()['subject']);
|
|
}
|
|
|
|
public function content(): Content
|
|
{
|
|
return new Content(view: 'core::auth.mail.otp', with: ['intro' => $this->copy()['intro']]);
|
|
}
|
|
|
|
private function copy(): array
|
|
{
|
|
return self::COPY_BY_PURPOSE[$this->purpose] ?? self::COPY_BY_PURPOSE['login'];
|
|
}
|
|
}
|