From ac7a537be3a03feec5c9752a7f95b17a3dcf3681 Mon Sep 17 00:00:00 2001 From: apple050620312 Date: Wed, 8 Jul 2026 20:31:40 +0800 Subject: [PATCH] feat: prevent notifications for scheduled backups --- .../Tasks/Schemas/CreateBackupSchema.php | 2 +- .../Server/BackupCompletedListener.php | 4 +++ app/Models/Backup.php | 5 ++++ .../Backups/InitiateBackupService.php | 5 ++-- ...2500_add_is_automated_to_backups_table.php | 28 +++++++++++++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 database/migrations/2026_07_08_122500_add_is_automated_to_backups_table.php diff --git a/app/Extensions/Tasks/Schemas/CreateBackupSchema.php b/app/Extensions/Tasks/Schemas/CreateBackupSchema.php index 98927ab08c..268e605e59 100644 --- a/app/Extensions/Tasks/Schemas/CreateBackupSchema.php +++ b/app/Extensions/Tasks/Schemas/CreateBackupSchema.php @@ -17,7 +17,7 @@ public function getId(): string public function runTask(Task $task): void { - $this->backupService->setIgnoredFiles(explode(PHP_EOL, $task->payload))->handle($task->server, null, true); + $this->backupService->setIgnoredFiles(explode(PHP_EOL, $task->payload))->handle($task->server, null, true, true); } public function canCreate(Schedule $schedule): bool diff --git a/app/Listeners/Server/BackupCompletedListener.php b/app/Listeners/Server/BackupCompletedListener.php index 9ed63dedd3..79668ec8dd 100644 --- a/app/Listeners/Server/BackupCompletedListener.php +++ b/app/Listeners/Server/BackupCompletedListener.php @@ -12,6 +12,10 @@ class BackupCompletedListener { public function handle(BackupCompleted $event): void { + if ($event->backup->is_automated && $event->backup->is_successful) { + return; + } + $event->backup->loadMissing('server'); $event->backup->server->loadMissing('user'); diff --git a/app/Models/Backup.php b/app/Models/Backup.php index 9687f79ab5..ad9b6a9e50 100644 --- a/app/Models/Backup.php +++ b/app/Models/Backup.php @@ -30,6 +30,7 @@ * @property bool $is_successful * @property string|null $upload_id * @property bool $is_locked + * @property bool $is_automated * @property-read Server $server * @property-read BackupStatus $status * @@ -49,6 +50,7 @@ * @method static BackupQueryBuilder|Backup whereIgnoredFiles($value) * @method static BackupQueryBuilder|Backup whereIsLocked($value) * @method static BackupQueryBuilder|Backup whereIsSuccessful($value) + * @method static BackupQueryBuilder|Backup whereIsAutomated($value) * @method static BackupQueryBuilder|Backup whereName($value) * @method static BackupQueryBuilder|Backup whereServerId($value) * @method static BackupQueryBuilder|Backup whereUpdatedAt($value) @@ -72,6 +74,7 @@ class Backup extends Model implements Validatable protected $attributes = [ 'is_successful' => false, 'is_locked' => false, + 'is_automated' => false, 'checksum' => null, 'bytes' => 0, 'upload_id' => null, @@ -85,6 +88,7 @@ class Backup extends Model implements Validatable 'uuid' => ['required', 'uuid'], 'is_successful' => ['boolean'], 'is_locked' => ['boolean'], + 'is_automated' => ['boolean'], 'name' => ['required', 'string'], 'ignored_files' => ['array'], 'disk' => ['required', 'string'], @@ -99,6 +103,7 @@ protected function casts(): array 'id' => 'int', 'is_successful' => 'bool', 'is_locked' => 'bool', + 'is_automated' => 'bool', 'ignored_files' => 'array', 'bytes' => 'int', 'completed_at' => 'immutable_datetime', diff --git a/app/Services/Backups/InitiateBackupService.php b/app/Services/Backups/InitiateBackupService.php index 67aff86463..5464260ada 100644 --- a/app/Services/Backups/InitiateBackupService.php +++ b/app/Services/Backups/InitiateBackupService.php @@ -71,7 +71,7 @@ public function setIgnoredFiles(?array $ignored): self * @throws TooManyBackupsException * @throws TooManyRequestsHttpException */ - public function handle(Server $server, ?string $name = null, bool $override = false): Backup + public function handle(Server $server, ?string $name = null, bool $override = false, bool $isAutomated = false): Backup { $limit = config('backups.throttles.limit'); $period = config('backups.throttles.period'); @@ -110,7 +110,7 @@ public function handle(Server $server, ?string $name = null, bool $override = fa $this->deleteBackupService->handle($oldest); } - return $this->connection->transaction(function () use ($server, $name) { + return $this->connection->transaction(function () use ($server, $name, $isAutomated) { /** @var Backup $backup */ $backup = Backup::query()->create([ 'server_id' => $server->id, @@ -119,6 +119,7 @@ public function handle(Server $server, ?string $name = null, bool $override = fa 'ignored_files' => array_values($this->ignoredFiles ?? []), 'disk' => $this->backupManager->getDefaultAdapter(), 'is_locked' => $this->isLocked, + 'is_automated' => $isAutomated, ]); $this->daemonBackupRepository->setServer($server) diff --git a/database/migrations/2026_07_08_122500_add_is_automated_to_backups_table.php b/database/migrations/2026_07_08_122500_add_is_automated_to_backups_table.php new file mode 100644 index 0000000000..e4d1422589 --- /dev/null +++ b/database/migrations/2026_07_08_122500_add_is_automated_to_backups_table.php @@ -0,0 +1,28 @@ +boolean('is_automated')->default(false)->after('is_successful'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('backups', function (Blueprint $table) { + $table->dropColumn('is_automated'); + }); + } +};