This commit is contained in:
Saeed Vaziry
2025-05-21 21:05:13 +02:00
parent fe3317692b
commit a40c2828c2
20 changed files with 568 additions and 14 deletions

View File

@ -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',
];

View 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...');
}
}

View File

@ -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
{

View File

@ -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'),
],
];

View 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,
];
}
}

View 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,
];
}
}