From e322e852607e7371605efb5701f8d62e7674dc8b Mon Sep 17 00:00:00 2001 From: PUMCZACZ Date: Sun, 9 Jun 2024 22:31:07 +0200 Subject: [PATCH 1/4] add change material status --- .../Admin/Controllers/MaterialsController.php | 17 ++++-- app/Domains/Materials/Models/Material.php | 12 ++++ .../Models/Policies/MaterialPolicy.php | 5 ++ .../Materials/States/MaterialState.php | 3 + app/Domains/Users/Models/User.php | 2 +- .../Auth/AuthenticatedSessionController.php | 1 + database/seeders/DatabaseSeeder.php | 2 +- .../MaterialEdit/MaterialChangeStatus.vue | 36 ++++++++++++ .../Admin/MaterialEdit/MaterialPublish.vue | 8 +-- resources/js/Layouts/AuthenticatedLayout.vue | 3 +- resources/js/Pages/Admin/MaterialsEdit.vue | 57 +++++++++++++++++-- routes/admin.php | 2 +- 12 files changed, 129 insertions(+), 19 deletions(-) create mode 100644 resources/js/Components/Admin/MaterialEdit/MaterialChangeStatus.vue diff --git a/app/Domains/Admin/Controllers/MaterialsController.php b/app/Domains/Admin/Controllers/MaterialsController.php index 6bc9dc2..195d444 100644 --- a/app/Domains/Admin/Controllers/MaterialsController.php +++ b/app/Domains/Admin/Controllers/MaterialsController.php @@ -4,7 +4,11 @@ use App\Domains\Materials\Models\Enums\PresetEnum; use App\Domains\Materials\Models\Material; use App\Domains\Materials\Repositories\MaterialsRepository; +use App\Domains\Materials\States\Archived; +use App\Domains\Materials\States\Draft; +use App\Domains\Materials\States\MaterialState; use App\Domains\Materials\States\Published; +use App\Domains\Reviews\Models\Review; use App\Domains\Users\Roles\FrontendPermissionsAccessor; use App\Helpers\ComponentsHelper; use App\Http\Controllers\Controller; @@ -54,15 +58,18 @@ public function destroy(Material $material) return back(); } - public function publish(Material $material) + public function changeStatus(Material $material, string $status) { - if (Auth::user()->cannot('publish', $material)) { + if (Auth::user()->cannot('manageMaterial', $material)) { abort(403); } - if (!$material->isPublished()) { - $material->state->transitionTo(Published::class); - } + match ($status) { + default => null, + 'draft' => $material->isDraft() ? null : $material->state->transitionTo(Draft::class), + 'published' => $material->isPublished() ? null : $material->state->transitionTo(Published::class), + 'archived' => $material->isArchived() ? null : $material->state->transitionTo(Archived::class), + }; return back(); } diff --git a/app/Domains/Materials/Models/Material.php b/app/Domains/Materials/Models/Material.php index c982219..895e131 100644 --- a/app/Domains/Materials/Models/Material.php +++ b/app/Domains/Materials/Models/Material.php @@ -5,6 +5,8 @@ use App\Domains\Files\Models\Attachment; use App\Domains\Materials\Factories\MaterialFactory; use App\Domains\Materials\Models\Scopes\MaterialTypeScope; +use App\Domains\Materials\States\Archived; +use App\Domains\Materials\States\Draft; use App\Domains\Materials\States\MaterialState; use App\Domains\Materials\States\Published; use App\Domains\Migration\Models\Post; @@ -284,4 +286,14 @@ public function isPublished(): bool { return $this->state->getValue() === Published::class; } + + public function isArchived(): bool + { + return $this->state->getValue() === Archived::class; + } + + public function isDraft(): bool + { + return $this->state->getValue() === Draft::class; + } } diff --git a/app/Domains/Materials/Models/Policies/MaterialPolicy.php b/app/Domains/Materials/Models/Policies/MaterialPolicy.php index 1c12d1b..80b5a6f 100644 --- a/app/Domains/Materials/Models/Policies/MaterialPolicy.php +++ b/app/Domains/Materials/Models/Policies/MaterialPolicy.php @@ -108,4 +108,9 @@ public function review(User $user, Material $material): bool return $user->hasPermissionTo(PermissionsEnum::MATERIAL_REVIEW); } + + public function manageMaterial(User $user, Material $material): bool + { + return $user->hasPermissionTo(PermissionsEnum::MATERIAL_MANAGE); + } } diff --git a/app/Domains/Materials/States/MaterialState.php b/app/Domains/Materials/States/MaterialState.php index 0df7ccd..a60addb 100644 --- a/app/Domains/Materials/States/MaterialState.php +++ b/app/Domains/Materials/States/MaterialState.php @@ -27,6 +27,9 @@ public static function config(): StateConfig InReview::class, ], Published::class, AnyToPublishedTransition::class) ->allowTransition(InReview::class, ChangesRequested::class) + ->allowTransition(Published::class, Draft::class) + ->allowTransition(Published::class, Archived::class) + ->allowTransition(Archived::class, Draft::class) ->allowTransition([ InReview::class, Draft::class, diff --git a/app/Domains/Users/Models/User.php b/app/Domains/Users/Models/User.php index 8fdf3b4..be496f3 100644 --- a/app/Domains/Users/Models/User.php +++ b/app/Domains/Users/Models/User.php @@ -31,7 +31,7 @@ */ class User extends Authenticatable { - use HasApiTokens; +// use HasApiTokens; use HasFactory; use Notifiable; use HasRoles { diff --git a/app/Http/Controllers/Auth/AuthenticatedSessionController.php b/app/Http/Controllers/Auth/AuthenticatedSessionController.php index a2583f3..e2a4652 100644 --- a/app/Http/Controllers/Auth/AuthenticatedSessionController.php +++ b/app/Http/Controllers/Auth/AuthenticatedSessionController.php @@ -27,6 +27,7 @@ public function create(): Response public function store(LocalLoginRequest $request): RedirectResponse { Auth::login(User::find($request->input('userid'))); + $request->session()->regenerate(); return redirect()->intended(RouteServiceProvider::HOME); diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 64a318a..91d8250 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -11,6 +11,6 @@ public function run() $this->call(TagsSeeder::class); $this->call(LicensesSeeder::class); $this->call(RemoveContributorSeeder::class); - $this->call(SlideSeeder::class); +// $this->call(SlideSeeder::class); } } diff --git a/resources/js/Components/Admin/MaterialEdit/MaterialChangeStatus.vue b/resources/js/Components/Admin/MaterialEdit/MaterialChangeStatus.vue new file mode 100644 index 0000000..5a34d4a --- /dev/null +++ b/resources/js/Components/Admin/MaterialEdit/MaterialChangeStatus.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/resources/js/Components/Admin/MaterialEdit/MaterialPublish.vue b/resources/js/Components/Admin/MaterialEdit/MaterialPublish.vue index 4965cad..70d02a5 100644 --- a/resources/js/Components/Admin/MaterialEdit/MaterialPublish.vue +++ b/resources/js/Components/Admin/MaterialEdit/MaterialPublish.vue @@ -10,14 +10,14 @@ const props = usePage().props.material;