From 4e680deb93d41bd298f974d128c9877747b8c9c3 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 8 Dec 2023 18:32:08 +0100 Subject: [PATCH] fix: service deletion job --- app/Actions/Service/DeleteService.php | 42 +++++++++++++++++++ app/Jobs/DeleteResourceJob.php | 12 +++--- app/Livewire/Project/Service/Navbar.php | 2 +- app/Models/Service.php | 33 ++------------- ..._12_08_162228_add_soft_delete_services.php | 28 +++++++++++++ routes/web.php | 3 +- 6 files changed, 83 insertions(+), 37 deletions(-) create mode 100644 app/Actions/Service/DeleteService.php create mode 100644 database/migrations/2023_12_08_162228_add_soft_delete_services.php diff --git a/app/Actions/Service/DeleteService.php b/app/Actions/Service/DeleteService.php new file mode 100644 index 000000000..e7cc049b1 --- /dev/null +++ b/app/Actions/Service/DeleteService.php @@ -0,0 +1,42 @@ +environment_variables()->delete(); + $commands = []; + foreach ($service->applications()->get() as $application) { + $storages = $application->persistentStorages()->get(); + foreach ($storages as $storage) { + $storagesToDelete->push($storage); + } + $application->delete(); + } + foreach ($service->databases()->get() as $database) { + $storages = $database->persistentStorages()->get(); + foreach ($storages as $storage) { + $storagesToDelete->push($storage); + } + $database->delete(); + } + foreach ($storagesToDelete as $storage) { + $commands[] = "docker volume rm -f $storage->name"; + } + $commands[] = "docker rm -f $service->uuid"; + + instant_remote_process($commands, $server, false); + + $service->forceDelete(); + } +} diff --git a/app/Jobs/DeleteResourceJob.php b/app/Jobs/DeleteResourceJob.php index 0393d9f56..f8df38a2a 100644 --- a/app/Jobs/DeleteResourceJob.php +++ b/app/Jobs/DeleteResourceJob.php @@ -4,7 +4,7 @@ namespace App\Jobs; use App\Actions\Application\StopApplication; use App\Actions\Database\StopDatabase; -use App\Actions\Service\StopService; +use App\Actions\Service\DeleteService; use App\Models\Application; use App\Models\Service; use App\Models\StandaloneMariadb; @@ -54,11 +54,13 @@ class DeleteResourceJob implements ShouldQueue, ShouldBeEncrypted case 'standalone-mariadb': StopDatabase::run($this->resource); break; - case 'service': - StopService::run($this->resource); - break; } - $this->resource->delete(); + if ($this->resource->type() === 'service') { + $this->resource->delete(); + DeleteService::dispatch($this->resource); + } else { + $this->resource->delete(); + } } catch (\Throwable $e) { send_internal_notification('ContainerStoppingJob failed with: ' . $e->getMessage()); throw $e; diff --git a/app/Livewire/Project/Service/Navbar.php b/app/Livewire/Project/Service/Navbar.php index d8d746a3e..71ec4e702 100644 --- a/app/Livewire/Project/Service/Navbar.php +++ b/app/Livewire/Project/Service/Navbar.php @@ -65,6 +65,6 @@ class Navbar extends Component } else { $this->dispatch('success', 'Service stopped successfully.'); } - event(new ServiceStatusChanged()); + ServiceStatusChanged::dispatch(); } } diff --git a/app/Models/Service.php b/app/Models/Service.php index b7fd6b07e..eb0d96670 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -2,44 +2,17 @@ namespace App\Models; +use App\Actions\Service\DeleteService; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Collection; use Illuminate\Support\Str; class Service extends BaseModel { - use HasFactory; + use HasFactory, SoftDeletes; protected $guarded = []; - - protected static function booted() - { - static::deleting(function ($service) { - $storagesToDelete = collect([]); - foreach ($service->applications()->get() as $application) { - $storages = $application->persistentStorages()->get(); - foreach ($storages as $storage) { - $storagesToDelete->push($storage); - } - } - foreach ($service->databases()->get() as $database) { - $storages = $database->persistentStorages()->get(); - foreach ($storages as $storage) { - $storagesToDelete->push($storage); - } - } - $service->environment_variables()->delete(); - $service->applications()->delete(); - $service->databases()->delete(); - - $server = data_get($service, 'server'); - if ($server && $storagesToDelete->count() > 0) { - $storagesToDelete->each(function ($storage) use ($server) { - instant_remote_process(["docker volume rm -f $storage->name"], $server, false); - }); - } - }); - } public function type() { return 'service'; diff --git a/database/migrations/2023_12_08_162228_add_soft_delete_services.php b/database/migrations/2023_12_08_162228_add_soft_delete_services.php new file mode 100644 index 000000000..c45ecf5bf --- /dev/null +++ b/database/migrations/2023_12_08_162228_add_soft_delete_services.php @@ -0,0 +1,28 @@ +softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('services', function (Blueprint $table) { + $table->dropSoftDeletes(); + }); + } +}; diff --git a/routes/web.php b/routes/web.php index 1d46c4a83..dba77238d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,5 +1,6 @@ user()?->currentTeam()->id !== 0) { return redirect('/'); } - event(new \App\Events\TestEvent('asd')); + TestEvent::dispatch('asd'); return 'Look at your other tab.'; })->middleware('auth');