diff --git a/public/mix-manifest.json b/public/mix-manifest.json index fa89a857..cd5ba91f 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -57,7 +57,7 @@ "/chunks/plans.js": "/chunks/plans.js?id=2b26173a02ed9f86e875", "/chunks/platform.js": "/chunks/platform.js?id=b7b13093369e09fcb1cb", "/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/purchase-code.js": "/chunks/purchase-code.js?id=b35e751cdc1946a4fb60", "/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-storage.js": "/chunks/settings-storage.js?id=682f4f690ac252a78a3a", "/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/shared.js": "/chunks/shared.js?id=7524b7a783d4aed23794", "/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-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/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" } diff --git a/routes/admin.php b/routes/admin.php index 6ded2fd7..e3dda80d 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -7,6 +7,11 @@ use Domain\Admin\Controllers\DashboardController; use Domain\Pages\Controllers\AdminPagesController; use Domain\Localization\Controllers\LanguageController; 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 Route::group(['prefix' => 'dashboard'], function () { @@ -39,22 +44,19 @@ Route::group(['prefix' => 'plans'], function () { }); // Pages -Route::group(['prefix' => 'pages'], function () { - Route::patch('/{page}', [AdminPagesController::class, 'update']); - Route::get('/{page}', [AdminPagesController::class, 'show']); - Route::get('/', [AdminPagesController::class, 'index']); -}); +Route::apiResource('/pages', AdminPagesController::class); // Invoices Route::get('/invoices', [InvoiceController::class, 'index']); // Settings Route::group(['prefix' => 'settings'], function () { - Route::get('/flush-cache', [AdminSettingsController::class, 'flush_cache']); - Route::post('/stripe', [AdminSettingsController::class, 'set_stripe']); - Route::post('/email', [AdminSettingsController::class, 'set_email']); - Route::patch('/', [AdminSettingsController::class, 'update']); - Route::get('/', [AdminSettingsController::class, 'show']); + Route::patch('/', UpdateSettingValueController::class); + Route::get('/', GetSettingsValueController::class); + + Route::get('/flush-cache', FlushCacheController::class); + Route::post('/stripe', SetStripeController::class); + Route::post('/email', SetEmailController::class); }); // Language diff --git a/routes/api.php b/routes/api.php index 259ac588..6336ede9 100644 --- a/routes/api.php +++ b/routes/api.php @@ -11,7 +11,7 @@ use App\Users\Controllers\ForgotPasswordController; use Domain\Files\Controllers\UploadFilesController; use Domain\Folders\Controllers\FavouriteController; use Domain\Plans\Controllers\ActivePlansController; -use Domain\Settings\Controllers\SettingsController; +use Domain\Settings\Controllers\GetSettingsValueController; use Domain\Zipping\Controllers\ZipFolderController; use Domain\Folders\Controllers\CreateFolderController; use Domain\Sharing\Controllers\ShareViaEmailController; @@ -31,7 +31,7 @@ Route::apiResource('/page', PagesController::class); // Homepage Route::post('/contact', SendContactMessageController::class); Route::get('/pricing', ActivePlansController::class); -Route::get('/settings', SettingsController::class); +Route::get('/settings', GetSettingsValueController::class); // Register user Route::post('/register', CreateNewUserAction::class); diff --git a/src/Domain/Pages/Controllers/AdminPagesController.php b/src/Domain/Pages/Controllers/AdminPagesController.php index 4442f3ea..3a2c53a5 100644 --- a/src/Domain/Pages/Controllers/AdminPagesController.php +++ b/src/Domain/Pages/Controllers/AdminPagesController.php @@ -5,24 +5,15 @@ 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() + public function index(): PageCollection { return new PageCollection( Page::sortable() @@ -32,23 +23,16 @@ class AdminPagesController extends Controller /** * 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) + public function update(Request $request, Page $page): Response { // Abort in demo mode abort_if(is_demo(), 204, 'Done.'); @@ -57,6 +41,8 @@ class AdminPagesController extends Controller make_single_input($request) ); - return response(new PageResource($page), 204); + return response( + new PageResource($page), 204 + ); } } diff --git a/src/Domain/Settings/Controllers/AdminSettingsController.php b/src/Domain/Settings/Controllers/AdminSettingsController.php index dbfdf55e..d46ed760 100644 --- a/src/Domain/Settings/Controllers/AdminSettingsController.php +++ b/src/Domain/Settings/Controllers/AdminSettingsController.php @@ -1,180 +1,26 @@ column, '|') !== false) { - $columns = explode('|', $request->column); + if (str_contains($request->get('column'), '|')) { + $columns = explode('|', $request->get('column')); return Setting::whereIn('name', $columns) ->pluck('value', 'name'); } - return Setting::where('name', $request->column) + return Setting::where('name', $request->get('column')) ->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); - } } diff --git a/src/Domain/Settings/Controllers/FlushCacheController.php b/src/Domain/Settings/Controllers/FlushCacheController.php new file mode 100644 index 00000000..cde97a9c --- /dev/null +++ b/src/Domain/Settings/Controllers/FlushCacheController.php @@ -0,0 +1,29 @@ +runningUnitTests()) { + Artisan::call('cache:clear'); + Artisan::call('config:clear'); + Artisan::call('config:cache'); + } + + return response('Done', 204); + } +} \ No newline at end of file diff --git a/src/Domain/Settings/Controllers/SettingsController.php b/src/Domain/Settings/Controllers/GetSettingsValueController.php similarity index 97% rename from src/Domain/Settings/Controllers/SettingsController.php rename to src/Domain/Settings/Controllers/GetSettingsValueController.php index 9fab9d50..a601c3a9 100644 --- a/src/Domain/Settings/Controllers/SettingsController.php +++ b/src/Domain/Settings/Controllers/GetSettingsValueController.php @@ -5,7 +5,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Collection; use Domain\Settings\Models\Setting; -class SettingsController +class GetSettingsValueController { /** * List of allowed settings to get from public request diff --git a/src/Domain/Settings/Controllers/SetEmailController.php b/src/Domain/Settings/Controllers/SetEmailController.php new file mode 100644 index 00000000..d93adf2c --- /dev/null +++ b/src/Domain/Settings/Controllers/SetEmailController.php @@ -0,0 +1,39 @@ +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); + } +} \ No newline at end of file diff --git a/src/Domain/Settings/Controllers/SetStripeController.php b/src/Domain/Settings/Controllers/SetStripeController.php new file mode 100644 index 00000000..80a15818 --- /dev/null +++ b/src/Domain/Settings/Controllers/SetStripeController.php @@ -0,0 +1,77 @@ +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); + } +} \ No newline at end of file diff --git a/src/Domain/Settings/Controllers/UpdateSettingValueController.php b/src/Domain/Settings/Controllers/UpdateSettingValueController.php new file mode 100644 index 00000000..49d17fcf --- /dev/null +++ b/src/Domain/Settings/Controllers/UpdateSettingValueController.php @@ -0,0 +1,42 @@ +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); + } +} \ No newline at end of file diff --git a/tests/Domain/Admin/AdminTest.php b/tests/Domain/Admin/AdminTest.php index a5096a79..98a0b1cc 100644 --- a/tests/Domain/Admin/AdminTest.php +++ b/tests/Domain/Admin/AdminTest.php @@ -424,67 +424,4 @@ class AdminTest extends TestCase Storage::disk('local') ->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', - ]); - } } diff --git a/tests/Domain/Pages/AdminPagesTest.php b/tests/Domain/Pages/AdminPagesTest.php new file mode 100644 index 00000000..e3fec3e4 --- /dev/null +++ b/tests/Domain/Pages/AdminPagesTest.php @@ -0,0 +1,76 @@ +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', + ]); + } +} \ No newline at end of file