Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
Signed-off-by: Lloric Mayuga Garcia <[email protected]>
  • Loading branch information
lloricode committed Aug 25, 2024
1 parent f5bec91 commit 78d1751
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 24 deletions.
10 changes: 10 additions & 0 deletions config/filament-permission.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
],
Expand Down
17 changes: 9 additions & 8 deletions src/Config/PermissionConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,13 @@ public static function roleNamesByGuardName(?string $guardName = null): array
return self::roleNamesGroupByGuardName()[$guardName ?? self::defaultGuardName()];
}

// /**
// * @return array<int, string>
// */
// public static function guardNames(): array
// {
// return collect(self::roleNamesGroupByGuardName())->keys()
// ->toArray();
// }
/**
* @return array<string, string>
*/
public static function customPermissionsNames(): array
{
$guardName ??= self::defaultGuardName();

Check failure on line 54 in src/Config/PermissionConfig.php

View workflow job for this annotation

GitHub Actions / phpstan

Variable $guardName on left side of ??= is never defined.

return ConfigFacade::array('filament-permission.permission_names.' . $guardName);
}
}
10 changes: 7 additions & 3 deletions src/Database/Seeders/BasePermissionSeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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();

Expand All @@ -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();
}
Expand Down
14 changes: 13 additions & 1 deletion src/Database/Seeders/DefaultPermissionSeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()
),
];
}
Expand Down Expand Up @@ -118,4 +119,15 @@ private static function getPermissionsFromPages(): array

return $permissionNames->sort()->toArray();
}

/** @return array<int, string> */
protected function getCustomPermissionNames(): array
{
return collect(PermissionConfig::customPermissionsNames())
->map(fn (string $custom) => FilamentPermissionGenerateName::getCustomPermissionName($custom))
->prepend(PermissionType::customs->value)
->values()
->sort()
->toArray();
}
}
10 changes: 8 additions & 2 deletions src/Database/Seeders/Support/PermissionSeeder.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,17 @@
{
/**
* @param array<int, ResourceSeeder> $resources
* @param array<int, string> $panels
* @param array<int, string> $pages
* @param array<int, string> $widgets
* @param array<int, string> $customs
*/
public function __construct(
public array $resources,
public array $panels,
public array $pages,
public array $widgets,
public array $resources,
public array $customs,
) {}

/**
Expand All @@ -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);
Expand Down
14 changes: 12 additions & 2 deletions src/FilamentPermissionGenerateName.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<HasPermissionWidgets> $widget */
Expand All @@ -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;
}
}
10 changes: 2 additions & 8 deletions src/Policies/RolePolicy.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand Down

0 comments on commit 78d1751

Please sign in to comment.