diff --git a/app/Domains/Attachable/Models/Attachment.php b/app/Domains/Attachable/Models/Attachment.php index f6592e0..ec19376 100644 --- a/app/Domains/Attachable/Models/Attachment.php +++ b/app/Domains/Attachable/Models/Attachment.php @@ -12,6 +12,7 @@ use Illuminate\Support\Str; #[Fillable([ 'attachable_type', 'attachable_id', + 'key', 'path', 'filename', 'type', @@ -28,7 +29,9 @@ class Attachment extends Model protected static function booted(): void { static::creating(function (self $attachment): void { - $attachment->key = (string) Str::uuid(); + if (! $attachment->key) { + $attachment->key = (string) Str::uuid(); + } }); } diff --git a/app/Domains/Attachable/Services/AttachmentService.php b/app/Domains/Attachable/Services/AttachmentService.php index f1186aa..62b5651 100644 --- a/app/Domains/Attachable/Services/AttachmentService.php +++ b/app/Domains/Attachable/Services/AttachmentService.php @@ -8,6 +8,7 @@ use App\Domains\Attachable\Models\Attachment; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; use Throwable; class AttachmentService @@ -32,10 +33,11 @@ class AttachmentService throw new AttachmentStorageException('The attachment filename cannot be empty.'); } + $key = (string) Str::uuid(); $storedPath = Storage::disk('s3')->putFileAs( $this->directoryFromPath($normalizedPath), $file, - $filename, + $key, ); if (! is_string($storedPath) || $storedPath === '') { @@ -45,6 +47,7 @@ class AttachmentService try { /** @var Attachment $attachment */ $attachment = $attachable->attachments()->create([ + 'key' => $key, 'path' => $storedPath, 'filename' => $filename, 'type' => $type, diff --git a/tests/Feature/Attachable/AttachmentTest.php b/tests/Feature/Attachable/AttachmentTest.php index 0483677..c32c934 100644 --- a/tests/Feature/Attachable/AttachmentTest.php +++ b/tests/Feature/Attachable/AttachmentTest.php @@ -10,6 +10,7 @@ use App\Domains\Tenant\Models\Tenant; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Str; use Mockery; use Tests\TestCase; @@ -37,12 +38,16 @@ class AttachmentTest extends TestCase ); $this->assertSame(AttachmentType::Image, $attachment->type); - Storage::disk('s3')->assertExists('attachments/acme/logo.png'); + $this->assertTrue(Str::isUuid($attachment->key)); + $this->assertSame('logo.png', $attachment->filename); + $this->assertSame('attachments/acme/'.$attachment->key, $attachment->path); + Storage::disk('s3')->assertExists('attachments/acme/'.$attachment->key); $this->assertDatabaseHas('attachments', [ 'id' => $attachment->id, 'attachable_type' => $tenant->getMorphClass(), 'attachable_id' => $tenant->getKey(), - 'path' => 'attachments/acme/logo.png', + 'key' => $attachment->key, + 'path' => 'attachments/acme/'.$attachment->key, 'filename' => 'logo.png', 'type' => AttachmentType::Image->value, ]); @@ -68,7 +73,7 @@ class AttachmentTest extends TestCase ->andReturn($disk); $disk->shouldReceive('putFileAs') ->once() - ->with('attachments/globex', Mockery::type(UploadedFile::class), 'manual.pdf') + ->with('attachments/globex', Mockery::type(UploadedFile::class), Mockery::on(static fn (string $value): bool => Str::isUuid($value))) ->andReturn(false); try {