<?php namespace App\Actions\Database; use App\Enums\BackupFileStatus; use App\Enums\BackupStatus; use App\Models\Backup; use App\Models\BackupFile; use App\SSH\Services\Database\Database; use Illuminate\Support\Str; class RunBackup { public function run(Backup $backup): BackupFile { $file = new BackupFile([ 'backup_id' => $backup->id, 'name' => Str::of($backup->database->name)->slug().'-'.now()->format('YmdHis'), 'status' => BackupFileStatus::CREATING, ]); $file->save(); dispatch(function () use ($file, $backup) { /** @var Database $databaseHandler */ $databaseHandler = $file->backup->server->database()->handler(); $databaseHandler->runBackup($file); $file->status = BackupFileStatus::CREATED; $file->save(); if ($backup->status !== BackupStatus::RUNNING) { $backup->status = BackupStatus::RUNNING; $backup->save(); } })->catch(function () use ($file, $backup) { $backup->status = BackupStatus::FAILED; $backup->save(); $file->status = BackupFileStatus::FAILED; $file->save(); })->onConnection('ssh'); return $file; } }