68 lines
2.4 KiB
PHP
68 lines
2.4 KiB
PHP
<?php
|
|
|
|
namespace App\Notifications;
|
|
|
|
use App\Mail\Concerns\SendsFromMailbox;
|
|
use App\Models\Instance;
|
|
use App\Services\Mail\MailPurpose;
|
|
use Illuminate\Bus\Queueable;
|
|
use Illuminate\Notifications\Messages\MailMessage;
|
|
use Illuminate\Notifications\Notification;
|
|
|
|
/**
|
|
* Announces that provisioning has finished. Carries NO credential.
|
|
*
|
|
* The initial admin password used to travel here in clear text — crossing
|
|
* third-party mail servers and then sitting in an inbox forever, the weakest
|
|
* link in the chain. It now lives on the instance instead
|
|
* (Instance::$admin_password, encrypted — see CompleteProvisioning) until the
|
|
* customer acknowledges it on their dashboard, at which point it is deleted
|
|
* for good. This mail only says the cloud is ready and where to find them.
|
|
*
|
|
* Sent SYNCHRONOUSLY from CompleteProvisioning (not queued): the step only
|
|
* records the `credentials_sent` breadcrumb AFTER the send returns, so a mail
|
|
* failure re-runs the step instead of losing the breadcrumb in a failed queue
|
|
* job. Delivery is at-least-once — a crash in the tiny window after send but
|
|
* before the breadcrumb can re-send a duplicate welcome email, which is
|
|
* preferable to the customer never being told their cloud is ready.
|
|
*/
|
|
class CloudReady extends Notification
|
|
{
|
|
use Queueable, SendsFromMailbox;
|
|
|
|
public function __construct(
|
|
public Instance $instance,
|
|
) {}
|
|
|
|
/** @return array<int, string> */
|
|
public function via(object $notifiable): array
|
|
{
|
|
return ['mail'];
|
|
}
|
|
|
|
public function toMail(object $notifiable): MailMessage
|
|
{
|
|
$url = 'https://'.$this->instance->subdomain.'.'.config('provisioning.dns.zone');
|
|
|
|
[$from, $replyTo] = $this->mailboxAddresses(MailPurpose::PROVISIONING);
|
|
|
|
$message = (new MailMessage)->mailer('cp_'.MailPurpose::PROVISIONING);
|
|
|
|
if ($from !== null) {
|
|
$message->from($from->address, $from->name);
|
|
}
|
|
|
|
if ($replyTo !== null) {
|
|
$message->replyTo($replyTo->address, $replyTo->name);
|
|
}
|
|
|
|
return $message
|
|
->subject(__('provisioning.mail.ready_subject'))
|
|
->greeting(__('provisioning.mail.ready_greeting'))
|
|
->line(__('provisioning.mail.ready_line'))
|
|
->line(__('provisioning.mail.ready_address', ['url' => $url]))
|
|
->line(__('provisioning.mail.ready_credentials'))
|
|
->action(__('provisioning.mail.ready_action'), route('dashboard'));
|
|
}
|
|
}
|