mirror of
https://github.com/vitodeploy/vito.git
synced 2025-07-05 07:52:34 +00:00
#591 - backups
This commit is contained in:
@ -8,6 +8,7 @@
|
||||
use App\Models\Backup;
|
||||
use App\Models\Server;
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
||||
@ -21,6 +22,8 @@ class ManageBackup
|
||||
*/
|
||||
public function create(Server $server, array $input): Backup
|
||||
{
|
||||
Validator::make($input, self::rules($server, $input))->validate();
|
||||
|
||||
$backup = new Backup([
|
||||
'type' => 'database',
|
||||
'server_id' => $server->id,
|
||||
@ -92,7 +95,7 @@ public static function rules(Server $server, array $input): array
|
||||
->where('status', DatabaseStatus::READY),
|
||||
],
|
||||
];
|
||||
if ($input['interval'] == 'custom') {
|
||||
if (isset($input['interval']) && $input['interval'] == 'custom') {
|
||||
$rules['custom_interval'] = [
|
||||
'required',
|
||||
];
|
||||
|
69
app/Http/Controllers/DatabaseBackupController.php
Normal file
69
app/Http/Controllers/DatabaseBackupController.php
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Actions\Database\ManageBackup;
|
||||
use App\Http\Resources\BackupFileResource;
|
||||
use App\Http\Resources\BackupResource;
|
||||
use App\Models\Backup;
|
||||
use App\Models\Server;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
use Spatie\RouteAttributes\Attributes\Delete;
|
||||
use Spatie\RouteAttributes\Attributes\Get;
|
||||
use Spatie\RouteAttributes\Attributes\Middleware;
|
||||
use Spatie\RouteAttributes\Attributes\Post;
|
||||
use Spatie\RouteAttributes\Attributes\Prefix;
|
||||
|
||||
#[Prefix('servers/{server}/database/backups')]
|
||||
#[Middleware(['auth', 'has-project'])]
|
||||
class DatabaseBackupController extends Controller
|
||||
{
|
||||
#[Get('/', name: 'database-backups')]
|
||||
public function index(Server $server): Response
|
||||
{
|
||||
$this->authorize('viewAny', [Backup::class, $server]);
|
||||
|
||||
return Inertia::render('database-backups/index', [
|
||||
'backups' => BackupResource::collection(
|
||||
$server->backups()->with('lastFile')->simplePaginate(config('web.pagination_size'))
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
#[Get('/{backup}', name: 'database-backups.show')]
|
||||
public function show(Server $server, Backup $backup): JsonResponse
|
||||
{
|
||||
$this->authorize('view', $backup);
|
||||
|
||||
return response()->json([
|
||||
'backup' => BackupResource::make($backup),
|
||||
'files' => BackupFileResource::collection($backup->files()->simplePaginate(config('web.pagination_size'))),
|
||||
]);
|
||||
}
|
||||
|
||||
#[Post('/', name: 'database-backups.store')]
|
||||
public function store(Request $request, Server $server): RedirectResponse
|
||||
{
|
||||
$this->authorize('create', [Backup::class, $server]);
|
||||
|
||||
app(ManageBackup::class)->create($server, $request->all());
|
||||
|
||||
return back()
|
||||
->with('info', 'Backup is being created...');
|
||||
}
|
||||
|
||||
#[Delete('/{backup}', name: 'database-backups.destroy')]
|
||||
public function destroy(Server $server, Backup $backup): RedirectResponse
|
||||
{
|
||||
$this->authorize('delete', $backup);
|
||||
|
||||
app(ManageBackup::class)->delete($backup);
|
||||
|
||||
return back()
|
||||
->with('warning', 'Backup is being deleted...');
|
||||
}
|
||||
}
|
@ -11,6 +11,7 @@
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\ResourceCollection;
|
||||
use Inertia\Inertia;
|
||||
use Inertia\Response;
|
||||
use Spatie\RouteAttributes\Attributes\Delete;
|
||||
@ -34,6 +35,14 @@ public function index(Server $server): Response
|
||||
]);
|
||||
}
|
||||
|
||||
#[Get('/json', name: 'databases.json')]
|
||||
public function json(Server $server): ResourceCollection
|
||||
{
|
||||
$this->authorize('viewAny', [Database::class, $server]);
|
||||
|
||||
return DatabaseResource::collection($server->databases()->get());
|
||||
}
|
||||
|
||||
#[Get('/charsets', name: 'databases.charsets')]
|
||||
public function charsets(Server $server): JsonResponse
|
||||
{
|
||||
|
@ -77,6 +77,8 @@ public function share(Request $request): array
|
||||
'flash' => [
|
||||
'success' => fn () => $request->session()->get('success'),
|
||||
'error' => fn () => $request->session()->get('error'),
|
||||
'warning' => fn () => $request->session()->get('warning'),
|
||||
'info' => fn () => $request->session()->get('info'),
|
||||
'data' => fn () => $request->session()->get('data'),
|
||||
],
|
||||
];
|
||||
|
31
app/Http/Resources/BackupFileResource.php
Normal file
31
app/Http/Resources/BackupFileResource.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use App\Models\Backup;
|
||||
use App\Models\BackupFile;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
/** @mixin BackupFile */
|
||||
class BackupFileResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'backup_id' => $this->backup_id,
|
||||
'name' => $this->name,
|
||||
'size' => $this->size,
|
||||
'restored_to' => $this->restored_to,
|
||||
'restored_at' => $this->restored_at,
|
||||
'status' => $this->status,
|
||||
'status_color' => Backup::$statusColors[$this->status] ?? 'outline',
|
||||
'created_at' => $this->created_at,
|
||||
'updated_at' => $this->updated_at,
|
||||
];
|
||||
}
|
||||
}
|
35
app/Http/Resources/BackupResource.php
Normal file
35
app/Http/Resources/BackupResource.php
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use App\Models\Backup;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
/** @mixin Backup */
|
||||
class BackupResource extends JsonResource
|
||||
{
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function toArray(Request $request): array
|
||||
{
|
||||
return [
|
||||
'id' => $this->id,
|
||||
'server_id' => $this->server_id,
|
||||
'storage_id' => $this->storage_id,
|
||||
'storage' => StorageProviderResource::make($this->storage),
|
||||
'database_id' => $this->database_id,
|
||||
'database' => DatabaseResource::make($this->database),
|
||||
'type' => $this->type,
|
||||
'keep_backups' => $this->keep_backups,
|
||||
'interval' => $this->interval,
|
||||
'files_count' => $this->files_count,
|
||||
'status' => $this->status,
|
||||
'last_file' => BackupFileResource::make($this->whenLoaded('lastFile')),
|
||||
'status_color' => Backup::$statusColors[$this->status] ?? 'outline',
|
||||
'created_at' => $this->created_at,
|
||||
'updated_at' => $this->updated_at,
|
||||
];
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user