From 4ab716bf9c5abcaa91c79d6d48ad470697e0d2d1 Mon Sep 17 00:00:00 2001 From: Peter Papp Date: Tue, 2 Mar 2021 16:16:11 +0100 Subject: [PATCH] added it_zip_multiple_files_and_download_it test --- .../FileFunctions/EditItemsController.php | 80 +++++++++---------- app/Http/Tools/Editor.php | 21 +++-- tests/Feature/FileTest.php | 41 +++++++++- 3 files changed, 90 insertions(+), 52 deletions(-) diff --git a/app/Http/Controllers/FileFunctions/EditItemsController.php b/app/Http/Controllers/FileFunctions/EditItemsController.php index bd0ebfeb..dcb82d1c 100644 --- a/app/Http/Controllers/FileFunctions/EditItemsController.php +++ b/app/Http/Controllers/FileFunctions/EditItemsController.php @@ -15,8 +15,8 @@ use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; use App\Http\Tools\Guardian; use App\Http\Tools\Editor; -use App\Folder; -use App\File; +use App\Models\Folder; +use App\Models\File; use Exception; @@ -109,7 +109,7 @@ class EditItemsController extends Controller // Check access to requested directory if ($request->type === 'folder') { - Guardian::check_item_access($item->unique_id, $shared); + Guardian::check_item_access($item->id, $shared); } else { Guardian::check_item_access($item->folder_id, $shared); } @@ -128,30 +128,30 @@ class EditItemsController extends Controller * Rename item for guest user with edit permission * * @param RenameItemRequest $request - * @param $unique_id + * @param $id * @param $token * @return mixed * @throws Exception */ - public function guest_rename_item(RenameItemRequest $request, $unique_id, $token) + public function guest_rename_item(RenameItemRequest $request, $id, $token) { // Get shared record $shared = get_shared($token); // Demo preview if (is_demo($shared->user_id)) { - return Demo::rename_item($request, $unique_id); + return Demo::rename_item($request, $id); } // Check shared permission if (!is_editor($shared)) abort(403); // Get file|folder item - $item = get_item($request->type, $unique_id, $shared->user_id); + $item = get_item($request->type, $id, $shared->user_id); // Check access to requested item if ($request->type === 'folder') { - Guardian::check_item_access($item->unique_id, $shared); + Guardian::check_item_access($item->id, $shared); } else { Guardian::check_item_access($item->folder_id, $shared); } @@ -159,11 +159,11 @@ class EditItemsController extends Controller // If request have a change folder icon values set the folder icon if ($request->type === 'folder' && $request->filled('icon')) { - Editor::set_folder_icon($request->icon, $unique_id, $shared); + Editor::set_folder_icon($request->icon, $id, $shared); } // Rename item - $item = Editor::rename_item($request, $unique_id, $shared); + $item = Editor::rename_item($request, $id, $shared); // Set public url if ($item->type !== 'folder') { @@ -177,7 +177,7 @@ class EditItemsController extends Controller * Delete item for authenticated master|editor user * * @param DeleteItemRequest $request - * @param $unique_id + * @param $id * @return ResponseFactory|\Illuminate\Http\Response * @throws Exception */ @@ -224,7 +224,7 @@ class EditItemsController extends Controller * Delete item for guest user with edit permission * * @param DeleteItemRequest $request - * @param $unique_id + * @param $id * @param $token * @return ResponseFactory|\Illuminate\Http\Response * @throws Exception @@ -243,20 +243,20 @@ class EditItemsController extends Controller if (!is_editor($shared)) abort(403); foreach ($request->input('data') as $file) { - $unique_id = $file['unique_id']; + $id = $file['id']; // Get file|folder item - $item = get_item($file['type'], $unique_id, $shared->user_id); + $item = get_item($file['type'], $id, $shared->user_id); // Check access to requested item if ($file['type'] === 'folder') { - Guardian::check_item_access($item->unique_id, $shared); + Guardian::check_item_access($item->id, $shared); } else { Guardian::check_item_access($item->folder_id, $shared); } // Delete item - Editor::delete_item($file, $unique_id, $shared); + Editor::delete_item($file, $id, $shared); } // Return response return response(null, 204); @@ -330,10 +330,10 @@ class EditItemsController extends Controller /** * User download folder via zip * - * @param $unique_id + * @param $id * @return string */ - public function user_zip_folder(Request $request,$unique_id) + public function user_zip_folder(Request $request,$id) { // Get user id $user_id = Auth::id(); @@ -348,18 +348,18 @@ class EditItemsController extends Controller $shared = get_shared($request->cookie('shared_token')); // Check access to requested directory - Guardian::check_item_access($unique_id, $shared); + Guardian::check_item_access($id, $shared); } // Get folder $folder = Folder::whereUserId($user_id) - ->where('unique_id', $unique_id); + ->where('id', $id); if (! $folder->exists()) { abort(404, 'Requested folder doesn\'t exists.'); } - $zip = Editor::zip_folder($unique_id); + $zip = Editor::zip_folder($id); // Get file return response([ @@ -372,28 +372,28 @@ class EditItemsController extends Controller * Guest download folder via zip * * @param Request $request - * @param $unique_id + * @param $id * @param $token * @return string */ - public function guest_zip_folder($unique_id, $token) + public function guest_zip_folder($id, $token) { // Get shared record $shared = get_shared($token); // Check access to requested folder - Guardian::check_item_access($unique_id, $shared); + Guardian::check_item_access($id, $shared); // Get folder $folder = Folder::whereUserId($shared->user_id) - ->where('unique_id', $unique_id); + ->where('id', $id); if (! $folder->exists()) { abort(404, 'Requested folder doesn\'t exists.'); } - $zip = Editor::zip_folder($unique_id, $shared); + $zip = Editor::zip_folder($id, $shared); // Get file return response([ @@ -423,7 +423,7 @@ class EditItemsController extends Controller $shared = get_shared($request->cookie('shared_token')); $file_parent_folders = File::whereUserId(Auth::id()) - ->whereIn('unique_id', $request->input('files')) + ->whereIn('id', $request->input('files')) ->get() ->pluck('folder_id') ->toArray(); @@ -434,7 +434,7 @@ class EditItemsController extends Controller // Get requested files $files = File::whereUserId(Auth::id()) - ->whereIn('unique_id', $request->input('files')) + ->whereIn('id', $request->input('items')) ->get(); $zip = Editor::zip_files($files); @@ -443,7 +443,7 @@ class EditItemsController extends Controller return response([ 'url' => route('zip', $zip->id), 'name' => $zip->basename, - ], 200); + ], 201); } /** @@ -459,7 +459,7 @@ class EditItemsController extends Controller $shared = get_shared($token); $file_parent_folders = File::whereUserId($shared->user_id) - ->whereIn('unique_id', $request->input('files')) + ->whereIn('id', $request->input('files')) ->get() ->pluck('folder_id') ->toArray(); @@ -469,7 +469,7 @@ class EditItemsController extends Controller // Get requested files $files = File::whereUserId($shared->user_id) - ->whereIn('unique_id', $request->input('files')) + ->whereIn('id', $request->input('files')) ->get(); $zip = Editor::zip_files($files, $shared); @@ -488,7 +488,7 @@ class EditItemsController extends Controller * Move item for authenticated master|editor user * * @param MoveItemRequest $request - * @param $unique_id + * @param $id * @return ResponseFactory|\Illuminate\Http\Response */ public function user_move(MoveItemRequest $request) @@ -523,7 +523,7 @@ class EditItemsController extends Controller * Move item for guest user with edit permission * * @param MoveItemRequest $request - * @param $unique_id + * @param $id * @param $token * @return ResponseFactory|\Illuminate\Http\Response */ @@ -533,7 +533,7 @@ class EditItemsController extends Controller $shared = get_shared($token); //Unique id of Folder where move - $to_unique_id = $request->input('to_unique_id'); + $to_id = $request->input('to_id'); // Demo preview if (is_demo(Auth::id())) { @@ -545,26 +545,26 @@ class EditItemsController extends Controller foreach ($request->input('items') as $item) { - $unique_id = $item['unique_id']; - $moving_unique_id = $unique_id; + $id = $item['id']; + $moving_id = $id; if ($item['type'] !== 'folder') { - $file = File::where('unique_id', $unique_id) + $file = File::where('id', $id) ->where('user_id', $shared->user_id) ->firstOrFail(); - $moving_unique_id = $file->folder_id; + $moving_id = $file->folder_id; } // Check access to requested item Guardian::check_item_access([ - $to_unique_id, $moving_unique_id + $to_id, $moving_id ], $shared); } // Move item - Editor::move($request, $to_unique_id, $shared); + Editor::move($request, $to_id, $shared); return response('Done!', 204); } diff --git a/app/Http/Tools/Editor.php b/app/Http/Tools/Editor.php index 99dd2e82..bd945a9b 100644 --- a/app/Http/Tools/Editor.php +++ b/app/Http/Tools/Editor.php @@ -146,29 +146,29 @@ class Editor // Move file to local storage from external storage service if (!is_storage_driver('local')) { - - foreach ($files as $file) { + $files->each(function ($file) use ($disk_local) { try { - $disk_local->put('temp/' . $file['basename'], Storage::get('files/' . $file['basename'])); + $disk_local->put("temp/$file->basename", Storage::get("files/$file->user_id/$file->basename")); } catch (FileNotFoundException $e) { throw new HttpException(404, 'File not found'); } - } + }); } // Get zip path $zip_name = Str::random(16) . '.zip'; - $zip_path = 'zip/' . $zip_name; // Create zip - $zip = Madzipper::make(storage_path() . '/app/' . $zip_path); + $zip = Madzipper::make($disk_local->path("zip/$zip_name")); // Get files folder on local storage drive - $files_directory = is_storage_driver('local') ? 'files' : 'temp'; + $directory = is_storage_driver('local') ? 'files' : 'temp'; // Add files to zip - $files->each(function ($file) use ($zip, $files_directory) { - $zip->addString($file['name'] . '.' . $file['mimetype'], File::get(storage_path() . '/app/' . $files_directory . '/' . $file['basename'])); + $files->each(function ($file) use ($zip, $directory, $disk_local) { + $zip->addString( + "$file->name.$file->mimetype", + File::get($disk_local->path("/$directory/$file->user_id/$file->basename"))); }); // Close zip @@ -176,9 +176,8 @@ class Editor // Delete temporary files if (!is_storage_driver('local')) { - $files->each(function ($file) use ($disk_local) { - $disk_local->delete('temp/' . $file['basename']); + $disk_local->delete("temp/$file->basename"); }); } diff --git a/tests/Feature/FileTest.php b/tests/Feature/FileTest.php index 85c61a95..edb5e177 100644 --- a/tests/Feature/FileTest.php +++ b/tests/Feature/FileTest.php @@ -5,6 +5,7 @@ namespace Tests\Feature; use App\Models\File; use App\Models\Folder; use App\Models\User; +use App\Models\Zip; use App\Services\SetupService; use Illuminate\Foundation\Testing\DatabaseMigrations; use Illuminate\Http\UploadedFile; @@ -272,8 +273,46 @@ class FileTest extends TestCase }); } - public function it_zip_and_download_multiple_files() + /** + * @test + */ + public function it_zip_multiple_files_and_download_it() { + Storage::fake('local'); + $this->setup->create_directories(); + + $user = User::factory(User::class) + ->create(); + + Sanctum::actingAs($user); + + collect([0, 1]) + ->each(function ($index) { + + $file = UploadedFile::fake() + ->create("fake-file-$index.pdf", 1200, 'application/pdf'); + + $this->postJson('/api/upload', [ + 'file' => $file, + 'folder_id' => null, + 'is_last' => true, + ])->assertStatus(201); + }); + + $file_ids = File::all()->pluck('id'); + + $this->postJson("/api/zip", [ + 'items' => $file_ids, + ])->assertStatus(201); + + $this->assertDatabaseHas('zips', [ + 'user_id' => $user->id + ]); + + Storage::disk('local') + ->assertExists( + 'zip/' . Zip::first()->basename + ); } }