coolify/app/Livewire/Project/Database/ScheduledBackups.php
Andras Bacsai ac36a59088 fix(backups): pin S3 per volume execution and harden deletes
Store s3_storage_id on scheduled volume backup executions so retention
and recovery use the S3 that received the upload. Extract
DeleteScheduledVolumeBackup for UI and resource deletion, and isolate
database backup retention failures so cleanup errors do not fail the job.
2026-07-16 14:30:58 +02:00

74 lines
1.9 KiB
PHP

<?php
namespace App\Livewire\Project\Database;
use App\Models\ServiceDatabase;
use Illuminate\Contracts\View\View;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Livewire\Component;
class ScheduledBackups extends Component
{
use AuthorizesRequests;
public $database;
public $parameters;
public $type;
public string $custom_type = 'mysql';
protected $listeners = ['refreshScheduledBackups'];
public function mount(): void
{
$this->parameters = get_route_parameters();
if ($this->database->getMorphClass() === ServiceDatabase::class) {
$this->type = 'service-database';
} else {
$this->type = 'database';
}
}
public function setCustomType()
{
try {
$this->authorize('update', $this->database);
$this->database->custom_type = $this->custom_type;
$this->database->save();
$this->dispatch('success', 'Database type set.');
$this->refreshScheduledBackups();
} catch (\Throwable $e) {
handleError($e, $this);
}
}
public function delete($scheduled_backup_id): void
{
try {
$this->authorize('manageBackups', $this->database);
$backup = $this->database->scheduledBackups->find($scheduled_backup_id);
$backup->delete();
$this->dispatch('success', 'Scheduled backup deleted.');
$this->refreshScheduledBackups();
} catch (\Throwable $e) {
handleError($e, $this);
}
}
public function refreshScheduledBackups(?int $id = null): void
{
$this->database->refresh();
$this->dispatch('refreshScheduledBackups');
}
public function render(): View
{
$this->database->loadMissing('scheduledBackups.s3');
return view('livewire.project.database.scheduled-backups');
}
}