From eb4e947ddb4cbae509acb97e6dcd92fc94c30133 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Tue, 5 May 2026 09:00:49 +0200 Subject: [PATCH] Add "backup completed" notifications (#2313) --- app/Events/Server/BackupCompleted.php | 17 +++++++++ app/Filament/Admin/Pages/Settings.php | 10 +++++ .../Remote/Backups/BackupStatusController.php | 3 ++ .../Server/BackupCompletedListener.php | 37 +++++++++++++++++++ app/Notifications/BackupCompleted.php | 36 ++++++++++++++++++ config/panel.php | 2 + lang/en/admin/setting.php | 1 + lang/en/mail.php | 8 ++++ lang/en/notifications.php | 4 ++ 9 files changed, 118 insertions(+) create mode 100644 app/Events/Server/BackupCompleted.php create mode 100644 app/Listeners/Server/BackupCompletedListener.php create mode 100644 app/Notifications/BackupCompleted.php diff --git a/app/Events/Server/BackupCompleted.php b/app/Events/Server/BackupCompleted.php new file mode 100644 index 000000000..8d3a77b21 --- /dev/null +++ b/app/Events/Server/BackupCompleted.php @@ -0,0 +1,17 @@ +formatStateUsing(fn ($state): bool => (bool) $state) ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_SEND_REINSTALL_NOTIFICATION', (bool) $state)) ->default(env('PANEL_SEND_REINSTALL_NOTIFICATION', config('panel.email.send_reinstall_notification'))), + Toggle::make('PANEL_SEND_BACKUP_COMPLETED_NOTIFICATION') + ->label(trans('admin/setting.misc.mail_notifications.backup_completed')) + ->onIcon(TablerIcon::Check) + ->offIcon(TablerIcon::X) + ->onColor('success') + ->offColor('danger') + ->live() + ->formatStateUsing(fn ($state): bool => (bool) $state) + ->afterStateUpdated(fn ($state, Set $set) => $set('PANEL_SEND_BACKUP_COMPLETED_NOTIFICATION', (bool) $state)) + ->default(env('PANEL_SEND_BACKUP_COMPLETED_NOTIFICATION', config('panel.email.send_backup_completed_notification'))), ]), Section::make(trans('admin/setting.misc.connections.title')) ->description(trans('admin/setting.misc.connections.helper')) diff --git a/app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php b/app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php index 824ea9e3f..ce68e0b7f 100644 --- a/app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php +++ b/app/Http/Controllers/Api/Remote/Backups/BackupStatusController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Api\Remote\Backups; +use App\Events\Server\BackupCompleted; use App\Exceptions\DisplayException; use App\Exceptions\Http\HttpForbiddenException; use App\Extensions\Backups\BackupManager; @@ -79,6 +80,8 @@ class BackupStatusController extends Controller } }); + event(new BackupCompleted($model)); + return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } diff --git a/app/Listeners/Server/BackupCompletedListener.php b/app/Listeners/Server/BackupCompletedListener.php new file mode 100644 index 000000000..9ed63dedd --- /dev/null +++ b/app/Listeners/Server/BackupCompletedListener.php @@ -0,0 +1,37 @@ +backup->loadMissing('server'); + $event->backup->server->loadMissing('user'); + + $locale = $event->backup->server->user->language ?? 'en'; + + Notification::make() + ->status($event->backup->is_successful ? 'success' : 'danger') + ->title(trans('notifications.backup_' . ($event->backup->is_successful ? 'completed' : 'failed'), locale: $locale)) + ->body(trans('notifications.backup_body', ['name' => $event->backup->name, 'server' => $event->backup->server->name], $locale)) + ->actions([ + Action::make('exclude_view') + ->button() + ->label(trans('notifications.view_backups', locale: $locale)) + ->markAsRead() + ->url(fn () => ListBackups::getUrl(panel: 'server', tenant: $event->backup->server)), + ]) + ->sendToDatabase($event->backup->server->user); + + if (config()->get('panel.email.send_backup_completed_notification', true)) { + $event->backup->server->user->notify(new BackupCompletedNotification($event->backup)); + } + } +} diff --git a/app/Notifications/BackupCompleted.php b/app/Notifications/BackupCompleted.php new file mode 100644 index 000000000..322ad4692 --- /dev/null +++ b/app/Notifications/BackupCompleted.php @@ -0,0 +1,36 @@ +language ?? 'en'; + + return (new MailMessage()) + ->greeting(trans('mail.greeting', ['name' => $notifiable->username], $locale)) + ->line(trans('mail.backup_completed.body_' . ($this->backup->is_successful ? 'success' : 'failed'), locale: $locale)) + ->line(trans('mail.backup_completed.backup_name', ['name' => $this->backup->name], $locale)) + ->line(trans('mail.backup_completed.server_name', ['name' => $this->backup->server->name], $locale)) + ->action(trans('mail.backup_completed.action', locale: $locale), ListBackups::getUrl(panel: 'server', tenant: $this->backup->server)); + } +} diff --git a/config/panel.php b/config/panel.php index 86d7e3382..43ec75e2f 100644 --- a/config/panel.php +++ b/config/panel.php @@ -49,6 +49,8 @@ return [ 'send_install_notification' => env('PANEL_SEND_INSTALL_NOTIFICATION', true), // Should an email be sent to a server owner whenever their server is reinstalled? 'send_reinstall_notification' => env('PANEL_SEND_REINSTALL_NOTIFICATION', true), + // Should an email be sent to a server owner whenever a backup is completed? + 'send_backup_completed_notification' => env('PANEL_SEND_BACKUP_COMPLETED_NOTIFICATION', true), ], 'filament' => [ diff --git a/lang/en/admin/setting.php b/lang/en/admin/setting.php index a01668ced..88719e042 100644 --- a/lang/en/admin/setting.php +++ b/lang/en/admin/setting.php @@ -118,6 +118,7 @@ return [ 'helper' => 'Toggle which mail notifications should be sent to Users.', 'server_installed' => 'Server Installed', 'server_reinstalled' => 'Server Reinstalled', + 'backup_completed' => 'Backup Completed', ], 'connections' => [ 'title' => 'Connections', diff --git a/lang/en/mail.php b/lang/en/mail.php index 9097eb665..4c262b701 100644 --- a/lang/en/mail.php +++ b/lang/en/mail.php @@ -28,6 +28,14 @@ return [ 'action' => 'Login and Begin Using', ], + 'backup_completed' => [ + 'body_success' => 'The backup was created successfully.', + 'body_failed' => 'The backup creation failed.', + 'backup_name' => 'Backup Name: :name', + 'server_name' => 'Server Name: :name', + 'action' => 'View Backups', + ], + 'mail_tested' => [ 'subject' => 'Panel Test Message', 'body' => 'This is a test of the Panel mail system. You\'re good to go!', diff --git a/lang/en/notifications.php b/lang/en/notifications.php index 5005259f2..9d080c233 100644 --- a/lang/en/notifications.php +++ b/lang/en/notifications.php @@ -6,6 +6,10 @@ return [ 'installation_failed' => 'Server Installation Failed', 'reinstallation_completed' => 'Server Reinstallation Completed', 'reinstallation_failed' => 'Server Reinstallation Failed', + 'backup_completed' => 'Backup Completed', + 'backup_failed' => 'Backup Failed', + 'backup_body' => 'Backup ":name" for server ":server"', + 'view_backups' => 'View Backups', 'failed' => 'Failed', 'user_added' => [ 'title' => 'Added to Server',