controller refactoring part 18

This commit is contained in:
Peter Papp
2021-07-21 11:41:50 +02:00
parent dccf98602d
commit 76e1cd1113
5 changed files with 155 additions and 120 deletions

View File

@@ -0,0 +1,48 @@
<?php
namespace Domain\Files\Actions;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManagerStatic as Image;
class CreateImageThumbnailAction
{
/**
* Create image thumbnail from gif, jpeg, jpg, png, webp or svg
*/
public function __invoke(
string $file_path,
string $filename,
string $user_id
): string|null {
$availableFormats = ['image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'];
// Create thumbnail from image
if (in_array(Storage::disk('local')->mimeType($file_path), $availableFormats)) {
// Get thumbnail name
$thumbnail = "thumbnail-$filename";
// Create intervention image
$image = Image::make(Storage::disk('local')->path($file_path))
->orientate();
// Resize image
$image->resize(512, null, function ($constraint) {
$constraint->aspectRatio();
})->stream();
// Store thumbnail to disk
Storage::put("files/$user_id/$thumbnail", $image);
}
// Return thumbnail as svg file
if (Storage::disk('local')->mimeType($file_path) === 'image/svg+xml') {
$thumbnail = $filename;
}
return $thumbnail ?? null;
}
}

View File

@@ -0,0 +1,66 @@
<?php
namespace Domain\Files\Actions;
use Aws\Exception\MultipartUploadException;
use Aws\S3\MultipartUploader;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpKernel\Exception\HttpException;
class MoveFileToExternalStorageAction
{
/**
* Move file to external storage if is set
*/
public function __invoke(
string $file, string $user_id
): void {
$disk_local = \Storage::disk('local');
// Get file size
$filesize = $disk_local->size("files/$user_id/$file");
// If file is bigger than 5.2MB then run multipart upload
if ($filesize > 5242880) {
// Get driver
$driver = \Storage::getDriver();
// Get adapter
$adapter = $driver->getAdapter();
// Get client
$client = $adapter->getClient();
// Prepare the upload parameters.
// TODO: replace local files with temp folder
$uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . "/files/$user_id/$file", [
'bucket' => $adapter->getBucket(),
'key' => "files/$user_id/$file",
]);
try {
// Upload content
$uploader->upload();
} catch (MultipartUploadException $e) {
// Write error log
Log::error($e->getMessage());
// Delete file after error
$disk_local->delete("files/$user_id/$file");
throw new HttpException(409, $e->getMessage());
}
} else {
// Stream file object to s3
// TODO: replace local files with temp folder
Storage::putFileAs("files/$user_id", config('filesystems.disks.local.root') . "/files/$user_id/$file", $file, 'private');
}
// Delete file after upload
$disk_local->delete("files/$user_id/$file");
}
}

View File

@@ -1,8 +1,8 @@
<?php
namespace Domain\Files\Actions;
use App\Users\Actions\CheckStorageCapacityAction;
use Domain\Sharing\Models\Share;
use Support\Services\HelperService;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
@@ -13,10 +13,11 @@ use Domain\Traffic\Actions\RecordUploadAction;
class UploadFileAction
{
public function __construct(
public HelperService $helper,
public RecordUploadAction $recordUpload,
) {
}
public CheckStorageCapacityAction $checkStorageCapacity,
public CreateImageThumbnailAction $createImageThumbnail,
public MoveFileToExternalStorageAction $moveFileToExternalStorage,
) {}
/**
* Upload new file
@@ -64,17 +65,17 @@ class UploadFileAction
$file_mimetype = $disk_local->mimeType("chunks/$temp_filename");
// Check if user has enough space to upload file
$this->helper->check_user_storage_capacity($user_id, $file_size, $temp_filename);
($this->checkStorageCapacity)($user_id, $file_size, $temp_filename);
// Create thumbnail
$thumbnail = $this->helper->create_image_thumbnail("chunks/$temp_filename", $disk_file_name, $user_id);
$thumbnail = ($this->createImageThumbnail)("chunks/$temp_filename", $disk_file_name, $user_id);
// Move finished file from chunk to file-manager directory
$disk_local->move("chunks/$temp_filename", "files/$user_id/$disk_file_name");
// Move files to external storage
if (! is_storage_driver(['local'])) {
$this->helper->move_file_to_external_storage($disk_file_name, $user_id);
($this->moveFileToExternalStorage)($disk_file_name, $user_id);
}
// Store user upload size