diff --git a/app/Http/Controllers/FileFunctions/EditItemsController.php b/app/Http/Controllers/FileFunctions/EditItemsController.php index e4ceba0b..b4ffc7b2 100644 --- a/app/Http/Controllers/FileFunctions/EditItemsController.php +++ b/app/Http/Controllers/FileFunctions/EditItemsController.php @@ -188,8 +188,7 @@ class EditItemsController extends Controller return Demo::response_204(); } - foreach ($request->input('data') as $file) { - $unique_id = $file['unique_id']; + foreach ($request->input('items') as $file) { // Check permission to delete item for authenticated editor if ($request->user()->tokenCan('editor')) { @@ -204,18 +203,18 @@ class EditItemsController extends Controller $shared = get_shared($request->cookie('shared_token')); // Get file|folder item - $item = get_item($file['type'], $unique_id, Auth::id()); + $item = get_item($file['type'], $file['id']); // Check access to requested directory 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); + Editor::delete_item($file, $file['id']); } return response(null, 204); diff --git a/app/Http/Tools/Editor.php b/app/Http/Tools/Editor.php index 86bc2d50..1670a3cb 100644 --- a/app/Http/Tools/Editor.php +++ b/app/Http/Tools/Editor.php @@ -12,6 +12,7 @@ use App\Models\Zip; use Aws\Exception\MultipartUploadException; use Aws\S3\MultipartUploader; use Carbon\Carbon; +use DB; use Illuminate\Support\Arr; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\File; @@ -269,30 +270,24 @@ class Editor /** * Delete file or folder * - * @param $request - * @param $unique_id + * @param $item + * @param $id * @param null $shared * @throws \Exception */ - public static function delete_item($file, $unique_id, $shared = null) + public static function delete_item($item, $id, $shared = null) { - // Get user id - $user = is_null($shared) ? Auth::user() : User::findOrFail($shared->user_id); - // Delete folder - if ($file['type'] === 'folder') { + if ($item['type'] === 'folder') { // Get folder $folder = Folder::withTrashed() - ->with(['folders']) - ->where('user_id', $user->id) - ->where('unique_id', $unique_id) - ->first(); + ->with('folders') + ->find($id); // Get folder shared record - $shared = Share::where('user_id', $user->id) - ->where('type', '=', 'folder') - ->where('item_id', $unique_id) + $shared = Share::where('type', 'folder') + ->where('item_id', $id) ->first(); // Delete folder shared record @@ -300,8 +295,20 @@ class Editor $shared->delete(); } + // Soft delete items + if (! $item['force_delete']) { + + // Remove folder from user favourites + DB::table('favourite_folder') + ->where('folder_id', $folder->id) + ->delete(); + + // Soft delete folder record + $folder->delete(); + } + // Force delete children files - if ($file['force_delete']) { + if ($item['force_delete']) { // Get children folder ids $child_folders = filter_folders_ids($folder->trashed_folders, 'unique_id'); @@ -328,20 +335,10 @@ class Editor // Delete folder record $folder->forceDelete(); } - - // Soft delete items - if (!$file['force_delete']) { - - // Remove folder from user favourites - $user->favourite_folders()->detach($unique_id); - - // Soft delete folder record - $folder->delete(); - } } // Delete item - if ($file['type'] !== 'folder') { + if ($item['type'] !== 'folder') { // Get file $item = File::withTrashed() diff --git a/routes/api.php b/routes/api.php index 6cc6bc59..51d396d9 100644 --- a/routes/api.php +++ b/routes/api.php @@ -93,7 +93,7 @@ Route::group(['middleware' => ['auth:sanctum']], function () { // Edit items Route::patch('/rename/{id}', [EditItemsController::class, 'user_rename_item']); Route::post('/create-folder', [EditItemsController::class, 'user_create_folder']); - Route::post('/remove-item', [EditItemsController::class, 'user_delete_item']); + 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']); diff --git a/tests/Feature/FolderTest.php b/tests/Feature/FolderTest.php index aeff871f..158ab325 100644 --- a/tests/Feature/FolderTest.php +++ b/tests/Feature/FolderTest.php @@ -174,7 +174,6 @@ class FolderTest extends TestCase $this->assertEquals( $root->id, Folder::find($children->id)->parent_id ); - } /** @@ -202,19 +201,55 @@ class FolderTest extends TestCase ]); } - public function it_zip_and_download_folder_with_content_within() + /** + * @test + */ + public function it_delete_multiple_folder_softly() { + $user = User::factory(User::class) + ->create(); - } + $folder_1 = Folder::factory(Folder::class) + ->create(); - public function it_delete_single_folder() - { + $folder_2 = Folder::factory(Folder::class) + ->create(); - } + $user->favourite_folders()->attach($folder_1->id); + $user->favourite_folders()->attach($folder_2->id); - public function it_delete_multiple_folder() - { + Sanctum::actingAs($user); + $this->postJson("/api/remove", [ + 'items' => [ + [ + 'id' => $folder_1->id, + 'type' => 'folder', + 'force_delete' => false, + ], + [ + 'id' => $folder_2->id, + 'type' => 'folder', + 'force_delete' => false, + ], + ], + ])->assertStatus(204); + + $this->assertSoftDeleted('folders', [ + 'id' => $folder_1->id, + ]); + + $this->assertSoftDeleted('folders', [ + 'id' => $folder_2->id, + ]); + + $this->assertDatabaseMissing('favourite_folder', [ + 'folder_id' => $folder_1->id, + ]); + + $this->assertDatabaseMissing('favourite_folder', [ + 'folder_id' => $folder_2->id, + ]); } public function it_delete_folder_softly() @@ -236,4 +271,9 @@ class FolderTest extends TestCase { } + + public function it_zip_and_download_folder_with_content_within() + { + + } }