mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-18 16:22:14 +00:00
trash api update
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
33
src/Domain/Trash/Requests/RestoreTrashContentRequest.php
Normal file
33
src/Domain/Trash/Requests/RestoreTrashContentRequest.php
Normal 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',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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.",
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user