diff --git a/config/vuefilemanager.php b/config/vuefilemanager.php index eab8e4b4..b484ac4e 100644 --- a/config/vuefilemanager.php +++ b/config/vuefilemanager.php @@ -30,7 +30,7 @@ return [ 'image_sizes' => [ - 'execute' => [ + 'immediately' => [ [ 'size' => 120, 'name' => 'xs', @@ -41,7 +41,7 @@ return [ ], ], - 'queue' => [ + 'later' => [ [ 'size' => 480, 'name' => 'md', diff --git a/src/App/Console/Commands/SetupDevEnvironment.php b/src/App/Console/Commands/SetupDevEnvironment.php index 14b968cf..f36926af 100644 --- a/src/App/Console/Commands/SetupDevEnvironment.php +++ b/src/App/Console/Commands/SetupDevEnvironment.php @@ -1141,8 +1141,8 @@ class SetupDevEnvironment extends Command // Generate avatar sizes collect([ - config('vuefilemanager.image_sizes.queue'), - config('vuefilemanager.image_sizes.execute'), + config('vuefilemanager.image_sizes.later'), + config('vuefilemanager.image_sizes.immediately'), ])->collapse() ->each(function ($size) use ($intervention, $file_name, $user) { // Create thumbnail only if image is larger than predefined image sizes diff --git a/src/Domain/Files/Actions/CreateImageThumbnailAcionQueue.php b/src/Domain/Files/Actions/CreateImageThumbnailAcionQueue.php deleted file mode 100644 index 4dc4d843..00000000 --- a/src/Domain/Files/Actions/CreateImageThumbnailAcionQueue.php +++ /dev/null @@ -1,50 +0,0 @@ -get("temp/$user_id/{$file_name}"); - - // Get image width - $image_width = getimagesize(storage_path("app/temp/$user_id/{$file_name}"))[0]; - - collect($thumnails_sizes) - ->each(function ($size) use ($image, $user_id, $file_name, $image_width) { - - if ($image_width > $size['size']) { - - // Create intervention image - $intervention = Image::make($image)->orientate(); - - // Generate thumbnail - $intervention->resize($size['size'], null, fn ($constraint) => $constraint->aspectRatio())->stream(); - - // Store thumbnail to disk - Storage::put("files/$user_id/{$size['name']}-{$file_name}", $intervention); - } - }); - - if($source === 'queue') { - - // Delete file after generate a thumbnail - Storage::disk('local')->delete("temp/$user_id/{$file_name}"); - } - - } -} diff --git a/src/Domain/Files/Actions/CreateImageThumbnailAction.php b/src/Domain/Files/Actions/CreateImageThumbnailAction.php deleted file mode 100644 index abfabeee..00000000 --- a/src/Domain/Files/Actions/CreateImageThumbnailAction.php +++ /dev/null @@ -1,49 +0,0 @@ -action = $action; - } - - private array $availableFormats = [ - 'image/gif', - 'image/jpeg', - 'image/jpg', - 'image/png', - 'image/webp', - ]; - - /** - * Create image thumbnail from uploaded image - */ - public function __invoke( - string $file_name, - $file, - string $user_id - ): void { - - // Create thumbnail from image - if (in_array($file->getClientMimeType(), $this->availableFormats)) { - - // Make copy of file for the thumbnail generation - Storage::disk('local')->copy("files/$user_id/{$file_name}", "temp/$user_id/{$file_name}"); - - // Create thumbnail instantly - $this->action->execute($file_name, $user_id, config('vuefilemanager.image_sizes.execute'), 'execute'); - - // Create thumbnail queue job - $this->action->onQueue()->execute($file_name, $user_id, config('vuefilemanager.image_sizes.queue'), 'queue'); - } - } -} diff --git a/src/Domain/Files/Actions/GenerateImageThumbnailAction.php b/src/Domain/Files/Actions/GenerateImageThumbnailAction.php new file mode 100644 index 00000000..4b13dcc8 --- /dev/null +++ b/src/Domain/Files/Actions/GenerateImageThumbnailAction.php @@ -0,0 +1,44 @@ +get("temp/$userId/$fileName"); + + // Get image width + $imageWidth = getimagesize($localDisk->path("temp/$userId/$fileName"))[0]; + + collect(config("vuefilemanager.image_sizes.$execution")) + ->each(function ($size) use ($image, $userId, $fileName, $imageWidth) { + + if ($imageWidth > $size['size']) { + + // Create intervention image + $intervention = Image::make($image)->orientate(); + + // Generate thumbnail + $intervention->resize($size['size'], null, fn ($constraint) => $constraint->aspectRatio())->stream(); + + // Store thumbnail to disk + Storage::put("files/$userId/{$size['name']}-$fileName", $intervention); + } + }); + + // Delete file after generate a thumbnail + if ($execution === 'later') { + Storage::disk('local')->delete("temp/$userId/$fileName"); + } + } +} diff --git a/src/Domain/Files/Actions/ProcessImageThumbnailAction.php b/src/Domain/Files/Actions/ProcessImageThumbnailAction.php new file mode 100644 index 00000000..5f1ca027 --- /dev/null +++ b/src/Domain/Files/Actions/ProcessImageThumbnailAction.php @@ -0,0 +1,52 @@ +getClientMimeType(), $this->availableFormats)) { + + // Make copy of file for the thumbnail generation + Storage::disk('local')->copy("files/$userId/{$fileName}", "temp/$userId/{$fileName}"); + + // Create thumbnail instantly + ($this->generateImageThumbnail)( + fileName: $fileName, + userId: $userId, + execution: 'immediately' + ); + + // Create thumbnail later + ($this->generateImageThumbnail)->onQueue()->execute( + fileName: $fileName, + userId: $userId, + execution: 'later' + ); + } + } +} diff --git a/src/Domain/Files/Actions/UploadFileAction.php b/src/Domain/Files/Actions/UploadFileAction.php index 112b5eda..81525943 100644 --- a/src/Domain/Files/Actions/UploadFileAction.php +++ b/src/Domain/Files/Actions/UploadFileAction.php @@ -14,9 +14,9 @@ use App\Users\Actions\CheckStorageCapacityAction; class UploadFileAction { public function __construct( - public RecordUploadAction $recordUpload, - public CheckStorageCapacityAction $checkStorageCapacity, - public CreateImageThumbnailAction $createImageThumbnail, + public RecordUploadAction $recordUpload, + public CheckStorageCapacityAction $checkStorageCapacity, + public ProcessImageThumbnailAction $createImageThumbnail, public MoveFileToExternalStorageAction $moveFileToExternalStorage, ) { } diff --git a/src/Domain/Files/Models/File.php b/src/Domain/Files/Models/File.php index 93ce2cc4..b4d870d6 100644 --- a/src/Domain/Files/Models/File.php +++ b/src/Domain/Files/Models/File.php @@ -91,7 +91,7 @@ class File extends Model public function getThumbnailAttribute(): array | null { $links = []; - $thumbnail_sizes = array_merge(config('vuefilemanager.image_sizes.execute'), config('vuefilemanager.image_sizes.queue')); + $thumbnail_sizes = collect(config('vuefilemanager.image_sizes'))->collapse()->all(); // Generate thumbnail link for external storage service if ($this->type === 'image' && ! is_storage_driver(['local'])) { diff --git a/src/Domain/Trash/Controllers/DumpTrashController.php b/src/Domain/Trash/Controllers/DumpTrashController.php index ce55ab07..1c3071b5 100644 --- a/src/Domain/Trash/Controllers/DumpTrashController.php +++ b/src/Domain/Trash/Controllers/DumpTrashController.php @@ -41,8 +41,8 @@ class DumpTrashController extends Controller if ($file->thumbnail) { collect([ - config('vuefilemanager.image_sizes.queue'), - config('vuefilemanager.image_sizes.execute'), + config('vuefilemanager.image_sizes.later'), + config('vuefilemanager.image_sizes.immediately'), ])->collapse() ->each(function ($size) use ($file) { diff --git a/src/Support/helpers.php b/src/Support/helpers.php index e959457f..bca8d0fe 100644 --- a/src/Support/helpers.php +++ b/src/Support/helpers.php @@ -606,8 +606,8 @@ if (! function_exists('get_thumbnail_file_list')) { function get_thumbnail_file_list(string $basename): Collection { return collect([ - config('vuefilemanager.image_sizes.queue'), - config('vuefilemanager.image_sizes.execute'), + config('vuefilemanager.image_sizes.later'), + config('vuefilemanager.image_sizes.immediately'), ])->collapse() ->map(fn ($item) => $item['name'] . '-' . $basename); } diff --git a/tests/Domain/Files/FileTest.php b/tests/Domain/Files/FileTest.php index 01fc9caa..62032805 100644 --- a/tests/Domain/Files/FileTest.php +++ b/tests/Domain/Files/FileTest.php @@ -54,12 +54,12 @@ class FileTest extends TestCase ); collect([ - config('vuefilemanager.image_sizes.queue'), - config('vuefilemanager.image_sizes.execute'), - ])->collapse() + config('vuefilemanager.image_sizes.later'), + config('vuefilemanager.image_sizes.immediately'), + ]) + ->collapse() ->each( - fn ($item) => - $disk->assertExists( + fn($item) => $disk->assertExists( "files/{$user->id}/{$item['name']}-{$file->basename}" ) ); diff --git a/tests/Domain/Teams/TeamManagementTest.php b/tests/Domain/Teams/TeamManagementTest.php index e7463387..b45a0f69 100644 --- a/tests/Domain/Teams/TeamManagementTest.php +++ b/tests/Domain/Teams/TeamManagementTest.php @@ -646,7 +646,7 @@ class TeamManagementTest extends TestCase // Put fake image into correct directory Storage::putFileAs("files/$member->id", $fakeFile, $fakeFile->name); - $thumbnail_sizes = collect([config('vuefilemanager.image_sizes.queue'), config('vuefilemanager.image_sizes.execute')])->collapse(); + $thumbnail_sizes = collect([config('vuefilemanager.image_sizes.later'), config('vuefilemanager.image_sizes.immediately')])->collapse(); // Create fake image thumbnails $thumbnail_sizes diff --git a/tests/Domain/Trash/TrashTest.php b/tests/Domain/Trash/TrashTest.php index 0d197d97..7d121758 100644 --- a/tests/Domain/Trash/TrashTest.php +++ b/tests/Domain/Trash/TrashTest.php @@ -109,7 +109,7 @@ class TrashTest extends TestCase $disk = Storage::disk('local'); - $thumbnail_sizes = array_merge(config('vuefilemanager.image_sizes.execute'), config('vuefilemanager.image_sizes.queue')); + $thumbnail_sizes = collect(config('vuefilemanager.image_sizes'))->collapse()->all(); $disk->assertMissing( "files/$user->id/fake-image.jpg"