trash api update

This commit is contained in:
Čarodej
2022-05-03 07:47:54 +02:00
parent 4f9fb3991c
commit 0f42704980
6 changed files with 111 additions and 94 deletions

View File

@@ -2,57 +2,54 @@
namespace Domain\Trash\Controllers; namespace Domain\Trash\Controllers;
use Domain\Files\Models\File; use Domain\Files\Models\File;
use Illuminate\Http\Response; use Illuminate\Http\JsonResponse;
use Domain\Folders\Models\Folder; use Domain\Folders\Models\Folder;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
class DumpTrashController extends Controller class DumpTrashController extends Controller
{ {
public function __invoke(): Response public function __invoke(): JsonResponse
{ {
abort_if( $successMessage = [
is_demo_account(), 'type' => 'success',
204, 'message' => 'The trash was successfully dumped.',
'Done.' ];
);
$user_id = Auth::id(); if (is_demo_account()) {
return response()->json($successMessage);
// 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();
} }
// 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
return response('Done.', 204); return response()->json($successMessage);
} }
} }

View File

@@ -1,68 +1,37 @@
<?php <?php
namespace Domain\Trash\Controllers; namespace Domain\Trash\Controllers;
use Illuminate\Http\Request; use Illuminate\Http\JsonResponse;
use Domain\Files\Models\File;
use Illuminate\Http\Response;
use Domain\Folders\Models\Folder;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth; use Domain\Trash\Requests\RestoreTrashContentRequest;
use Illuminate\Support\Facades\Validator;
class RestoreTrashContentController extends Controller class RestoreTrashContentController extends Controller
{ {
public function __invoke( public function __invoke(
Request $request RestoreTrashContentRequest $request
): Response { ): JsonResponse {
abort_if(is_demo_account(), 204, 'Done.'); $successMessage = [
'type' => 'success',
'message' => 'The item was successfully restored.',
];
// TODO: zrefaktorovat validator do requestu if (is_demo_account()) {
$validator = Validator::make($request->input('items'), [ return response()->json($successMessage);
'*.type' => 'required|string',
'*.id' => 'string',
]);
// Return error
if ($validator->fails()) {
abort(400, 'Bad input');
} }
// Get user id foreach ($request->input('items') as $item) {
$user_id = Auth::id(); $entry = get_item($item['type'], $item['id']);
foreach ($request->input('items') as $restore) { // Restore item to home directory
// Get folder if ($request->has('to_home') && $request->input('to_home')) {
if ($restore['type'] === 'folder') { $entry->update(['parent_id' => null]);
// 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 // Restore Item
$item->restore(); $entry->restore();
} }
// Return response // Return response
return response('Done.', 204); return response()->json($successMessage);
} }
} }

View File

@@ -0,0 +1,33 @@
<?php
namespace Domain\Trash\Requests;
use Illuminate\Foundation\Http\FormRequest;
class RestoreTrashContentRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'to_home' => 'sometimes|boolean',
'items' => 'array',
'items.*.type' => 'required|string',
'items.*.id' => 'required|uuid',
];
}
}

View File

@@ -15,3 +15,11 @@
'message' => 'This user action is not allowed.', 'message' => 'This user action is not allowed.',
]; ];
} }
function entryNotFoundError(): array
{
return [
'type' => 'error',
'message' => "The requested entry wasn't found.",
];
}

View File

@@ -332,7 +332,7 @@ if (! function_exists('get_item')) {
/** /**
* Get folder or file 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' $model = $type === 'folder'
? 'folder' ? 'folder'
@@ -343,7 +343,15 @@ if (! function_exists('get_item')) {
'file' => 'Domain\\Files\\Models\\File', '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;
} }
} }

View File

@@ -44,7 +44,7 @@ class TrashTest extends TestCase
'type' => 'folder', 'type' => 'folder',
], ],
], ],
])->assertStatus(204); ])->assertStatus(200);
$this->assertDatabaseHas('files', [ $this->assertDatabaseHas('files', [
'deleted_at' => null, 'deleted_at' => null,
@@ -100,7 +100,7 @@ class TrashTest extends TestCase
])->assertStatus(204); ])->assertStatus(204);
$this->deleteJson('/api/trash/dump') $this->deleteJson('/api/trash/dump')
->assertStatus(204); ->assertStatus(200);
$this->assertDatabaseMissing('files', [ $this->assertDatabaseMissing('files', [
'id' => $file->id, 'id' => $file->id,
@@ -112,7 +112,9 @@ class TrashTest extends TestCase
$disk = Storage::disk('local'); $disk = Storage::disk('local');
$thumbnail_sizes = collect(config('vuefilemanager.image_sizes'))->collapse()->all(); $thumbnail_sizes = collect(config('vuefilemanager.image_sizes'))
->collapse()
->all();
$disk->assertMissing( $disk->assertMissing(
"files/$user->id/fake-image.jpg" "files/$user->id/fake-image.jpg"