From 57ed5e3cdab274e8e0e8e20a8304b7a3bb50c813 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 8 Jan 2026 09:11:30 +0700 Subject: [PATCH] feat: Implement policy classes for Category, Contact, and Visitor with authorization methods --- app/Filament/Pages/AdminVerification.php | 3 +- .../Pages/Settings/ManageGeneralSettings.php | 3 + .../Pages/Settings/ManageSeoSettings.php | 3 + .../Settings/ManageSocialMediaSettings.php | 3 + app/Policies/CategoryPolicy.php | 69 +++++++++++++++++++ app/Policies/ContactPolicy.php | 69 +++++++++++++++++++ app/Policies/VisitorPolicy.php | 69 +++++++++++++++++++ 7 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 app/Policies/CategoryPolicy.php create mode 100644 app/Policies/ContactPolicy.php create mode 100644 app/Policies/VisitorPolicy.php diff --git a/app/Filament/Pages/AdminVerification.php b/app/Filament/Pages/AdminVerification.php index 6175054..f5f0921 100644 --- a/app/Filament/Pages/AdminVerification.php +++ b/app/Filament/Pages/AdminVerification.php @@ -9,6 +9,7 @@ use App\Models\VerificationRequest; use App\Models\VerificationReview; use BackedEnum; +use BezhanSalleh\FilamentShield\Traits\HasPageShield; use Filament\Actions\Action; use Filament\Actions\Concerns\InteractsWithActions; use Filament\Actions\Contracts\HasActions; @@ -23,7 +24,7 @@ class AdminVerification extends Page implements HasActions, HasForms { - use InteractsWithActions, InteractsWithForms; + use HasPageShield, InteractsWithActions, InteractsWithForms; protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-user-group'; diff --git a/app/Filament/Pages/Settings/ManageGeneralSettings.php b/app/Filament/Pages/Settings/ManageGeneralSettings.php index bac0ac9..1bc4b3f 100644 --- a/app/Filament/Pages/Settings/ManageGeneralSettings.php +++ b/app/Filament/Pages/Settings/ManageGeneralSettings.php @@ -4,6 +4,7 @@ use App\Settings\GeneralSettings; use BackedEnum; +use BezhanSalleh\FilamentShield\Traits\HasPageShield; use Filament\Forms\Components\FileUpload; use Filament\Forms\Components\RichEditor; use Filament\Forms\Components\Textarea; @@ -16,6 +17,8 @@ class ManageGeneralSettings extends SettingsPage { + use HasPageShield; + protected static string|BackedEnum|null $navigationIcon = Heroicon::Cog6Tooth; protected static string $settings = GeneralSettings::class; diff --git a/app/Filament/Pages/Settings/ManageSeoSettings.php b/app/Filament/Pages/Settings/ManageSeoSettings.php index e0085a5..d41ea17 100644 --- a/app/Filament/Pages/Settings/ManageSeoSettings.php +++ b/app/Filament/Pages/Settings/ManageSeoSettings.php @@ -4,6 +4,7 @@ use App\Settings\SeoSettings; use BackedEnum; +use BezhanSalleh\FilamentShield\Traits\HasPageShield; use Filament\Forms\Components\Textarea; use Filament\Forms\Components\TextInput; use Filament\Pages\SettingsPage; @@ -14,6 +15,8 @@ class ManageSeoSettings extends SettingsPage { + use HasPageShield; + protected static string|BackedEnum|null $navigationIcon = Heroicon::MagnifyingGlass; protected static string $settings = SeoSettings::class; diff --git a/app/Filament/Pages/Settings/ManageSocialMediaSettings.php b/app/Filament/Pages/Settings/ManageSocialMediaSettings.php index 84b1c67..5a0d0fd 100644 --- a/app/Filament/Pages/Settings/ManageSocialMediaSettings.php +++ b/app/Filament/Pages/Settings/ManageSocialMediaSettings.php @@ -4,6 +4,7 @@ use App\Settings\SocialMediaSettings; use BackedEnum; +use BezhanSalleh\FilamentShield\Traits\HasPageShield; use Filament\Forms\Components\TextInput; use Filament\Pages\SettingsPage; use Filament\Schemas\Components\Grid; @@ -14,6 +15,8 @@ class ManageSocialMediaSettings extends SettingsPage { + use HasPageShield; + protected static string|BackedEnum|null $navigationIcon = Heroicon::Share; protected static string $settings = SocialMediaSettings::class; diff --git a/app/Policies/CategoryPolicy.php b/app/Policies/CategoryPolicy.php new file mode 100644 index 0000000..5cb2ec5 --- /dev/null +++ b/app/Policies/CategoryPolicy.php @@ -0,0 +1,69 @@ +can('ViewAny:Category'); + } + + public function view(AuthUser $authUser, Category $category): bool + { + return $authUser->can('View:Category'); + } + + public function create(AuthUser $authUser): bool + { + return $authUser->can('Create:Category'); + } + + public function update(AuthUser $authUser, Category $category): bool + { + return $authUser->can('Update:Category'); + } + + public function delete(AuthUser $authUser, Category $category): bool + { + return $authUser->can('Delete:Category'); + } + + public function restore(AuthUser $authUser, Category $category): bool + { + return $authUser->can('Restore:Category'); + } + + public function forceDelete(AuthUser $authUser, Category $category): bool + { + return $authUser->can('ForceDelete:Category'); + } + + public function forceDeleteAny(AuthUser $authUser): bool + { + return $authUser->can('ForceDeleteAny:Category'); + } + + public function restoreAny(AuthUser $authUser): bool + { + return $authUser->can('RestoreAny:Category'); + } + + public function replicate(AuthUser $authUser, Category $category): bool + { + return $authUser->can('Replicate:Category'); + } + + public function reorder(AuthUser $authUser): bool + { + return $authUser->can('Reorder:Category'); + } +} diff --git a/app/Policies/ContactPolicy.php b/app/Policies/ContactPolicy.php new file mode 100644 index 0000000..d276eb3 --- /dev/null +++ b/app/Policies/ContactPolicy.php @@ -0,0 +1,69 @@ +can('ViewAny:Contact'); + } + + public function view(AuthUser $authUser, Contact $contact): bool + { + return $authUser->can('View:Contact'); + } + + public function create(AuthUser $authUser): bool + { + return $authUser->can('Create:Contact'); + } + + public function update(AuthUser $authUser, Contact $contact): bool + { + return $authUser->can('Update:Contact'); + } + + public function delete(AuthUser $authUser, Contact $contact): bool + { + return $authUser->can('Delete:Contact'); + } + + public function restore(AuthUser $authUser, Contact $contact): bool + { + return $authUser->can('Restore:Contact'); + } + + public function forceDelete(AuthUser $authUser, Contact $contact): bool + { + return $authUser->can('ForceDelete:Contact'); + } + + public function forceDeleteAny(AuthUser $authUser): bool + { + return $authUser->can('ForceDeleteAny:Contact'); + } + + public function restoreAny(AuthUser $authUser): bool + { + return $authUser->can('RestoreAny:Contact'); + } + + public function replicate(AuthUser $authUser, Contact $contact): bool + { + return $authUser->can('Replicate:Contact'); + } + + public function reorder(AuthUser $authUser): bool + { + return $authUser->can('Reorder:Contact'); + } +} diff --git a/app/Policies/VisitorPolicy.php b/app/Policies/VisitorPolicy.php new file mode 100644 index 0000000..b6ea837 --- /dev/null +++ b/app/Policies/VisitorPolicy.php @@ -0,0 +1,69 @@ +can('ViewAny:Visitor'); + } + + public function view(AuthUser $authUser, Visitor $visitor): bool + { + return $authUser->can('View:Visitor'); + } + + public function create(AuthUser $authUser): bool + { + return $authUser->can('Create:Visitor'); + } + + public function update(AuthUser $authUser, Visitor $visitor): bool + { + return $authUser->can('Update:Visitor'); + } + + public function delete(AuthUser $authUser, Visitor $visitor): bool + { + return $authUser->can('Delete:Visitor'); + } + + public function restore(AuthUser $authUser, Visitor $visitor): bool + { + return $authUser->can('Restore:Visitor'); + } + + public function forceDelete(AuthUser $authUser, Visitor $visitor): bool + { + return $authUser->can('ForceDelete:Visitor'); + } + + public function forceDeleteAny(AuthUser $authUser): bool + { + return $authUser->can('ForceDeleteAny:Visitor'); + } + + public function restoreAny(AuthUser $authUser): bool + { + return $authUser->can('RestoreAny:Visitor'); + } + + public function replicate(AuthUser $authUser, Visitor $visitor): bool + { + return $authUser->can('Replicate:Visitor'); + } + + public function reorder(AuthUser $authUser): bool + { + return $authUser->can('Reorder:Visitor'); + } +}