diff --git a/app/Http/Controllers/FileFunctions/EditItemsController.php b/app/Http/Controllers/FileFunctions/EditItemsController.php index dcb82d1c..7457a45c 100644 --- a/app/Http/Controllers/FileFunctions/EditItemsController.php +++ b/app/Http/Controllers/FileFunctions/EditItemsController.php @@ -333,7 +333,7 @@ class EditItemsController extends Controller * @param $id * @return string */ - public function user_zip_folder(Request $request,$id) + public function user_zip_folder(Request $request, $id) { // Get user id $user_id = Auth::id(); @@ -365,7 +365,7 @@ class EditItemsController extends Controller return response([ 'url' => route('zip', $zip->id), 'name' => $zip->basename, - ], 200); + ], 201); } /** diff --git a/app/Http/Tools/Editor.php b/app/Http/Tools/Editor.php index bd945a9b..25c39a4d 100644 --- a/app/Http/Tools/Editor.php +++ b/app/Http/Tools/Editor.php @@ -66,16 +66,16 @@ class Editor /** * Zip requested folder * - * @param $unique_id + * @param $id * @param $shared * @return mixed * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException */ - public static function zip_folder($unique_id, $shared = null) + public static function zip_folder($id, $shared = null) { // Get folder $requested_folder = Folder::with(['folders.files', 'files']) - ->where('unique_id', $unique_id) + ->where('id', $id) ->where('user_id', Auth::id() ?? $shared->user_id) ->with('folders') ->first(); @@ -85,31 +85,34 @@ class Editor // Local storage instance $disk_local = Storage::disk('local'); - // Move file to local storage + // 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) . '-' . Str::slug($requested_folder->name) . '.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_folder = is_storage_driver('local') ? 'file-manager' : 'temp'; + $directory = is_storage_driver('local') ? 'files' : 'temp'; // Add files to zip foreach ($files as $file) { - $zip->folder($file['folder_path'])->addString($file['name'], File::get(storage_path() . '/app/' . $files_folder . '/' . $file['basename'])); + $zip + ->folder($file['folder_path']) + ->addString( + $file['name'], + File::get($disk_local->path("/$directory/$requested_folder->user_id/{$file['basename']}")) + ); } // Close zip @@ -224,18 +227,18 @@ class Editor * Rename item name * * @param RenameItemRequest $request - * @param $unique_id + * @param $id * @param null $shared * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model * @throws \Exception */ - public static function rename_item($request, $unique_id, $shared = null) + public static function rename_item($request, $id, $shared = null) { // Get user id $user_id = is_null($shared) ? Auth::id() : $shared->user_id; // Get item - $item = get_item($request->type, $unique_id, $user_id); + $item = get_item($request->type, $id, $user_id); // Rename item $item->update([ @@ -280,7 +283,7 @@ class Editor ->delete(); // Soft delete items - if (! $item['force_delete']) { + if (!$item['force_delete']) { // Soft delete folder record $folder->delete(); diff --git a/routes/api.php b/routes/api.php index 4c69f72a..9108fcb0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -94,11 +94,14 @@ Route::group(['middleware' => ['auth:sanctum']], function () { Route::patch('/rename/{id}', [EditItemsController::class, 'user_rename_item']); Route::post('/create-folder', [EditItemsController::class, 'user_create_folder']); Route::post('/remove', [EditItemsController::class, 'user_delete_item']); - Route::post('/zip', [EditItemsController::class, 'user_zip_multiple_files']); - Route::get('/zip-folder/{unique_id}', [EditItemsController::class, 'user_zip_folder']); Route::post('/upload', [EditItemsController::class, 'user_upload']); Route::post('/move', [EditItemsController::class, 'user_move']); + Route::group(['prefix' => 'zip'], function () { + Route::post('/files', [EditItemsController::class, 'user_zip_multiple_files']); + Route::get('/folder/{unique_id}', [EditItemsController::class, 'user_zip_folder']); + }); + //Get Emojis List Route::get('/emojis-list', [AppFunctionsController::class, 'get_emojis_list']); }); diff --git a/tests/Feature/FileTest.php b/tests/Feature/FileTest.php index edb5e177..de766b99 100644 --- a/tests/Feature/FileTest.php +++ b/tests/Feature/FileTest.php @@ -257,14 +257,11 @@ class FileTest extends TestCase ])->assertStatus(204); $file_ids - ->each(function ($id) { + ->each(function ($id, $index) use ($user) { + $this->assertDatabaseMissing('files', [ 'id' => $id, ]); - }); - - collect([0, 1]) - ->each(function ($index) use ($user) { Storage::disk('local') ->assertMissing( @@ -302,7 +299,7 @@ class FileTest extends TestCase $file_ids = File::all()->pluck('id'); - $this->postJson("/api/zip", [ + $this->postJson("/api/zip/files", [ 'items' => $file_ids, ])->assertStatus(201); diff --git a/tests/Feature/FolderTest.php b/tests/Feature/FolderTest.php index 3633c3fa..99722f6a 100644 --- a/tests/Feature/FolderTest.php +++ b/tests/Feature/FolderTest.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; @@ -456,8 +457,48 @@ class FolderTest extends TestCase }); } - public function it_zip_and_download_folder_with_content_within() + /** + * @test + */ + public function it_zip_folder_with_content_within_and_download() { + Storage::fake('local'); + $this->setup->create_directories(); + + $user = User::factory(User::class) + ->create(); + + Sanctum::actingAs($user); + + $folder = Folder::factory(Folder::class) + ->create([ + 'user_id' => $user->id + ]); + + collect([0, 1]) + ->each(function ($index) use ($folder) { + + $file = UploadedFile::fake() + ->create("fake-file-$index.pdf", 1200, 'application/pdf'); + + $this->postJson('/api/upload', [ + 'file' => $file, + 'folder_id' => $folder->id, + 'is_last' => true, + ])->assertStatus(201); + }); + + $this->getJson("/api/zip/folder/$folder->id") + ->assertStatus(201); + + $this->assertDatabaseHas('zips', [ + 'user_id' => $user->id + ]); + + Storage::disk('local') + ->assertExists( + 'zip/' . Zip::first()->basename + ); } }