From d307a2095b4b419123366239c2733ebbce4dc329 Mon Sep 17 00:00:00 2001 From: Awhikax Date: Thu, 31 Jul 2025 23:47:15 +0200 Subject: [PATCH] Allow for backups to be renamed (#1546) --- .../Server/Resources/BackupResource.php | 31 +++++++++++++++++++ .../Api/Client/Servers/BackupController.php | 30 ++++++++++++++++++ .../Servers/Backups/RenameBackupRequest.php | 21 +++++++++++++ lang/en/activity.php | 1 + routes/api-client.php | 1 + 5 files changed, 84 insertions(+) create mode 100644 app/Http/Requests/Api/Client/Servers/Backups/RenameBackupRequest.php diff --git a/app/Filament/Server/Resources/BackupResource.php b/app/Filament/Server/Resources/BackupResource.php index 211cb0154..08f0eef1d 100644 --- a/app/Filament/Server/Resources/BackupResource.php +++ b/app/Filament/Server/Resources/BackupResource.php @@ -116,6 +116,37 @@ class BackupResource extends Resource ]) ->actions([ ActionGroup::make([ + Action::make('rename') + ->icon('tabler-pencil') + ->authorize(fn () => auth()->user()->can(Permission::ACTION_BACKUP_DELETE, $server)) + ->label('Rename') + ->form([ + TextInput::make('name') + ->label('Backup Name') + ->required() + ->maxLength(255) + ->default(fn (Backup $backup) => $backup->name), + ]) + ->action(function (Backup $backup, $data) { + $oldName = $backup->name; + $newName = $data['name']; + + $backup->update(['name' => $newName]); + + if ($oldName !== $newName) { + Activity::event('server:backup.rename') + ->subject($backup) + ->property(['old_name' => $oldName, 'new_name' => $newName]) + ->log(); + } + + Notification::make() + ->title('Backup Renamed') + ->body('The backup has been successfully renamed.') + ->success() + ->send(); + }) + ->visible(fn (Backup $backup) => $backup->status === BackupStatus::Successful), Action::make('lock') ->icon(fn (Backup $backup) => !$backup->is_locked ? 'tabler-lock' : 'tabler-lock-open') ->authorize(fn () => auth()->user()->can(Permission::ACTION_BACKUP_DELETE, $server)) diff --git a/app/Http/Controllers/Api/Client/Servers/BackupController.php b/app/Http/Controllers/Api/Client/Servers/BackupController.php index df908c74f..ab706bf45 100644 --- a/app/Http/Controllers/Api/Client/Servers/BackupController.php +++ b/app/Http/Controllers/Api/Client/Servers/BackupController.php @@ -19,6 +19,7 @@ use App\Http\Controllers\Api\Client\ClientApiController; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use App\Http\Requests\Api\Client\Servers\Backups\StoreBackupRequest; use App\Http\Requests\Api\Client\Servers\Backups\RestoreBackupRequest; +use App\Http\Requests\Api\Client\Servers\Backups\RenameBackupRequest; use Dedoc\Scramble\Attributes\Group; #[Group('Server - Backup')] @@ -195,6 +196,35 @@ class BackupController extends ClientApiController ]); } + /** + * Rename backup + * + * Updates the name of a backup for a server instance. + * + * @return array + * + * @throws \Throwable + * @throws \Illuminate\Auth\Access\AuthorizationException + */ + public function rename(RenameBackupRequest $request, Server $server, Backup $backup): array + { + $oldName = $backup->name; + $newName = $request->input('name'); + + $backup->update(['name' => $newName]); + + if ($oldName !== $newName) { + Activity::event('server:backup.rename') + ->subject($backup) + ->property(['old_name' => $oldName, 'new_name' => $newName]) + ->log(); + } + + return $this->fractal->item($backup) + ->transformWith($this->getTransformer(BackupTransformer::class)) + ->toArray(); + } + /** * Restore backup * diff --git a/app/Http/Requests/Api/Client/Servers/Backups/RenameBackupRequest.php b/app/Http/Requests/Api/Client/Servers/Backups/RenameBackupRequest.php new file mode 100644 index 000000000..5978c5ed2 --- /dev/null +++ b/app/Http/Requests/Api/Client/Servers/Backups/RenameBackupRequest.php @@ -0,0 +1,21 @@ + 'required|string|max:255', + ]; + } +} diff --git a/lang/en/activity.php b/lang/en/activity.php index 9518ac970..a6f743dce 100644 --- a/lang/en/activity.php +++ b/lang/en/activity.php @@ -58,6 +58,7 @@ return [ 'fail' => 'Marked the :name backup as failed', 'lock' => 'Locked the :name backup', 'unlock' => 'Unlocked the :name backup', + 'rename' => 'Renamed backup from ":old_name" to ":new_name"', ], 'database' => [ 'create' => 'Created new database :name', diff --git a/routes/api-client.php b/routes/api-client.php index c5ab1d3ba..f2e195ae1 100644 --- a/routes/api-client.php +++ b/routes/api-client.php @@ -117,6 +117,7 @@ Route::prefix('/servers/{server:uuid}')->middleware([ServerSubject::class, Authe Route::post('/', [Client\Servers\BackupController::class, 'store']); Route::get('/{backup:uuid}', [Client\Servers\BackupController::class, 'view']); Route::get('/{backup:uuid}/download', [Client\Servers\BackupController::class, 'download']); + Route::put('/{backup:uuid}/rename', [Client\Servers\BackupController::class, 'rename']); Route::post('/{backup:uuid}/lock', [Client\Servers\BackupController::class, 'toggleLock']); Route::post('/{backup:uuid}/restore', [Client\Servers\BackupController::class, 'restore']); Route::delete('/{backup:uuid}', [Client\Servers\BackupController::class, 'delete']);