diff --git a/app/Http/Controllers/Admin/PagesController.php b/app/Http/Controllers/Admin/PagesController.php index 6d076916..c762349e 100644 --- a/app/Http/Controllers/Admin/PagesController.php +++ b/app/Http/Controllers/Admin/PagesController.php @@ -6,8 +6,10 @@ use App\Http\Controllers\Controller; use App\Http\Resources\PageCollection; use App\Http\Resources\PageResource; use App\Http\Tools\Demo; -use App\Page; +use App\Models\Page; +use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Request; +use Illuminate\Http\Response; class PagesController extends Controller { @@ -19,20 +21,21 @@ class PagesController extends Controller public function index() { return new PageCollection( - Page::sortable()->paginate(10) + Page::sortable() + ->paginate(10) ); } /** * Get page resource * - * @param $slug + * @param $page * @return PageResource */ - public function show($slug) + public function show(Page $page) { return new PageResource( - Page::where('slug', $slug)->first() + $page ); } @@ -40,22 +43,17 @@ class PagesController extends Controller * Update page content * * @param Request $request - * @param $slug - * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response + * @param Page $page + * @return ResponseFactory|Response */ - public function update(Request $request, $slug) + public function update(Request $request, Page $page) { - // Check if is demo if (env('APP_DEMO')) { return Demo::response_204(); } - // Get page - $page = Page::where('slug', $slug)->first(); - - // Update page $page->update(make_single_input($request)); - return response('Done', 204); + return response(new PageResource($page), 204); } } diff --git a/app/Http/Controllers/General/SetupWizardController.php b/app/Http/Controllers/General/SetupWizardController.php index 497acc9b..1d498d52 100644 --- a/app/Http/Controllers/General/SetupWizardController.php +++ b/app/Http/Controllers/General/SetupWizardController.php @@ -11,6 +11,7 @@ use App\Http\Requests\SetupWizard\StoreStripeBillingRequest; use App\Http\Requests\SetupWizard\StoreStripeCredentialsRequest; use App\Http\Requests\SetupWizard\StoreStripePlansRequest; use App\Page; +use App\Services\SetupService; use App\Services\StripeService; use App\Setting; use App\User; @@ -34,9 +35,10 @@ class SetupWizardController extends Controller /** * Inject Stripe Service */ - public function __construct(StripeService $stripe) + public function __construct() { - $this->stripe = $stripe; + $this->stripe = resolve(StripeService::class); + $this->setup = resolve(SetupService::class); } /** @@ -466,17 +468,12 @@ class SetupWizardController extends Controller ]); // Create legal pages and index content - $pages = collect(config('content.pages')); $content = $request->license === 'Extended' ? collect(config('content.content_extended')) : collect(config('content.content_regular')); $content->each(function ($content) { Setting::updateOrCreate($content); }); - $pages->each(function ($page) { - Page::updateOrCreate($page); - }); - // Retrieve access token $response = Route::dispatch(self::make_login_request($request)); @@ -506,31 +503,7 @@ class SetupWizardController extends Controller '--force' => true ]); - // Create Passport Keys - Artisan::call('passport:keys', [ - '--force' => true - ]); - - // Create Password grant client - Artisan::call('passport:client', [ - '--password' => true, - '--name' => 'vuefilemanager', - ]); - - // Create Personal access client - Artisan::call('passport:client', [ - '--personal' => true, - '--name' => 'shared', - ]); - - // Get generated client - $client = \DB::table('oauth_clients')->where('name', '=', 'vuefilemanager')->first(); - - // Set passport client to .env - setEnvironmentValue([ - 'PASSPORT_CLIENT_ID' => $client->id, - 'PASSPORT_CLIENT_SECRET' => $client->secret, - ]); + $this->setup->seed_pages(); } /** diff --git a/app/Http/Resources/PageResource.php b/app/Http/Resources/PageResource.php index 966dbf6f..4b595d38 100644 --- a/app/Http/Resources/PageResource.php +++ b/app/Http/Resources/PageResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use App\Models\Page; use Illuminate\Http\Resources\Json\JsonResource; class PageResource extends JsonResource @@ -16,7 +17,7 @@ class PageResource extends JsonResource { return [ 'data' => [ - 'id' => $this->id, + 'id' => $this->slug, 'type' => 'pages', 'attributes' => [ 'visibility' => $this->visibility, diff --git a/app/Models/Page.php b/app/Models/Page.php index 6221da76..8e8a6033 100644 --- a/app/Models/Page.php +++ b/app/Models/Page.php @@ -28,5 +28,9 @@ class Page extends Model 'content', ]; + protected $primaryKey = 'slug'; + + protected $keyType = 'string'; + public $timestamps = false; } diff --git a/app/Services/SetupService.php b/app/Services/SetupService.php index 7dc29f60..d318bafc 100644 --- a/app/Services/SetupService.php +++ b/app/Services/SetupService.php @@ -4,6 +4,7 @@ namespace App\Services; +use App\Models\Page; use Illuminate\Support\Facades\Storage; class SetupService @@ -24,4 +25,15 @@ class SetupService Storage::makeDirectory($directory); }); } + + /** + * Store default pages content like Terms of Service, Privacy Policy and Cookie Policy into database + */ + public function seed_pages() + { + collect(config('content.pages')) + ->each(function ($page) { + Page::updateOrCreate($page); + }); + } } \ No newline at end of file diff --git a/routes/admin.php b/routes/admin.php index e6e4ca20..ccb58899 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -40,8 +40,8 @@ Route::group(['prefix' => 'plans'], function () { // Pages Route::group(['prefix' => 'pages'], function () { - Route::patch('/{slug}', [PagesController::class, 'update']); - Route::get('/{slug}', [PagesController::class, 'show']); + Route::patch('/{page}', [PagesController::class, 'update']); + Route::get('/{page}', [PagesController::class, 'show']); Route::get('/', [PagesController::class, 'index']); }); diff --git a/tests/Feature/AdminTest.php b/tests/Feature/AdminTest.php index a26bb9da..aef30a29 100644 --- a/tests/Feature/AdminTest.php +++ b/tests/Feature/AdminTest.php @@ -4,6 +4,7 @@ namespace Tests\Feature; use App\Models\File; use App\Models\Folder; +use App\Models\Page; use App\Models\Setting; use App\Models\Share; use App\Models\User; @@ -435,4 +436,52 @@ class AdminTest extends TestCase Storage::disk('local') ->assertMissing($user->settings->getRawOriginal('avatar')); } + + /** + * @test + */ + public function it_get_all_pages() + { + $this->setup->seed_pages(); + + 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_pages(); + + $this->getJson('/api/admin/pages/terms-of-service') + ->assertStatus(200) + ->assertJsonFragment([ + 'slug' => 'terms-of-service' + ]); + } + + /** + * @test + */ + public function it_update_page() + { + $this->setup->seed_pages(); + + $this->patchJson('/api/admin/pages/terms-of-service', [ + 'name' => 'title', + 'value' => 'New Title' + ])->assertStatus(204); + + $this->assertDatabaseHas('pages', [ + 'title' => 'New Title' + ]); + } }