From 6de76ca3f839b35982b51eb88013af851c4133ad Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Tue, 4 Feb 2025 15:32:56 +0100 Subject: [PATCH] fix(deletion): fix DB deletion - delete file mounts, volume mounts, envs, ssl crts, backups and detach tags correctly when deleting --- app/Jobs/DeleteResourceJob.php | 19 ++++++++++++++----- app/Models/LocalPersistentVolume.php | 5 ----- app/Models/SslCertificate.php | 14 ++++++++++++-- app/Models/StandalonePostgresql.php | 27 ++++++++++++++++----------- 4 files changed, 42 insertions(+), 23 deletions(-) diff --git a/app/Jobs/DeleteResourceJob.php b/app/Jobs/DeleteResourceJob.php index 8b9228e5f..9fd46db77 100644 --- a/app/Jobs/DeleteResourceJob.php +++ b/app/Jobs/DeleteResourceJob.php @@ -66,12 +66,9 @@ class DeleteResourceJob implements ShouldBeEncrypted, ShouldQueue } if ($this->deleteVolumes && $this->resource->type() !== 'service') { - $this->resource?->delete_volumes($persistentStorages); + $this->resource->delete_volumes($persistentStorages); + $this->resource->persistentStorages()->delete(); } - if ($this->deleteConfigurations) { - $this->resource?->delete_configurations(); - } - $isDatabase = $this->resource instanceof StandalonePostgresql || $this->resource instanceof StandaloneRedis || $this->resource instanceof StandaloneMongodb @@ -80,6 +77,18 @@ class DeleteResourceJob implements ShouldBeEncrypted, ShouldQueue || $this->resource instanceof StandaloneKeydb || $this->resource instanceof StandaloneDragonfly || $this->resource instanceof StandaloneClickhouse; + + if ($this->deleteConfigurations) { + $this->resource->delete_configurations(); // rename to FileStorages + $this->resource->fileStorages()->delete(); + } + if ($isDatabase) { + $this->resource->sslCertificates()->delete(); + $this->resource->scheduledBackups()->delete(); + $this->resource->environment_variables()->delete(); + $this->resource->tags()->detach(); + } + $server = data_get($this->resource, 'server') ?? data_get($this->resource, 'destination.server'); if (($this->dockerCleanup || $isDatabase) && $server) { CleanupDocker::dispatch($server, true); diff --git a/app/Models/LocalPersistentVolume.php b/app/Models/LocalPersistentVolume.php index 68e476365..b5dfd9663 100644 --- a/app/Models/LocalPersistentVolume.php +++ b/app/Models/LocalPersistentVolume.php @@ -24,11 +24,6 @@ class LocalPersistentVolume extends Model return $this->morphTo('resource'); } - public function standalone_postgresql() - { - return $this->morphTo('resource'); - } - protected function name(): Attribute { return Attribute::make( diff --git a/app/Models/SslCertificate.php b/app/Models/SslCertificate.php index 54a997dfb..7298afd6c 100644 --- a/app/Models/SslCertificate.php +++ b/app/Models/SslCertificate.php @@ -25,9 +25,19 @@ class SslCertificate extends Model 'valid_until' => 'datetime', ]; - public function resource() + public function application() { - return $this->morphTo(); + return $this->morphTo('resource'); + } + + public function service() + { + return $this->morphTo('resource'); + } + + public function database() + { + return $this->morphTo('resource'); } public function server() diff --git a/app/Models/StandalonePostgresql.php b/app/Models/StandalonePostgresql.php index b4b7ca59f..51b9d2c31 100644 --- a/app/Models/StandalonePostgresql.php +++ b/app/Models/StandalonePostgresql.php @@ -259,11 +259,21 @@ class StandalonePostgresql extends BaseModel return $this->belongsTo(Environment::class); } + public function persistentStorages() + { + return $this->morphMany(LocalPersistentVolume::class, 'resource'); + } + public function fileStorages() { return $this->morphMany(LocalFileVolume::class, 'resource'); } + public function sslCertificates() + { + return $this->morphMany(SslCertificate::class, 'resource'); + } + public function destination() { return $this->morphTo(); @@ -274,16 +284,17 @@ class StandalonePostgresql extends BaseModel return $this->morphMany(EnvironmentVariable::class, 'resourceable'); } - public function persistentStorages() - { - return $this->morphMany(LocalPersistentVolume::class, 'resource'); - } - public function scheduledBackups() { return $this->morphMany(ScheduledDatabaseBackup::class, 'database'); } + public function environment_variables() + { + return $this->morphMany(EnvironmentVariable::class, 'resourceable') + ->orderBy('key', 'asc'); + } + public function isBackupSolutionAvailable() { return true; @@ -332,10 +343,4 @@ class StandalonePostgresql extends BaseModel return $parsedCollection->toArray(); } - - public function environment_variables() - { - return $this->morphMany(EnvironmentVariable::class, 'resourceable') - ->orderBy('key', 'asc'); - } }