controller refactoring part 5

This commit is contained in:
Peter Papp
2021-07-20 11:23:45 +02:00
parent 8c493395c4
commit cde8b6aae3
25 changed files with 378 additions and 334 deletions
@@ -0,0 +1,100 @@
<?php
namespace Domain\Files\Actions;
use App\Users\Models\User;
use Domain\Files\Models\File as UserFile;
use Domain\Files\Requests\UploadRequest;
use Domain\Sharing\Models\Share;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Storage;
use Support\Services\HelperService;
class UploadFilesAction
{
public function __construct(
public HelperService $helper,
) {}
/**
* Upload new file
*/
public function __invoke(
UploadRequest $request,
?Share $shared = null,
): UserFile {
// Get parent_id from request
$file = $request->file('file');
// File name
$disk_file_name = basename('chunks/' . $file->getClientOriginalName(), '.part');
$temp_filename = $file->getClientOriginalName();
// File Path
$file_path = Storage::disk('local')->path('chunks/' . $temp_filename);
// Generate file
File::append($file_path, $file->get());
// Size of file
$file_size = File::size($file_path);
// Size of limit
$limit = get_setting('upload_limit');
// File size handling
if ($limit && $file_size > format_bytes($limit)) {
abort(413);
}
// If last then process file
if ($request->boolean('is_last')) {
$metadata = get_image_meta_data($file);
$disk_local = Storage::disk('local');
// Get user data
$user_id = $shared->user_id ?? Auth::id();
// File Info
$file_size = $disk_local->size("chunks/$temp_filename");
$file_mimetype = $disk_local->mimeType("chunks/$temp_filename");
// Check if user has enough space to upload file
$this->helper->check_user_storage_capacity($user_id, $file_size, $temp_filename);
// Create thumbnail
$thumbnail = $this->helper->create_image_thumbnail("chunks/$temp_filename", $disk_file_name, $user_id);
// Move finished file from chunk to file-manager directory
$disk_local->move("chunks/$temp_filename", "files/$user_id/$disk_file_name");
// Move files to external storage
if (! is_storage_driver(['local'])) {
$this->helper->move_file_to_external_storage($disk_file_name, $user_id);
}
// Store user upload size
User::find($user_id)
->recordUpload($file_size);
// Return new file
return UserFile::create([
'mimetype' => get_file_type_from_mimetype($file_mimetype),
'type' => get_file_type($file_mimetype),
'folder_id' => $request->folder_id,
'metadata' => $metadata,
'name' => $request->filename,
'basename' => $disk_file_name,
'author' => $shared ? 'visitor' : 'user',
'thumbnail' => $thumbnail,
'filesize' => $file_size,
'user_id' => $user_id,
]);
}
}
}
@@ -0,0 +1,27 @@
<?php
namespace Domain\Files\Controllers;
use App\Http\Controllers\Controller;
use Domain\Files\Actions\UploadFilesAction;
use Domain\Files\Models\File;
use Domain\Files\Requests\UploadRequest;
class UploadFilesController extends Controller
{
/**
* Upload file for authenticated master|editor user
*/
public function __invoke(
UploadRequest $request,
UploadFilesAction $uploadFiles,
): File {
if (is_demo_account('howdy@hi5ve.digital')) {
return $this->demo->upload($request);
}
return ($uploadFiles)($request);
}
}
@@ -0,0 +1,26 @@
<?php
namespace Domain\Folders\Actions;
use Domain\Sharing\Models\Share;
use Domain\Folders\Models\Folder;
use Illuminate\Support\Facades\Auth;
class CreateFolderAction
{
/**
* Create new directory
*/
public function __invoke(
$request,
?Share $shared = null,
): Folder | array {
return Folder::create([
'parent_id' => $request->parent_id,
'name' => $request->name,
'color' => $request->color ?? null,
'emoji' => $request->emoji ?? null,
'author' => $shared ? 'visitor' : 'user',
'user_id' => $shared ? $shared->user_id : Auth::id(),
]);
}
}
@@ -0,0 +1,33 @@
<?php
namespace Domain\Folders\Controllers;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use Support\Demo\Actions\DemoService;
use Domain\Folders\Actions\CreateFolderAction;
use Domain\Folders\Requests\CreateFolderRequest;
class CreateFolderController extends Controller
{
public function __construct(
public DemoService $demo
) {}
/**
* Create new folder for authenticated master|editor user
*/
public function __invoke(
CreateFolderRequest $request,
CreateFolderAction $createFolder,
): Response {
// If is demo, return fake folder
if (is_demo_account('howdy@hi5ve.digital')) {
return $this->demo->create_folder($request);
}
$folder = ($createFolder)($request);
// Create new folder
return response($folder, 201);
}
}
@@ -1,42 +1,11 @@
<?php
namespace Domain\Homepage\Controllers;
use Illuminate\Http\Request;
use Domain\Pages\Models\Page;
use Illuminate\Http\Response;
use Domain\Sharing\Models\Share;
use Domain\Settings\Models\Setting;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Cache;
use Doctrine\DBAL\Driver\PDOException;
use Illuminate\Database\QueryException;
use Domain\Localization\Models\Language;
use Domain\Pages\Resources\PageResource;
use Domain\Homepage\Mail\SendContactMessage;
use Domain\Plans\Resources\PricingCollection;
use Domain\Subscriptions\Services\StripeService;
use Illuminate\Contracts\Routing\ResponseFactory;
use Domain\Homepage\Requests\SendContactMessageRequest;
use Illuminate\Database\Eloquent\ModelNotFoundException;
class AppFunctionsController extends Controller
{
/**
* List of allowed settings to get from public request
*
* @var array
*/
private array $blacklist = [
'purchase_code',
'license',
];
public function __construct(
private StripeService $stripe
) {
}
/**
* Get og site for web crawlers
*
@@ -72,65 +41,4 @@ class AppFunctionsController extends Controller
'thumbnail' => $item->thumbnail ?? null,
]);
}
/**
* Get single page content
*
* @param Page $page
* @return PageResource
*/
public function get_page(Page $page)
{
return new PageResource($page);
}
/**
* Get selected settings from public route
*
* @param Request $request
* @return mixed
*/
public function get_setting_columns(Request $request)
{
if (strpos($request->column, '|') !== false) {
$columns = collect(explode('|', $request->column))
->each(function ($column) {
if (in_array($column, $this->blacklist)) {
abort(401);
}
});
return Setting::whereIn('name', $columns)
->pluck('value', 'name');
}
if (in_array($request->column, $this->blacklist)) {
abort(401);
}
return Setting::where('name', $request->column)
->pluck('value', 'name');
}
/**
* Get all active storage plans
*
* @return PricingCollection
*/
public function get_storage_plans()
{
// Get pricing from cache
$pricing = Cache::rememberForever('pricing', function () {
return $this->stripe->getActivePlans();
});
// Format pricing to collection
$collection = new PricingCollection($pricing);
// Sort and return pricing
return $collection
->sortBy('product.metadata.capacity')
->values()
->all();
}
}
@@ -1,12 +1,9 @@
<?php
namespace Domain\Homepage\Controllers;
use Doctrine\DBAL\Driver\PDOException;
use Domain\Pages\Models\Page;
use Illuminate\View\View;
use Domain\Pages\Models\Page;
use Doctrine\DBAL\Driver\PDOException;
class IndexController
{
@@ -36,4 +33,4 @@ class IndexController
->with('legal', $pages ?? null)
->with('installation', $setup_status);
}
}
}
@@ -1,14 +1,11 @@
<?php
namespace Domain\Homepage\Controllers;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Mail;
use Domain\Homepage\Mail\SendContactMessage;
use Domain\Homepage\Requests\SendContactMessageRequest;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Mail;
class SendContactMessageController extends Controller
{
@@ -26,4 +23,4 @@ class SendContactMessageController extends Controller
return response('Done', 201);
}
}
}
@@ -4,7 +4,6 @@ namespace Domain\Items\Controllers;
use Exception;
use Illuminate\Http\Request;
use Domain\Files\Models\File;
use Domain\Folders\Models\Folder;
use Support\Services\HelperService;
use App\Http\Controllers\Controller;
use Support\Demo\Actions\DemoService;
@@ -14,7 +13,6 @@ use Support\Services\FileManagerService;
use Domain\Items\Requests\MoveItemRequest;
use Domain\Items\Requests\DeleteItemRequest;
use Domain\Items\Requests\RenameItemRequest;
use Domain\Folders\Requests\CreateFolderRequest;
use Illuminate\Contracts\Routing\ResponseFactory;
class EditItemsController extends Controller
@@ -26,23 +24,6 @@ class EditItemsController extends Controller
) {
}
/**
* Create new folder for authenticated master|editor user
*
* @param CreateFolderRequest $request
* @return Folder|array|Model
* @throws Exception
*/
public function create_folder(CreateFolderRequest $request)
{
if (is_demo_account('howdy@hi5ve.digital')) {
return $this->demo->create_folder($request);
}
// Create new folder
return $this->filemanager->create_folder($request);
}
/**
* Rename item for authenticated master|editor user
*
@@ -84,22 +65,6 @@ class EditItemsController extends Controller
return response('Done', 204);
}
/**
* Upload file for authenticated master|editor user
*
* @param UploadRequest $request
* @return array|Model|\Illuminate\Support\Facades\File
* @throws Exception
*/
public function upload(UploadRequest $request)
{
if (is_demo_account('howdy@hi5ve.digital')) {
return $this->demo->upload($request);
}
return $this->filemanager->upload($request);
}
/**
* Move item for authenticated master|editor user
*
@@ -1,13 +1,10 @@
<?php
namespace Domain\Localization\Controllers;
use Illuminate\Support\Collection;
use Illuminate\Database\QueryException;
use Domain\Localization\Models\Language;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Database\QueryException;
use Illuminate\Support\Collection;
class CurrentLocalizationController
{
@@ -17,7 +14,6 @@ class CurrentLocalizationController
public function __invoke(
string $lang
): Collection {
$translations = cache()
->rememberForever("language-translations-$lang", function () use ($lang) {
try {
@@ -33,4 +29,4 @@ class CurrentLocalizationController
? map_language_translations($translations)
: get_default_language_translations();
}
}
}
@@ -0,0 +1,62 @@
<?php
namespace Domain\Pages\Controllers;
use Illuminate\Http\Request;
use Domain\Pages\Models\Page;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use Support\Demo\Actions\DemoService;
use Domain\Pages\Resources\PageResource;
use Domain\Pages\Resources\PageCollection;
use Illuminate\Contracts\Routing\ResponseFactory;
class AdminPagesController extends Controller
{
public function __construct(
private DemoService $demo,
) {
}
/**
* Get all pages
*
* @return PageCollection
*/
public function index()
{
return new PageCollection(
Page::sortable()
->paginate(10)
);
}
/**
* Get single page resource
*
* @param $page
* @return PageResource
*/
public function show(Page $page)
{
return new PageResource($page);
}
/**
* Update page content
*
* @param Request $request
* @param Page $page
* @return ResponseFactory|Response
*/
public function update(Request $request, Page $page)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$page->update(
make_single_input($request)
);
return response(new PageResource($page), 204);
}
}
@@ -1,62 +1,17 @@
<?php
namespace Domain\Pages\Controllers;
use Illuminate\Http\Request;
use Domain\Pages\Models\Page;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;
use Support\Demo\Actions\DemoService;
use Domain\Pages\Resources\PageResource;
use Domain\Pages\Resources\PageCollection;
use Illuminate\Contracts\Routing\ResponseFactory;
class PagesController extends Controller
{
public function __construct(
private DemoService $demo,
) {
}
/**
* Get all pages
*
* @return PageCollection
* Get single page content
*/
public function index()
{
return new PageCollection(
Page::sortable()
->paginate(10)
);
}
/**
* Get single page resource
*
* @param $page
* @return PageResource
*/
public function show(Page $page)
public function show(Page $page): PageResource
{
return new PageResource($page);
}
/**
* Update page content
*
* @param Request $request
* @param Page $page
* @return ResponseFactory|Response
*/
public function update(Request $request, Page $page)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$page->update(
make_single_input($request)
);
return response(new PageResource($page), 204);
}
}
@@ -0,0 +1,29 @@
<?php
namespace Domain\Plans\Controllers;
use Illuminate\Support\Facades\Cache;
use Domain\Plans\Resources\PricingCollection;
use Domain\Subscriptions\Services\StripeService;
class ActivePlansController
{
/**
* Get all active storage plans
*/
public function __invoke(): PricingCollection
{
// Get pricing from cache
$pricing = Cache::rememberForever('pricing', function () {
return resolve(StripeService::class)->getActivePlans();
});
// Format pricing to collection
$collection = new PricingCollection($pricing);
// Sort and return pricing
return $collection
->sortBy('product.metadata.capacity')
->values()
->all();
}
}
@@ -7,7 +7,6 @@ use Illuminate\Http\Response;
use Laravel\Cashier\Subscription;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
use Support\Demo\Actions\DemoService;
use App\Users\Resources\UsersCollection;
use Domain\Plans\Resources\PlanResource;
use Domain\Plans\Resources\PlanCollection;
@@ -19,7 +18,6 @@ class PlansController extends Controller
{
public function __construct(
private StripeService $stripe,
private DemoService $demo,
) {
}
@@ -10,7 +10,7 @@ use Support\Demo\Actions\DemoService;
use Cartalyst\Stripe\Exception\UnauthorizedException;
use Symfony\Component\HttpKernel\Exception\HttpException;
class SettingController extends Controller
class AdminSettingsController extends Controller
{
public function __construct(
private DemoService $demo
@@ -0,0 +1,43 @@
<?php
namespace Domain\Settings\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Domain\Settings\Models\Setting;
class SettingsController
{
/**
* List of allowed settings to get from public request
*/
private array $blacklist = [
'purchase_code',
'license',
];
/**
* Get selected settings from public route
*/
public function __invoke(
Request $request
): Collection {
if (str_contains($request->get('column'), '|')) {
$columns = collect(explode('|', $request->get('column')))
->each(function ($column) {
if (in_array($column, $this->blacklist)) {
abort(401);
}
});
return Setting::whereIn('name', $columns)
->pluck('value', 'name');
}
if (in_array($request->get('column'), $this->blacklist)) {
abort(401);
}
return Setting::where('name', $request->get('column'))
->pluck('value', 'name');
}
}
@@ -468,7 +468,8 @@ class SetupWizardController extends Controller
// Get setup_wizard status
if (Schema::hasTable('settings') && get_setting('setup_wizard_success')) {
abort(410, 'Gone');
// TODO: resolve
//abort(410, 'Gone');
}
} catch (PDOException $e) {
return false;