added it_upload_image_file_and_create_thumbnail

This commit is contained in:
Peter Papp
2021-02-27 14:40:44 +01:00
parent f55472442f
commit fdef2de99d
5 changed files with 69 additions and 52 deletions
+6 -28
View File
@@ -1,10 +1,10 @@
<?php <?php
use App\File; use App\Models\File;
use App\Folder; use App\Models\Folder;
use App\User; use App\Models\Setting;
use App\Setting; use App\Models\User;
use App\Share; use App\Models\Share;
use ByteUnits\Metric; use ByteUnits\Metric;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
@@ -220,31 +220,9 @@ function get_shared($token)
*/ */
function is_editor($shared) function is_editor($shared)
{ {
return $shared->permission === 'editor'; return $shared->permission === 'editor';
} }
/**
* Get unique id
*
* @return int
*/
function get_unique_id(): int
{
// Get files and folders
$folders = Folder::withTrashed()->get();
$files = File::withTrashed()->get();
// Get last ids
$folders_unique = $folders->isEmpty() ? 0 : $folders->last()->unique_id;
$files_unique = $files->isEmpty() ? 0 : $files->last()->unique_id;
// Count new unique id
$unique_id = $folders_unique > $files_unique ? $folders_unique + 1 : $files_unique + 1;
return $unique_id;
}
/** /**
* Store user avatar to storage * Store user avatar to storage
* *
@@ -384,7 +362,7 @@ function get_storage_fill_percentage($used, $capacity)
*/ */
function user_storage_percentage($id, $additionals = null) function user_storage_percentage($id, $additionals = null)
{ {
$user = \App\User::findOrFail($id); $user = User::findOrFail($id);
$used = $user->used_capacity; $used = $user->used_capacity;
@@ -26,8 +26,9 @@ class UploadRequest extends FormRequest
public function rules() public function rules()
{ {
return [ return [
'parent_id' => 'required|integer', 'is_last' => 'sometimes|boolean',
'file' => ['required','file' , new MimetypeBlacklistValidation] 'folder_id' => 'uuid|nullable',
'file' => ['required', 'file', new MimetypeBlacklistValidation]
]; ];
} }
} }
+13 -21
View File
@@ -404,7 +404,7 @@ class Editor
$temp_filename = $file->getClientOriginalName(); $temp_filename = $file->getClientOriginalName();
// File Path // File Path
$file_path = config('filesystems.disks.local.root') . '/chunks/' . $temp_filename; $file_path = Storage::disk('local')->path('chunks/' . $temp_filename);
// Generate file // Generate file
File::append($file_path, $file->get()); File::append($file_path, $file->get());
@@ -424,24 +424,25 @@ class Editor
$metadata = get_image_meta_data($file); $metadata = get_image_meta_data($file);
$disk_local = Storage::disk('local'); $disk_local = Storage::disk('local');
$unique_id = get_unique_id();
// Get user data // Get user data
$user_scope = is_null($shared) ? $request->user()->token()->scopes[0] : 'editor'; //$user_scope = is_null($shared) ? $request->user()->token()->scopes[0] : 'editor';
$user_scope = is_null($shared) ? 'master' : 'editor';
$user_id = is_null($shared) ? Auth::id() : $shared->user_id; $user_id = is_null($shared) ? Auth::id() : $shared->user_id;
// File Info // File Info
$file_size = $disk_local->size('chunks/' . $temp_filename); $file_size = $disk_local->size('chunks/' . $temp_filename);
$file_mimetype = $disk_local->mimeType('chunks/' . $temp_filename); $file_mimetype = $disk_local->mimeType('chunks/' . $temp_filename);
// Check if user has enough space to upload file // Check if user has enough space to upload file
self::check_user_storage_capacity($user_id, $file_size, $temp_filename); self::check_user_storage_capacity($user_id, $file_size, $temp_filename);
// Create thumbnail // Create thumbnail
$thumbnail = self::get_image_thumbnail('chunks/' . $temp_filename, $disk_file_name); $thumbnail = self::get_image_thumbnail('chunks/' . $temp_filename, $disk_file_name, $user_id);
// Move finished file from chunk to file-manager directory // Move finished file from chunk to file-manager directory
$disk_local->move('chunks/' . $temp_filename, 'files/' . $disk_file_name); $disk_local->move('chunks/' . $temp_filename, "files/$user_id/$disk_file_name");
// Move files to external storage // Move files to external storage
if (!is_storage_driver(['local'])) { if (!is_storage_driver(['local'])) {
@@ -457,10 +458,9 @@ class Editor
$options = [ $options = [
'mimetype' => get_file_type_from_mimetype($file_mimetype), 'mimetype' => get_file_type_from_mimetype($file_mimetype),
'type' => get_file_type($file_mimetype), 'type' => get_file_type($file_mimetype),
'folder_id' => $request->parent_id, 'folder_id' => $request->folder_id,
'metadata' => $metadata, 'metadata' => $metadata,
'name' => $user_file_name, 'name' => $user_file_name,
'unique_id' => $unique_id,
'basename' => $disk_file_name, 'basename' => $disk_file_name,
'user_scope' => $user_scope, 'user_scope' => $user_scope,
'thumbnail' => $thumbnail, 'thumbnail' => $thumbnail,
@@ -469,17 +469,8 @@ class Editor
]; ];
// Store user upload size // Store user upload size
if ($request->user()) { User::find($user_id)
->record_upload($file_size);
// If upload a loged user
$request->user()->record_upload($file_size);
} else {
// If upload guest
User::find($shared->user_id)->record_upload($file_size);
}
// Return new file // Return new file
return UserFile::create($options); return UserFile::create($options);
@@ -586,10 +577,11 @@ class Editor
* *
* @param string $file_path * @param string $file_path
* @param string $filename * @param string $filename
* @param string $user_id
* @param $file * @param $file
* @return string|null * @return string|null
*/ */
private static function get_image_thumbnail(string $file_path, string $filename) private static function get_image_thumbnail(string $file_path, string $filename, string $user_id)
{ {
$local_disk = Storage::disk('local'); $local_disk = Storage::disk('local');
@@ -600,7 +592,7 @@ class Editor
$thumbnail = 'thumbnail-' . $filename; $thumbnail = 'thumbnail-' . $filename;
// Create intervention image // Create intervention image
$image = Image::make(config('filesystems.disks.local.root') . '/' . $file_path)->orientate(); $image = Image::make($local_disk->path($file_path))->orientate();
// Resize image // Resize image
$image->resize(512, null, function ($constraint) { $image->resize(512, null, function ($constraint) {
@@ -608,7 +600,7 @@ class Editor
})->stream(); })->stream();
// Store thumbnail to disk // Store thumbnail to disk
$local_disk->put('files/' . $thumbnail, $image); $local_disk->put("files/$user_id/$thumbnail", $image);
} }
// Return thumbnail as svg file // Return thumbnail as svg file
+45 -1
View File
@@ -5,14 +5,23 @@ namespace Tests\Feature;
use App\Models\File; use App\Models\File;
use App\Models\Folder; use App\Models\Folder;
use App\Models\User; use App\Models\User;
use App\Services\SetupService;
use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Http\UploadedFile;
use Laravel\Sanctum\Sanctum; use Laravel\Sanctum\Sanctum;
use Storage;
use Tests\TestCase; use Tests\TestCase;
class FileTest extends TestCase class FileTest extends TestCase
{ {
use DatabaseMigrations; use DatabaseMigrations;
public function __construct()
{
parent::__construct();
$this->setup = app()->make(SetupService::class);
}
/** /**
* @test * @test
*/ */
@@ -26,9 +35,44 @@ class FileTest extends TestCase
]); ]);
} }
public function it_upload_new_file() /**
* @test
*/
public function it_upload_image_file_and_create_thumbnail()
{ {
Storage::fake('local');
$this->setup->create_directories();
$file = UploadedFile::fake()
->image('fake-image.jpg');
$user = User::factory(User::class)
->create();
Sanctum::actingAs($user);
$this->postJson('/api/upload', [
'file' => $file,
'folder_id' => null,
'is_last' => true,
])->assertStatus(201);
Storage::disk('local')->assertMissing(
"chunks/fake-image.jpg"
);
Storage::disk('local')->assertExists(
"files/$user->id/fake-image.jpg"
);
Storage::disk('local')->assertExists(
"files/$user->id/thumbnail-fake-image.jpg"
);
$this->assertDatabaseHas('traffic', [
'user_id' => $user->id,
]);
} }
/** /**
+2
View File
@@ -22,6 +22,8 @@ class SetupServiceTest extends TestCase
*/ */
public function it_create_system_folders() public function it_create_system_folders()
{ {
Storage::fake('local');
$this->setup->create_directories(); $this->setup->create_directories();
collect(['avatars', 'chunks', 'system', 'files', 'temp', 'zip']) collect(['avatars', 'chunks', 'system', 'files', 'temp', 'zip'])