112 lines
3.4 KiB
PHP
112 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Settings;
|
|
|
|
use App\Jobs\CreateBackupArchive;
|
|
use App\Livewire\Concerns\SegueOperazioneBackup;
|
|
use App\Services\BackupOperationState;
|
|
use Livewire\Component;
|
|
|
|
/**
|
|
* Le due zone che si usano tutti i giorni: creare il pacchetto di backup e
|
|
* ripristinarlo.
|
|
*
|
|
* Il lavoro vero sta nei job; qui si avvia e si interroga lo stato. L'avanzamento
|
|
* e le righe di log non compaiono piu' in questa sezione: finiscono nella console
|
|
* unica agganciata in fondo alla pagina, che le riceve per eventi (vedi il trait
|
|
* SegueOperazioneBackup). Qui restano solo i comandi e l'esito.
|
|
*
|
|
* L'azzeramento sta in ZonaPericolosa, che e' un componente a se' perche' deve
|
|
* comparire in fondo alla pagina, dopo tutte le altre zone: dentro questa
|
|
* sezione finiva a meta' pagina, fra il ripristino e l'import.
|
|
*/
|
|
class BackupManager extends Component
|
|
{
|
|
use SegueOperazioneBackup;
|
|
|
|
public function mount(): void
|
|
{
|
|
$this->authorize('settings.manage');
|
|
|
|
$this->agganciaOperazioneCorrente();
|
|
}
|
|
|
|
/**
|
|
* Backup e ripristino si raccontano da qui; l'azzeramento e' della zona
|
|
* pericolosa. Vedi SegueOperazioneBackup::tipiSeguiti().
|
|
*/
|
|
protected function tipiSeguiti(): array
|
|
{
|
|
return [BackupOperationState::TIPO_BACKUP, BackupOperationState::TIPO_RESTORE];
|
|
}
|
|
|
|
public function avviaBackup(): void
|
|
{
|
|
$this->authorize('settings.manage');
|
|
|
|
if (! $this->postoLibero()) {
|
|
return;
|
|
}
|
|
|
|
$this->operationId = $this->nuovaOperazione(BackupOperationState::TIPO_BACKUP);
|
|
|
|
CreateBackupArchive::dispatch($this->operationId, false);
|
|
|
|
$this->aggiorna();
|
|
|
|
$this->avvisaZonaPericolosa();
|
|
}
|
|
|
|
/**
|
|
* Aggancia un'operazione avviata fuori da Livewire: il ripristino parte da un
|
|
* upload XHR e restituisce il proprio id in JSON.
|
|
*/
|
|
public function seguiOperazione(string $operationId): void
|
|
{
|
|
$this->authorize('settings.manage');
|
|
|
|
$this->operationId = $operationId;
|
|
$this->logSpediti = 0;
|
|
$this->aggiorna();
|
|
|
|
$this->avvisaZonaPericolosa();
|
|
}
|
|
|
|
/**
|
|
* Il posto e' uno solo: la zona pericolosa deve sapere che e' occupato,
|
|
* altrimenti continuerebbe a offrire il proprio pulsante durante un backup o
|
|
* un ripristino.
|
|
*
|
|
* L'evento e' indirizzato, non gridato: senza ->to() tornerebbe anche a
|
|
* questo componente, che si riaggancerebbe a un'operazione appena
|
|
* agganciata — una richiesta in piu' a ogni avvio, per niente.
|
|
*/
|
|
private function avvisaZonaPericolosa(): void
|
|
{
|
|
$this->dispatch('operazione-avviata')->to(ZonaPericolosa::class);
|
|
}
|
|
|
|
/**
|
|
* L'azzeramento avviato dalla zona pericolosa non passa da qui, ma occupa lo
|
|
* stesso posto: senza riagganciarsi, questa sezione resterebbe convinta che
|
|
* sia libero e offrirebbe il pulsante "Crea backup" durante una
|
|
* cancellazione.
|
|
*/
|
|
#[\Livewire\Attributes\On('operazione-avviata')]
|
|
public function agganciaAltrove(): void
|
|
{
|
|
$this->agganciaOperazioneCorrente();
|
|
}
|
|
|
|
/** Vero quando l'archivio di questa operazione e' scaricabile. */
|
|
public function getArchivioProntoProperty(): bool
|
|
{
|
|
return ($this->operazione['result']['file'] ?? null) !== null;
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.settings.backup-manager');
|
|
}
|
|
}
|