controller refactoring part 20

This commit is contained in:
Peter Papp
2021-07-21 12:22:26 +02:00
parent 3860faf851
commit 91fc7f2d9d
10 changed files with 235 additions and 191 deletions
@@ -0,0 +1,43 @@
<?php
namespace Domain\Folders\Actions;
use Domain\Folders\Models\Folder;
class UpdateFolderPropertyAction
{
/**
* Update folder icon or style
*/
public function __invoke($request, string $id): void
{
// Get folder
$folder = Folder::find($id);
// Set default folder icon
if ($request->emoji === 'default') {
$folder->update([
'emoji' => null,
'color' => null,
]);
}
// Set emoji
if ($request->filled('emoji')) {
$folder->update([
'emoji' => $request->emoji,
'color' => null,
]);
}
// Set color
if ($request->filled('color')) {
$folder->update([
'emoji' => null,
'color' => $request->color,
]);
}
}
}
@@ -0,0 +1,122 @@
<?php
namespace Domain\Items\Actions;
use DB;
use Domain\Files\Models\File as UserFile;
use Domain\Folders\Models\Folder;
use Domain\Sharing\Models\Share;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Storage;
class DeleteFileOrFolderAction
{
/**
* Delete file or folder
*/
public function __invoke(
array $item,
string $id,
?Share $shared = null
): void {
// Delete folder
if ($item['type'] === 'folder') {
// Get folder
$folder = Folder::withTrashed()
->with('folders')
->find($id);
// Get folder shared record
$shared = Share::where('type', 'folder')
->where('item_id', $id)
->first();
// Delete folder shared record
if ($shared) {
$shared->delete();
}
// Remove folder from user favourites
DB::table('favourite_folder')
->where('folder_id', $folder->id)
->delete();
// Soft delete items
if (! $item['force_delete']) {
// Soft delete folder record
$folder->delete();
}
// Force delete children files
if ($item['force_delete']) {
// Get children folder ids
$child_folders = filter_folders_ids($folder->trashedFolders, 'id');
// Get children files
$files = UserFile::onlyTrashed()
->whereIn('folder_id', Arr::flatten([$id, $child_folders]))
->get();
// Remove all children files
foreach ($files as $file) {
// Delete file
Storage::delete("/files/$file->user_id/$file->basename");
// Delete thumbnail if exist
if ($file->thumbnail) {
Storage::delete(
"/files/$file->user_id/{$file->getRawOriginal('thumbnail')}"
);
}
// Delete file permanently
$file->forceDelete();
}
// Delete folder record
$folder->forceDelete();
}
}
// Delete item
if ($item['type'] !== 'folder') {
// Get file
$file = UserFile::withTrashed()
->find($id);
// Get folder shared record
$shared = Share::where('type', 'file')
->where('item_id', $id)
->first();
// Delete file shared record
if ($shared) {
$shared->delete();
}
// Force delete file
if ($item['force_delete']) {
// Delete file
Storage::delete("/files/$file->user_id/$file->basename");
// Delete thumbnail if exist
if ($file->thumbnail) {
Storage::delete(
"/files/$file->user_id/{$file->getRawOriginal('thumbnail')}"
);
}
// Delete file permanently
$file->forceDelete();
}
// Soft delete file
if (! $item['force_delete']) {
// Soft delete file
$file->delete();
}
}
}
}
@@ -0,0 +1,32 @@
<?php
namespace Domain\Items\Actions;
use App\Http\Controllers\Controller;
use Domain\Files\Models\File as UserFile;
use Domain\Folders\Models\Folder;
class MoveFileOrFolderAction
{
/**
* Move folder or file to new location
*/
public function __invoke($request, string $to_id): void
{
foreach ($request->items as $item) {
// Move folder
if ($item['type'] === 'folder') {
Folder::find($item['id'])
->update(['parent_id' => $to_id]);
}
// Move file
if ($item['type'] !== 'folder') {
UserFile::find($item['id'])
->update(['folder_id' => $to_id]);
}
}
}
}
@@ -0,0 +1,32 @@
<?php
namespace Domain\Items\Actions;
use App\Http\Controllers\Controller;
use Domain\Items\Requests\RenameItemRequest;
use Illuminate\Database\Eloquent\Model;
class RenameFileOrFolderAction
{
/**
* Rename item name
*/
public function __invoke(
RenameItemRequest $request,
string $id,
): Model {
// Get item
$item = get_item($request->input('type'), $id);
// Rename item
$item->update([
'name' => $request->input('name'),
]);
// Return updated item
return $item;
}
}
@@ -0,0 +1,32 @@
<?php
namespace Domain\Items\Controllers;
use App\Http\Controllers\Controller;
use Auth;
use Domain\Items\Actions\DeleteFileOrFolderAction;
use Domain\Items\Requests\DeleteItemRequest;
use Illuminate\Http\Response;
class DeleteFileOrFolderController extends Controller
{
/**
* Delete item for authenticated master|editor user
*/
public function __invoke(
DeleteItemRequest $request,
DeleteFileOrFolderAction $deleteFileOrFolder,
): Response{
abort_if(
is_demo_account(Auth::user()?->email), 204, 'Done.'
);
foreach ($request->input('items') as $item) {
($deleteFileOrFolder)($item, $item['id']);
}
return response('Done', 204);
}
}
@@ -1,79 +0,0 @@
<?php
namespace Domain\Items\Controllers;
use Exception;
use Illuminate\Http\Request;
use Support\Services\HelperService;
use App\Http\Controllers\Controller;
use Support\Demo\Actions\DemoService;
use Support\Services\FileManagerService;
use Domain\Items\Requests\MoveItemRequest;
use Domain\Items\Requests\DeleteItemRequest;
use Domain\Items\Requests\RenameItemRequest;
use Illuminate\Contracts\Routing\ResponseFactory;
class EditItemsController extends Controller
{
public function __construct(
private FileManagerService $filemanager,
private HelperService $helper,
private DemoService $demo,
) {
}
/**
* Rename item for authenticated master|editor user
*
* @param RenameItemRequest $request
* @param $id
* @return mixed
* @throws Exception
*/
public function rename_item(RenameItemRequest $request, $id)
{
if (is_demo_account('howdy@hi5ve.digital')) {
return $this->demo->rename_item($request, $id);
}
// If request contain icon or color, then change it
if ($request->filled('emoji') || $request->filled('color')) {
$this->filemanager->edit_folder_properties($request, $id);
}
// Rename Item
return $this->filemanager->rename_item($request, $id);
}
/**
* Delete item for authenticated master|editor user
*
* @param DeleteItemRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
* @throws Exception
*/
public function delete_item(DeleteItemRequest $request)
{
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
foreach ($request->input('items') as $item) {
$this->filemanager->delete_item($item, $item['id']);
}
return response('Done', 204);
}
/**
* Move item for authenticated master|editor user
*
* @param MoveItemRequest $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function move(MoveItemRequest $request)
{
abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
$this->filemanager->move($request, $request->to_id);
return response('Done!', 204);
}
}
@@ -0,0 +1,36 @@
<?php
namespace Domain\Items\Controllers;
use App\Http\Controllers\Controller;
use Auth;
use Domain\Files\Models\File as UserFile;
use Domain\Folders\Models\Folder;
use Domain\Items\Actions\MoveFileOrFolderAction;
use Domain\Items\Requests\MoveItemRequest;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Response;
class MoveFileOrFolderController extends Controller
{
/**
* Move item for authenticated master|editor user
*/
public function __invoke(
MoveItemRequest $request,
MoveFileOrFolderAction $moveFileOrFolder,
): Response {
abort_if(
is_demo_account(Auth::user()?->email), 204, 'Done.'
);
($moveFileOrFolder)(
$request, $request->input('to_id')
);
return response('Done!', 204);
}
}
@@ -0,0 +1,38 @@
<?php
namespace Domain\Items\Controllers;
use App\Http\Controllers\Controller;
use Auth;
use Domain\Folders\Actions\UpdateFolderPropertyAction;
use Domain\Items\Actions\RenameFileOrFolderAction;
use Domain\Items\Requests\RenameItemRequest;
use Illuminate\Database\Eloquent\Model;
class RenameFileOrFolderController extends Controller
{
/**
* Rename item for authenticated master|editor user
*/
public function __invoke(
RenameItemRequest $request,
string $id,
RenameFileOrFolderAction $renameFileOrFolder,
UpdateFolderPropertyAction $updateFolderProperty
): Model {
if (is_demo_account(Auth::user()?->email)) {
return $this->demo->rename_item($request, $id);
}
// If request contain icon or color, then change it
if ($request->filled('emoji') || $request->filled('color')) {
($updateFolderProperty)($request, $id);
}
// Rename Item
return ($renameFileOrFolder)($request, $id);
}
}