controller refactoring part 13

This commit is contained in:
Peter Papp
2021-07-20 17:46:38 +02:00
parent 2333b52d68
commit b659f2ad8d
12 changed files with 294 additions and 258 deletions
+5 -3
View File
@@ -57,7 +57,7 @@
"/chunks/plans.js": "/chunks/plans.js?id=2b26173a02ed9f86e875", "/chunks/plans.js": "/chunks/plans.js?id=2b26173a02ed9f86e875",
"/chunks/platform.js": "/chunks/platform.js?id=b7b13093369e09fcb1cb", "/chunks/platform.js": "/chunks/platform.js?id=b7b13093369e09fcb1cb",
"/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=be3d7cf51585313cf53b", "/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=be3d7cf51585313cf53b",
"/chunks/profile.js": "/chunks/profile.js?id=41b536880e846017d2d0", "/chunks/profile.js": "/chunks/profile.js?id=03526296e71df827ff47",
"/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=fd25990d1ccec0294602", "/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=fd25990d1ccec0294602",
"/chunks/purchase-code.js": "/chunks/purchase-code.js?id=b35e751cdc1946a4fb60", "/chunks/purchase-code.js": "/chunks/purchase-code.js?id=b35e751cdc1946a4fb60",
"/chunks/settings.js": "/chunks/settings.js?id=7070921d97a2510445ac", "/chunks/settings.js": "/chunks/settings.js?id=7070921d97a2510445ac",
@@ -67,7 +67,7 @@
"/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=323729734ffc814a48d2", "/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=323729734ffc814a48d2",
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=682f4f690ac252a78a3a", "/chunks/settings-storage.js": "/chunks/settings-storage.js?id=682f4f690ac252a78a3a",
"/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=4f1793d53633a2c4cc18", "/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=4f1793d53633a2c4cc18",
"/chunks/settings~chunks/settings-password.js": "/chunks/settings~chunks/settings-password.js?id=f5aaffe3aa073cb2ee19", "/chunks/settings~chunks/settings-password.js": "/chunks/settings~chunks/settings-password.js?id=1c49c2c5bcef4395dedb",
"/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=41d3478184ec24644a1c", "/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=41d3478184ec24644a1c",
"/chunks/shared.js": "/chunks/shared.js?id=7524b7a783d4aed23794", "/chunks/shared.js": "/chunks/shared.js?id=7524b7a783d4aed23794",
"/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=bfdf9bb904d354bdcbd1", "/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=bfdf9bb904d354bdcbd1",
@@ -284,5 +284,7 @@
"/chunks/settings-create-payment-methods.3c553438a1090569af54.hot-update.js": "/chunks/settings-create-payment-methods.3c553438a1090569af54.hot-update.js", "/chunks/settings-create-payment-methods.3c553438a1090569af54.hot-update.js": "/chunks/settings-create-payment-methods.3c553438a1090569af54.hot-update.js",
"/chunks/settings-payment-methods.3c553438a1090569af54.hot-update.js": "/chunks/settings-payment-methods.3c553438a1090569af54.hot-update.js", "/chunks/settings-payment-methods.3c553438a1090569af54.hot-update.js": "/chunks/settings-payment-methods.3c553438a1090569af54.hot-update.js",
"/chunks/upgrade-billing.3c553438a1090569af54.hot-update.js": "/chunks/upgrade-billing.3c553438a1090569af54.hot-update.js", "/chunks/upgrade-billing.3c553438a1090569af54.hot-update.js": "/chunks/upgrade-billing.3c553438a1090569af54.hot-update.js",
"/chunks/settings-invoices.4ab4d27b8447516929d2.hot-update.js": "/chunks/settings-invoices.4ab4d27b8447516929d2.hot-update.js" "/chunks/settings-invoices.4ab4d27b8447516929d2.hot-update.js": "/chunks/settings-invoices.4ab4d27b8447516929d2.hot-update.js",
"/chunks/profile.5902d31a95da744acd2b.hot-update.js": "/chunks/profile.5902d31a95da744acd2b.hot-update.js",
"/chunks/settings~chunks/settings-password.5902d31a95da744acd2b.hot-update.js": "/chunks/settings~chunks/settings-password.5902d31a95da744acd2b.hot-update.js"
} }
+12 -10
View File
@@ -7,6 +7,11 @@ use Domain\Admin\Controllers\DashboardController;
use Domain\Pages\Controllers\AdminPagesController; use Domain\Pages\Controllers\AdminPagesController;
use Domain\Localization\Controllers\LanguageController; use Domain\Localization\Controllers\LanguageController;
use Domain\Settings\Controllers\AdminSettingsController; use Domain\Settings\Controllers\AdminSettingsController;
use Domain\Settings\Controllers\FlushCacheController;
use Domain\Settings\Controllers\GetSettingsValueController;
use Domain\Settings\Controllers\SetEmailController;
use Domain\Settings\Controllers\SetStripeController;
use Domain\Settings\Controllers\UpdateSettingValueController;
// Dashboard // Dashboard
Route::group(['prefix' => 'dashboard'], function () { Route::group(['prefix' => 'dashboard'], function () {
@@ -39,22 +44,19 @@ Route::group(['prefix' => 'plans'], function () {
}); });
// Pages // Pages
Route::group(['prefix' => 'pages'], function () { Route::apiResource('/pages', AdminPagesController::class);
Route::patch('/{page}', [AdminPagesController::class, 'update']);
Route::get('/{page}', [AdminPagesController::class, 'show']);
Route::get('/', [AdminPagesController::class, 'index']);
});
// Invoices // Invoices
Route::get('/invoices', [InvoiceController::class, 'index']); Route::get('/invoices', [InvoiceController::class, 'index']);
// Settings // Settings
Route::group(['prefix' => 'settings'], function () { Route::group(['prefix' => 'settings'], function () {
Route::get('/flush-cache', [AdminSettingsController::class, 'flush_cache']); Route::patch('/', UpdateSettingValueController::class);
Route::post('/stripe', [AdminSettingsController::class, 'set_stripe']); Route::get('/', GetSettingsValueController::class);
Route::post('/email', [AdminSettingsController::class, 'set_email']);
Route::patch('/', [AdminSettingsController::class, 'update']); Route::get('/flush-cache', FlushCacheController::class);
Route::get('/', [AdminSettingsController::class, 'show']); Route::post('/stripe', SetStripeController::class);
Route::post('/email', SetEmailController::class);
}); });
// Language // Language
+2 -2
View File
@@ -11,7 +11,7 @@ use App\Users\Controllers\ForgotPasswordController;
use Domain\Files\Controllers\UploadFilesController; use Domain\Files\Controllers\UploadFilesController;
use Domain\Folders\Controllers\FavouriteController; use Domain\Folders\Controllers\FavouriteController;
use Domain\Plans\Controllers\ActivePlansController; use Domain\Plans\Controllers\ActivePlansController;
use Domain\Settings\Controllers\SettingsController; use Domain\Settings\Controllers\GetSettingsValueController;
use Domain\Zipping\Controllers\ZipFolderController; use Domain\Zipping\Controllers\ZipFolderController;
use Domain\Folders\Controllers\CreateFolderController; use Domain\Folders\Controllers\CreateFolderController;
use Domain\Sharing\Controllers\ShareViaEmailController; use Domain\Sharing\Controllers\ShareViaEmailController;
@@ -31,7 +31,7 @@ Route::apiResource('/page', PagesController::class);
// Homepage // Homepage
Route::post('/contact', SendContactMessageController::class); Route::post('/contact', SendContactMessageController::class);
Route::get('/pricing', ActivePlansController::class); Route::get('/pricing', ActivePlansController::class);
Route::get('/settings', SettingsController::class); Route::get('/settings', GetSettingsValueController::class);
// Register user // Register user
Route::post('/register', CreateNewUserAction::class); Route::post('/register', CreateNewUserAction::class);
@@ -5,24 +5,15 @@ use Illuminate\Http\Request;
use Domain\Pages\Models\Page; use Domain\Pages\Models\Page;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Support\Demo\Actions\DemoService;
use Domain\Pages\Resources\PageResource; use Domain\Pages\Resources\PageResource;
use Domain\Pages\Resources\PageCollection; use Domain\Pages\Resources\PageCollection;
use Illuminate\Contracts\Routing\ResponseFactory;
class AdminPagesController extends Controller class AdminPagesController extends Controller
{ {
public function __construct(
private DemoService $demo,
) {
}
/** /**
* Get all pages * Get all pages
*
* @return PageCollection
*/ */
public function index() public function index(): PageCollection
{ {
return new PageCollection( return new PageCollection(
Page::sortable() Page::sortable()
@@ -32,23 +23,16 @@ class AdminPagesController extends Controller
/** /**
* Get single page resource * Get single page resource
*
* @param $page
* @return PageResource
*/ */
public function show(Page $page) public function show(Page $page): PageResource
{ {
return new PageResource($page); return new PageResource($page);
} }
/** /**
* Update page content * Update page content
*
* @param Request $request
* @param Page $page
* @return ResponseFactory|Response
*/ */
public function update(Request $request, Page $page) public function update(Request $request, Page $page): Response
{ {
// Abort in demo mode // Abort in demo mode
abort_if(is_demo(), 204, 'Done.'); abort_if(is_demo(), 204, 'Done.');
@@ -57,6 +41,8 @@ class AdminPagesController extends Controller
make_single_input($request) make_single_input($request)
); );
return response(new PageResource($page), 204); return response(
new PageResource($page), 204
);
} }
} }
@@ -1,180 +1,26 @@
<?php <?php
namespace Domain\Settings\Controllers; namespace Domain\Settings\Controllers;
use Stripe; use Illuminate\Support\Collection;
use Artisan;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Domain\Settings\Models\Setting; use Domain\Settings\Models\Setting;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Support\Demo\Actions\DemoService;
use Cartalyst\Stripe\Exception\UnauthorizedException;
use Symfony\Component\HttpKernel\Exception\HttpException;
class AdminSettingsController extends Controller class AdminSettingsController extends Controller
{ {
public function __construct(
private DemoService $demo
) {
}
/** /**
* Get table content * Get table content
*
* @param Request $request
* @return mixed
*/ */
public function show(Request $request) public function __invoke(Request $request): Collection
{ {
if (strpos($request->column, '|') !== false) { if (str_contains($request->get('column'), '|')) {
$columns = explode('|', $request->column); $columns = explode('|', $request->get('column'));
return Setting::whereIn('name', $columns) return Setting::whereIn('name', $columns)
->pluck('value', 'name'); ->pluck('value', 'name');
} }
return Setting::where('name', $request->column) return Setting::where('name', $request->get('column'))
->pluck('value', 'name'); ->pluck('value', 'name');
} }
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
// Store image if exist
if ($request->hasFile($request->name)) {
// Find and update image path
Setting::updateOrCreate([
'name' => $request->name,
], [
'value' => store_system_image($request, $request->name),
]);
return response('Done', 204);
}
// Find and update variable
Setting::updateOrCreate(
['name' => $request->name],
['value' => $request->value]
);
return response('Done', 204);
}
/**
* Set new email credentials to .env file
*
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
*/
public function set_email(Request $request)
{
// TODO: pridat validator do requestu
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
if (! app()->runningUnitTests()) {
setEnvironmentValue([
'MAIL_DRIVER' => $request->driver,
'MAIL_HOST' => $request->host,
'MAIL_PORT' => $request->port,
'MAIL_USERNAME' => $request->username,
'MAIL_PASSWORD' => $request->password,
'MAIL_ENCRYPTION' => $request->encryption,
]);
// Clear config cache
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
/**
* Configure stripe additionally
*
* @param Request $request
*/
public function set_stripe(Request $request)
{
// TODO: pridat validator do requestu
// Check payment setup status
if (get_setting('payments_configured')) {
abort(401, 'Gone');
}
// Try to get stripe account details
try {
if (! app()->runningUnitTests()) {
Stripe::make($request->secret, '2020-03-02')
->account()
->details();
}
} catch (UnauthorizedException $e) {
throw new HttpException(401, $e->getMessage());
}
// Get options
collect([
[
'name' => 'stripe_currency',
'value' => $request->currency,
],
[
'name' => 'payments_configured',
'value' => 1,
],
[
'name' => 'payments_active',
'value' => 1,
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
if (! app()->runningUnitTests()) {
// Set stripe credentials to .env
setEnvironmentValue([
'CASHIER_CURRENCY' => $request->currency,
'STRIPE_KEY' => $request->key,
'STRIPE_SECRET' => $request->secret,
'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
]);
// Clear cache
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
/**
* Clear application cache
*/
public function flush_cache()
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
if (! app()->runningUnitTests()) {
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
} }
@@ -0,0 +1,29 @@
<?php
namespace Domain\Settings\Controllers;
use App\Http\Controllers\Controller;
use Artisan;
use Illuminate\Http\Response;
class FlushCacheController extends Controller
{
/**
* Clear application cache
*/
public function __invoke(): Response
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
if (! app()->runningUnitTests()) {
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
}
@@ -5,7 +5,7 @@ use Illuminate\Http\Request;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Domain\Settings\Models\Setting; use Domain\Settings\Models\Setting;
class SettingsController class GetSettingsValueController
{ {
/** /**
* List of allowed settings to get from public request * List of allowed settings to get from public request
@@ -0,0 +1,39 @@
<?php
namespace Domain\Settings\Controllers;
use Artisan;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class SetEmailController
{
/**
* Set new email credentials to .env file
*/
public function __invoke(Request $request): Response
{
// TODO: pridat validator do requestu
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
if (! app()->runningUnitTests()) {
setEnvironmentValue([
'MAIL_DRIVER' => $request->input('driver'),
'MAIL_HOST' => $request->input('host'),
'MAIL_PORT' => $request->input('port'),
'MAIL_USERNAME' => $request->input('username'),
'MAIL_PASSWORD' => $request->input('password'),
'MAIL_ENCRYPTION' => $request->input('encryption'),
]);
// Clear config cache
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
}
@@ -0,0 +1,77 @@
<?php
namespace Domain\Settings\Controllers;
use Artisan;
use Cartalyst\Stripe\Exception\UnauthorizedException;
use Cartalyst\Stripe\Stripe;
use Domain\Settings\Models\Setting;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;
class SetStripeController
{
/**
* Configure stripe additionally
*/
public function __invoke(Request $request): Response
{
// TODO: pridat validator do requestu
// Check payment setup status
if (get_setting('payments_configured')) {
abort(401, 'Gone');
}
// Try to get stripe account details
try {
if (! app()->runningUnitTests()) {
Stripe::make($request->input('secret'), '2020-03-02')
->account()
->details();
}
} catch (UnauthorizedException $e) {
throw new HttpException(401, $e->getMessage());
}
// Get options
collect([
[
'name' => 'stripe_currency',
'value' => $request->input('currency'),
],
[
'name' => 'payments_configured',
'value' => 1,
],
[
'name' => 'payments_active',
'value' => 1,
],
])->each(function ($col) {
Setting::forceCreate([
'name' => $col['name'],
'value' => $col['value'],
]);
});
if (! app()->runningUnitTests()) {
// Set stripe credentials to .env
setEnvironmentValue([
'CASHIER_CURRENCY' => $request->input('currency'),
'STRIPE_KEY' => $request->input('key'),
'STRIPE_SECRET' => $request->input('secret'),
'STRIPE_WEBHOOK_SECRET' => $request->input('webhookSecret'),
]);
// Clear cache
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('config:cache');
}
return response('Done', 204);
}
}
@@ -0,0 +1,42 @@
<?php
namespace Domain\Settings\Controllers;
use App\Http\Controllers\Controller;
use Domain\Settings\Models\Setting;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class UpdateSettingValueController extends Controller
{
/**
* Update setting item.
*/
public function __invoke(Request $request): Response
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
// Store image if exist
if ($request->hasFile($request->input('name'))) {
// Find and update image path
Setting::updateOrCreate([
'name' => $request->input('name'),
], [
'value' => store_system_image($request, $request->input('name')),
]);
return response('Done', 204);
}
// Find and update variable
Setting::updateOrCreate(
['name' => $request->input('name')],
['value' => $request->input('value')]
);
return response('Done', 204);
}
}
-63
View File
@@ -424,67 +424,4 @@ class AdminTest extends TestCase
Storage::disk('local') Storage::disk('local')
->assertMissing($user->settings->getRawOriginal('avatar')); ->assertMissing($user->settings->getRawOriginal('avatar'));
} }
/**
* @test
*/
public function it_get_all_pages()
{
$this->setup->seed_default_pages();
$admin = User::factory(User::class)
->create(['role' => 'admin']);
Sanctum::actingAs($admin);
collect(['terms-of-service', 'privacy-policy', 'cookie-policy'])
->each(function ($slug) {
$this->getJson('/api/admin/pages')
->assertStatus(200)
->assertJsonFragment([
'slug' => $slug,
]);
});
}
/**
* @test
*/
public function it_get_page()
{
$this->setup->seed_default_pages();
$admin = User::factory(User::class)
->create(['role' => 'admin']);
$this
->actingAs($admin)
->getJson('/api/admin/pages/terms-of-service')
->assertStatus(200)
->assertJsonFragment([
'slug' => 'terms-of-service',
]);
}
/**
* @test
*/
public function it_update_page()
{
$this->setup->seed_default_pages();
$admin = User::factory(User::class)
->create(['role' => 'admin']);
$this
->actingAs($admin)
->patchJson('/api/admin/pages/terms-of-service', [
'name' => 'title',
'value' => 'New Title',
])->assertStatus(204);
$this->assertDatabaseHas('pages', [
'title' => 'New Title',
]);
}
} }
+76
View File
@@ -0,0 +1,76 @@
<?php
namespace Tests\Domain\Pages;
use App\Users\Models\User;
use Domain\SetupWizard\Services\SetupService;
use Laravel\Sanctum\Sanctum;
use Tests\TestCase;
class AdminPagesTest extends TestCase
{
/**
* @test
*/
public function it_get_all_pages()
{
resolve(SetupService::class)->seed_default_pages();
$admin = User::factory(User::class)
->create(['role' => 'admin']);
Sanctum::actingAs($admin);
collect(['terms-of-service', 'privacy-policy', 'cookie-policy'])
->each(function ($slug) {
$this->getJson('/api/admin/pages')
->assertStatus(200)
->assertJsonFragment([
'slug' => $slug,
]);
});
}
/**
* @test
*/
public function it_get_page()
{
resolve(SetupService::class)->seed_default_pages();
$admin = User::factory(User::class)
->create(['role' => 'admin']);
$this
->actingAs($admin)
->getJson('/api/admin/pages/terms-of-service')
->assertStatus(200)
->assertJsonFragment([
'slug' => 'terms-of-service',
]);
}
/**
* @test
*/
public function it_update_page()
{
resolve(SetupService::class)->seed_default_pages();
$admin = User::factory(User::class)
->create(['role' => 'admin']);
$this
->actingAs($admin)
->patchJson('/api/admin/pages/terms-of-service', [
'name' => 'title',
'value' => 'New Title',
])->assertStatus(204);
$this->assertDatabaseHas('pages', [
'title' => 'New Title',
]);
}
}