From 0f42704980bce80af212df73e19d5c60c7d511be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Carodej?= Date: Tue, 3 May 2022 07:47:54 +0200 Subject: [PATCH] trash api update --- .../Trash/Controllers/DumpTrashController.php | 79 +++++++++---------- .../RestoreTrashContentController.php | 65 ++++----------- .../Requests/RestoreTrashContentRequest.php | 33 ++++++++ src/Support/errors.php | 8 ++ src/Support/helpers.php | 12 ++- tests/Domain/Trash/TrashTest.php | 8 +- 6 files changed, 111 insertions(+), 94 deletions(-) create mode 100644 src/Domain/Trash/Requests/RestoreTrashContentRequest.php diff --git a/src/Domain/Trash/Controllers/DumpTrashController.php b/src/Domain/Trash/Controllers/DumpTrashController.php index 127bfaaf..db255efc 100644 --- a/src/Domain/Trash/Controllers/DumpTrashController.php +++ b/src/Domain/Trash/Controllers/DumpTrashController.php @@ -2,57 +2,54 @@ namespace Domain\Trash\Controllers; use Domain\Files\Models\File; -use Illuminate\Http\Response; +use Illuminate\Http\JsonResponse; use Domain\Folders\Models\Folder; use App\Http\Controllers\Controller; -use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; class DumpTrashController extends Controller { - public function __invoke(): Response + public function __invoke(): JsonResponse { - abort_if( - is_demo_account(), - 204, - 'Done.' - ); + $successMessage = [ + 'type' => 'success', + 'message' => 'The trash was successfully dumped.', + ]; - $user_id = Auth::id(); - - // Get files and folders - $folders = Folder::onlyTrashed() - ->where('user_id', $user_id) - ->get(); - - $files = File::onlyTrashed() - ->where('user_id', $user_id) - ->get(); - - // Force delete folder - $folders->each->forceDelete(); - - // Force delete files - foreach ($files as $file) { - // Delete file - Storage::delete("/files/$user_id/{$file->basename}"); - - // Delete thumbnail if exist - if ($file->thumbnail) { - collect([ - config('vuefilemanager.image_sizes.later'), - config('vuefilemanager.image_sizes.immediately'), - ])->collapse() - ->each(function ($size) use ($file) { - Storage::delete("/files/$file->user_id/{$size['name']}-{$file->basename}"); - }); - } - - // Delete file permanently - $file->forceDelete(); + if (is_demo_account()) { + return response()->json($successMessage); } + // Delete folders + Folder::onlyTrashed() + ->where('user_id', auth()->id()) + ->cursor() + ->each(fn($folder) => $folder->forceDelete()); + + // Delete files + File::onlyTrashed() + ->where('user_id', auth()->id()) + ->cursor() + ->each(function ($file) { + // Delete file + Storage::delete("/files/$file->user_id/$file->basename"); + + // Delete thumbnail if exist + if ($file->thumbnail) { + collect([ + config('vuefilemanager.image_sizes.later'), + config('vuefilemanager.image_sizes.immediately'), + ])->collapse() + ->each(function ($size) use ($file) { + Storage::delete("/files/$file->user_id/{$size['name']}-$file->basename"); + }); + } + + // Delete file permanently + $file->forceDelete(); + }); + // Return response - return response('Done.', 204); + return response()->json($successMessage); } } diff --git a/src/Domain/Trash/Controllers/RestoreTrashContentController.php b/src/Domain/Trash/Controllers/RestoreTrashContentController.php index 88fc22c2..377fe373 100644 --- a/src/Domain/Trash/Controllers/RestoreTrashContentController.php +++ b/src/Domain/Trash/Controllers/RestoreTrashContentController.php @@ -1,68 +1,37 @@ 'success', + 'message' => 'The item was successfully restored.', + ]; - // TODO: zrefaktorovat validator do requestu - $validator = Validator::make($request->input('items'), [ - '*.type' => 'required|string', - '*.id' => 'string', - ]); - - // Return error - if ($validator->fails()) { - abort(400, 'Bad input'); + if (is_demo_account()) { + return response()->json($successMessage); } - // Get user id - $user_id = Auth::id(); + foreach ($request->input('items') as $item) { + $entry = get_item($item['type'], $item['id']); - foreach ($request->input('items') as $restore) { - // Get folder - if ($restore['type'] === 'folder') { - // Get folder - $item = Folder::onlyTrashed() - ->where('user_id', $user_id) - ->where('id', $restore['id']) - ->first(); - - // Restore item to home directory - if ($request->has('to_home') && $request->to_home) { - $item->parent_id = null; - $item->save(); - } - } else { - // Get item - $item = File::onlyTrashed() - ->where('user_id', $user_id) - ->where('id', $restore['id']) - ->first(); - - // Restore item to home directory - if ($request->has('to_home') && $request->to_home) { - $item->parent_id = null; - $item->save(); - } + // Restore item to home directory + if ($request->has('to_home') && $request->input('to_home')) { + $entry->update(['parent_id' => null]); } // Restore Item - $item->restore(); + $entry->restore(); } // Return response - return response('Done.', 204); + return response()->json($successMessage); } } diff --git a/src/Domain/Trash/Requests/RestoreTrashContentRequest.php b/src/Domain/Trash/Requests/RestoreTrashContentRequest.php new file mode 100644 index 00000000..67e478f5 --- /dev/null +++ b/src/Domain/Trash/Requests/RestoreTrashContentRequest.php @@ -0,0 +1,33 @@ + 'sometimes|boolean', + 'items' => 'array', + 'items.*.type' => 'required|string', + 'items.*.id' => 'required|uuid', + ]; + } +} diff --git a/src/Support/errors.php b/src/Support/errors.php index 1e9595d6..42920331 100644 --- a/src/Support/errors.php +++ b/src/Support/errors.php @@ -15,3 +15,11 @@ 'message' => 'This user action is not allowed.', ]; } + + function entryNotFoundError(): array + { + return [ + 'type' => 'error', + 'message' => "The requested entry wasn't found.", + ]; + } diff --git a/src/Support/helpers.php b/src/Support/helpers.php index 4b181d07..2acc02dc 100644 --- a/src/Support/helpers.php +++ b/src/Support/helpers.php @@ -332,7 +332,7 @@ if (! function_exists('get_item')) { /** * Get folder or file item */ - function get_item(string $type, string $id): Folder | File + function get_item(string $type, string $id): File|Folder { $model = $type === 'folder' ? 'folder' @@ -343,7 +343,15 @@ if (! function_exists('get_item')) { 'file' => 'Domain\\Files\\Models\\File', }; - return ($namespace)::find($id); + // Get item + $entry = ($namespace)::withTrashed() + ->find($id); + + if (!$entry) { + abort(response()->json(entryNotFoundError()), 404); + } + + return $entry; } } diff --git a/tests/Domain/Trash/TrashTest.php b/tests/Domain/Trash/TrashTest.php index 007d91f0..8836daa9 100644 --- a/tests/Domain/Trash/TrashTest.php +++ b/tests/Domain/Trash/TrashTest.php @@ -44,7 +44,7 @@ class TrashTest extends TestCase 'type' => 'folder', ], ], - ])->assertStatus(204); + ])->assertStatus(200); $this->assertDatabaseHas('files', [ 'deleted_at' => null, @@ -100,7 +100,7 @@ class TrashTest extends TestCase ])->assertStatus(204); $this->deleteJson('/api/trash/dump') - ->assertStatus(204); + ->assertStatus(200); $this->assertDatabaseMissing('files', [ 'id' => $file->id, @@ -112,7 +112,9 @@ class TrashTest extends TestCase $disk = Storage::disk('local'); - $thumbnail_sizes = collect(config('vuefilemanager.image_sizes'))->collapse()->all(); + $thumbnail_sizes = collect(config('vuefilemanager.image_sizes')) + ->collapse() + ->all(); $disk->assertMissing( "files/$user->id/fake-image.jpg"