From 7a237ec7d78e36162c460f20a72583f5fdd1c476 Mon Sep 17 00:00:00 2001 From: Quentin Gabriele Date: Wed, 20 Aug 2025 21:29:03 +0200 Subject: [PATCH] simplify cand add unique constraint on conversions --- .../create_media_conversions_table.php.stub | 4 +- src/Models/Media.php | 61 +++++-------------- src/Models/MediaConversion.php | 10 +++ 3 files changed, 28 insertions(+), 47 deletions(-) diff --git a/database/migrations/create_media_conversions_table.php.stub b/database/migrations/create_media_conversions_table.php.stub index 904b60e..8868c20 100644 --- a/database/migrations/create_media_conversions_table.php.stub +++ b/database/migrations/create_media_conversions_table.php.stub @@ -12,7 +12,7 @@ return new class extends Migration $table->id(); $table->uuid('uuid')->unique(); - $table->string('conversion_name')->index(); + $table->string('conversion_name'); $table->foreignId('media_id')->index(); @@ -37,6 +37,8 @@ return new class extends Migration $table->decimal('duration', 19, 2, true)->nullable(); $table->json('metadata')->nullable(); + + $table->unique(['conversion_name', 'media_id']); $table->timestamps(); }); diff --git a/src/Models/Media.php b/src/Models/Media.php index 56d6e07..be970a6 100644 --- a/src/Models/Media.php +++ b/src/Models/Media.php @@ -380,19 +380,12 @@ public function getChildrenConversions(string $name): EloquentCollection public function replaceConversion(MediaConversion $conversion): MediaConversion { - $existingConversion = $this->getConversion($conversion->conversion_name); - if ( - $conversion->exists || - $conversion->is($existingConversion) - ) { + if ($existingConversion?->is($conversion)) { return $conversion; } - $this->conversions()->save($conversion); - $this->conversions->push($conversion); - if ($existingConversion) { $existingConversion->delete(); $this->setRelation( @@ -401,6 +394,9 @@ public function replaceConversion(MediaConversion $conversion): MediaConversion ); } + $this->conversions()->save($conversion); + $this->conversions->push($conversion); + return $conversion; } @@ -429,42 +425,24 @@ public function addConversion( $conversionName = "{$parent->conversion_name}.{$conversionName}"; } - /** - * If the conversion already exists, we are going to overwrite it - */ - $existingConversion = $this->getConversion($conversionName); - - /** - * To delete old conversion files, we will use an untouched replicate - */ - $existingConversionReplicate = $existingConversion?->replicate(); + if ($existingConversion = $this->getConversion($conversionName)) { + $existingConversion->delete(); + $this->setRelation( + 'conversions', + $this->conversions->except([$existingConversion->id]) + ); + } /** @var class-string */ $mediaConversionModel = config()->string('media.media_conversion_model'); - $conversion = $existingConversion ?? new $mediaConversionModel; + $conversion = new $mediaConversionModel; - $conversion->conversion_name = $conversionName; $conversion->media_id = $this->id; - - // reset values - $conversion->type = null; - $conversion->name = null; - $conversion->extension = null; - $conversion->file_name = null; - $conversion->mime_type = null; - $conversion->width = null; - $conversion->height = null; - $conversion->aspect_ratio = null; - $conversion->duration = null; - $conversion->average_color = null; - $conversion->size = null; - $conversion->contents = null; - + $conversion->conversion_name = $conversionName; $conversion->state = MediaConversionState::Succeeded; - $conversion->state_set_at = now(); + $conversion->metadata = $metadata; - $conversion->created_at = now(); $conversion->fill($attributes); $conversion->storeFile( @@ -474,16 +452,7 @@ public function addConversion( disk: $disk ?? $this->disk ); - if ($existingConversionReplicate) { - if ( - $existingConversionReplicate->path !== $conversion->path || - $existingConversionReplicate->disk !== $conversion->disk - ) { - $existingConversionReplicate->deleteFile(); - } - } else { - $this->conversions->push($conversion); - } + $this->conversions->push($conversion); if ($deleteChildren) { $this->deleteChildrenConversions($conversionName); diff --git a/src/Models/MediaConversion.php b/src/Models/MediaConversion.php index 7b6b3a4..bd06a87 100644 --- a/src/Models/MediaConversion.php +++ b/src/Models/MediaConversion.php @@ -79,6 +79,16 @@ public function casts() public static function booted() { + static::creating(function (MediaConversion $conversion) { + $conversion->state_set_at ??= now(); + }); + + static::updating(function (MediaConversion $conversion) { + if ($conversion->isDirty('state_set_at')) { + $conversion->state_set_at = now(); + } + }); + static::deleting(function (MediaConversion $conversion) { $conversion->deleteFile(); });