From 78d1751fe7d763bbed97feba97b698abdacee6a3 Mon Sep 17 00:00:00 2001 From: Lloric Mayuga Garcia Date: Sun, 25 Aug 2024 12:09:48 +0800 Subject: [PATCH] wip Signed-off-by: Lloric Mayuga Garcia --- config/filament-permission.php | 10 ++++++++++ src/Config/PermissionConfig.php | 17 +++++++++-------- src/Database/Seeders/BasePermissionSeeder.php | 10 +++++++--- .../Seeders/DefaultPermissionSeeder.php | 14 +++++++++++++- .../Seeders/Support/PermissionSeeder.php | 10 ++++++++-- src/FilamentPermissionGenerateName.php | 14 ++++++++++++-- src/Policies/RolePolicy.php | 10 ++-------- 7 files changed, 61 insertions(+), 24 deletions(-) diff --git a/config/filament-permission.php b/config/filament-permission.php index c92ddf8..d858394 100644 --- a/config/filament-permission.php +++ b/config/filament-permission.php @@ -32,6 +32,15 @@ ], ], + 'permission_names' => [ + 'web' => [ + // 'viewLogViewer' => 'viewLogViewer', + // 'viewPulse' => 'viewPulse', + // 'downloadBackup' => 'downloadBackup', + // 'deleteBackup' => 'deleteBackup', + ], + ], + /** * You can use this seeder class to your own project level seeder. * But this is also able to sync your adjusted permissions name by using the ready made artisan command @@ -48,6 +57,7 @@ * - public methods from Model policies class from your filament resources. * - filament pages that's implements `\Lloricode\FilamentSpatieLaravelPermissionPlugin\Contracts\HasPermissionPages`. * - filament widgets that's implements `\Lloricode\FilamentSpatieLaravelPermissionPlugin\Contracts\HasPermissionWidgets`. + * - enum class that has permission name as cases. see config `permission_name_enum` */ 'permissions' => \Lloricode\FilamentSpatieLaravelPermissionPlugin\Database\Seeders\DefaultPermissionSeeder::class, ], diff --git a/src/Config/PermissionConfig.php b/src/Config/PermissionConfig.php index e7d7885..8984818 100644 --- a/src/Config/PermissionConfig.php +++ b/src/Config/PermissionConfig.php @@ -46,12 +46,13 @@ public static function roleNamesByGuardName(?string $guardName = null): array return self::roleNamesGroupByGuardName()[$guardName ?? self::defaultGuardName()]; } - // /** - // * @return array - // */ - // public static function guardNames(): array - // { - // return collect(self::roleNamesGroupByGuardName())->keys() - // ->toArray(); - // } + /** + * @return array + */ + public static function customPermissionsNames(): array + { + $guardName ??= self::defaultGuardName(); + + return ConfigFacade::array('filament-permission.permission_names.' . $guardName); + } } diff --git a/src/Database/Seeders/BasePermissionSeeder.php b/src/Database/Seeders/BasePermissionSeeder.php index 9bab913..013ff73 100644 --- a/src/Database/Seeders/BasePermissionSeeder.php +++ b/src/Database/Seeders/BasePermissionSeeder.php @@ -33,6 +33,9 @@ function (PermissionSeeder $permissionSeeder, string $guardName) { $output->title(sprintf('Seeding permissions for guard: [%s] ...', $guardName)); + $output->text('resources'); + $this->seedResource($permissionSeeder->resources, $guardName); + $output->text('panels'); $this->seedPanelsPagesWidgets($permissionSeeder->panels, $guardName); @@ -42,8 +45,8 @@ function (PermissionSeeder $permissionSeeder, string $guardName) { $output->text('widgets'); $this->seedPanelsPagesWidgets($permissionSeeder->widgets, $guardName); - $output->text('resources'); - $this->seedResource($permissionSeeder->resources, $guardName); + $output->text('custom permissions'); + $this->seedPanelsPagesWidgets($permissionSeeder->customs, $guardName); $allPermissionNames = $permissionSeeder->allPermissionNames(); @@ -58,10 +61,11 @@ function (PermissionSeeder $permissionSeeder, string $guardName) { ->whereNotIn('name', $allPermissionNames) ->delete(); + $this->tableResources($permissionSeeder->resources); $this->tablePagesPanelWidgets('panels', $permissionSeeder->panels); $this->tablePagesPanelWidgets('pages', $permissionSeeder->pages); $this->tablePagesPanelWidgets('widgets', $permissionSeeder->widgets); - $this->tableResources($permissionSeeder->resources); + $this->tablePagesPanelWidgets('custom permissions', $permissionSeeder->customs); $output->newLine(); } diff --git a/src/Database/Seeders/DefaultPermissionSeeder.php b/src/Database/Seeders/DefaultPermissionSeeder.php index 92d0553..1b133b1 100644 --- a/src/Database/Seeders/DefaultPermissionSeeder.php +++ b/src/Database/Seeders/DefaultPermissionSeeder.php @@ -28,10 +28,11 @@ protected function permissionsByGuard(): array { return [ PermissionConfig::defaultGuardName() => new PermissionSeeder( + resources: $this->getPermissionsFromResourceModelPolicies(), panels: $this->getPermissionsFromPanels(), pages: $this->getPermissionsFromPages(), widgets: $this->getPermissionsFromWidgets(), - resources: $this->getPermissionsFromResourceModelPolicies() + customs: self::getCustomPermissionNames() ), ]; } @@ -118,4 +119,15 @@ private static function getPermissionsFromPages(): array return $permissionNames->sort()->toArray(); } + + /** @return array */ + protected function getCustomPermissionNames(): array + { + return collect(PermissionConfig::customPermissionsNames()) + ->map(fn (string $custom) => FilamentPermissionGenerateName::getCustomPermissionName($custom)) + ->prepend(PermissionType::customs->value) + ->values() + ->sort() + ->toArray(); + } } diff --git a/src/Database/Seeders/Support/PermissionSeeder.php b/src/Database/Seeders/Support/PermissionSeeder.php index a60a0ad..27f128b 100644 --- a/src/Database/Seeders/Support/PermissionSeeder.php +++ b/src/Database/Seeders/Support/PermissionSeeder.php @@ -8,12 +8,17 @@ { /** * @param array $resources + * @param array $panels + * @param array $pages + * @param array $widgets + * @param array $customs */ public function __construct( + public array $resources, public array $panels, public array $pages, public array $widgets, - public array $resources, + public array $customs, ) {} /** @@ -23,7 +28,8 @@ public function allPermissionNames(): array { $collect = collect($this->panels) ->merge($this->pages) - ->merge($this->widgets); + ->merge($this->widgets) + ->merge($this->customs); foreach ($this->resources as $resource) { $collect = $collect->merge($resource->permissionNames); diff --git a/src/FilamentPermissionGenerateName.php b/src/FilamentPermissionGenerateName.php index 3d68871..a878e90 100644 --- a/src/FilamentPermissionGenerateName.php +++ b/src/FilamentPermissionGenerateName.php @@ -7,6 +7,7 @@ use Filament\Facades\Filament; use Filament\Panel; use Illuminate\Support\Str; +use Lloricode\FilamentSpatieLaravelPermissionPlugin\Config\PermissionConfig; use Lloricode\FilamentSpatieLaravelPermissionPlugin\Contracts\HasPermissionPages; use Lloricode\FilamentSpatieLaravelPermissionPlugin\Contracts\HasPermissionWidgets; use Lloricode\FilamentSpatieLaravelPermissionPlugin\Enums\PermissionType; @@ -42,7 +43,7 @@ public static function getPagePermissionName(HasPermissionPages | string $page): $page = $page::class; } - return once(fn () => PermissionType::pages->value . '.' . Str::of($page)->classBasename()->camel()); + return PermissionType::pages->value . '.' . Str::of($page)->classBasename()->camel(); } /** @param HasPermissionWidgets|class-string $widget */ @@ -52,6 +53,15 @@ public static function getWidgetPermissionName(HasPermissionWidgets | string $wi $widget = $widget::class; } - return once(fn () => PermissionType::widgets->value . '.' . Str::of($widget)->classBasename()->camel()); + return PermissionType::widgets->value . '.' . Str::of($widget)->classBasename()->camel(); + } + + public static function getCustomPermissionName(string $customPermissionName): string + { + if (! in_array($customPermissionName, PermissionConfig::customPermissionsNames(), true)) { + throw new \Exception('Custom permission [' . $customPermissionName . '] not found.'); + } + + return PermissionType::customs->value . '.' . $customPermissionName; } } diff --git a/src/Policies/RolePolicy.php b/src/Policies/RolePolicy.php index 4b80a68..ea7da91 100644 --- a/src/Policies/RolePolicy.php +++ b/src/Policies/RolePolicy.php @@ -19,10 +19,7 @@ public function viewAny(User $user): bool public function view(User $user, RoleContract $role): bool { - if (in_array($role->name, [ - PermissionConfig::superAdmin($role->guard_name), - PermissionConfig::admin($role->guard_name), - ], true)) { + if ($role->name === PermissionConfig::superAdmin($role->guard_name)) { return false; } @@ -36,10 +33,7 @@ public function create(User $user): bool public function update(User $user, RoleContract $role): bool { - if (in_array($role->name, [ - PermissionConfig::superAdmin($role->guard_name), - PermissionConfig::admin($role->guard_name), - ], true)) { + if ($role->name === PermissionConfig::superAdmin($role->guard_name)) { return false; }