feat: add account deletion notifications

This also sets up notifications for all site admins
This commit is contained in:
Miguel Nogueira 2022-03-07 21:14:51 +00:00
parent a265debe4c
commit b8242dbc87
5 changed files with 155 additions and 5 deletions

View File

@ -2,6 +2,8 @@
namespace App\Jobs; namespace App\Jobs;
use App\Notifications\AccountDeleted;
use App\Notifications\UserDeletedAccount;
use App\User; use App\User;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldBeUnique;
@ -10,6 +12,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Notification;
class ProcessAccountDelete implements ShouldQueue class ProcessAccountDelete implements ShouldQueue
{ {
@ -40,12 +43,20 @@ class ProcessAccountDelete implements ShouldQueue
*/ */
public function handle() public function handle()
{ {
// It shouldn't need the suspension service, because if it was dispatched, the account was already locked
Log::alert('[Worker] Processing account deletion request', [ Log::alert('[Worker] Processing account deletion request', [
'email' => $this->user->email 'email' => $this->user->email
]); ]);
$this->user->delete(); $email = $this->user->email;
$name = $this->user->name;
if ($this->user->delete()) {
Notification::route('mail', [
$email => $name
])->notify(new AccountDeleted($name));
// Notify admins
Notification::send(User::role('admin')->get(), new UserDeletedAccount($email));
}
} }
} }

View File

@ -58,7 +58,7 @@ class UserAccountDeleteConfirmation extends Mailable
*/ */
public function build() public function build()
{ {
return $this->subject('[ACTION REQUIRED] Please confirm account removal') return $this->subject(config('app.name') . ' - please confirm account removal (action required)')
->view('mail.deleted-account'); ->view('mail.deleted-account');
} }
} }

View File

@ -0,0 +1,69 @@
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class AccountDeleted extends Notification implements ShouldQueue
{
use Queueable;
public string $name;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct($name)
{
$this->name = $name;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
// Adjust to notify external user
return (new MailMessage)
->greeting('Hi ' . $this->name . ',')
->from(config('notification.sender.address'), config('notification.sender.name'))
->subject(config('app.name').' - account deleted permanently')
->line('Thank you for confirming your account deletion request. We\'re sorry to see you go!')
->line('Unless you sign up again, this is the last email you\'ll be receiving from us.')
->line('Please let us know if there\'s any feedback you\'d like to share. You can use the feedback widget located on the left-hand side of our website, or the chat widget located on the lower right corner.')
->line('See you around!')
->salutation('The team at ' . config('app.name'));
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
}

View File

@ -0,0 +1,70 @@
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class UserDeletedAccount extends Notification implements ShouldQueue
{
use Queueable;
/**
* @var string The email belonging to the user who wiped their acct.
*/
public string $deletedEmail;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct($deletedEmail)
{
$this->deletedEmail = $deletedEmail;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['mail'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->greeting('Hi ' . $notifiable->name . ',')
->from(config('notification.sender.address'), config('notification.sender.name'))
->subject(config('app.name').' - someone deleted their account')
->line("The user {$this->deletedEmail} has just deleted their account. You may wish to review the situation.")
->line('You are receiving this email because you\'re a site admin.')
->action('View current users', url(route('registeredPlayerList')))
->salutation('The team at ' . config('app.name'));
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return [
//
];
}
}

View File

@ -29,7 +29,7 @@ class UserObserver
{ {
public function __construct() public function __construct()
{ {
Log::debug('User observer has been initialised and ready for use!'); //
} }
/** /**