From 9f24a059b5646dc50fdd14faa1b1a82ffe6f9f79 Mon Sep 17 00:00:00 2001 From: Lloric Mayuga Garcia Date: Sun, 11 Aug 2024 17:11:00 +0800 Subject: [PATCH] optimize calling permission models Signed-off-by: Lloric Mayuga Garcia --- src/Actions/CreateRoleAction.php | 15 ++++----- src/Actions/EditRoleAction.php | 2 +- src/Database/Seeders/BasePermissionSeeder.php | 6 ++-- src/Database/Seeders/DefaultRoleSeeder.php | 33 +++++++++++-------- src/Models/Permission.php | 30 ----------------- tests/Actions/EditRoleActionTest.php | 3 +- tests/Helpers.php | 21 +++++------- 7 files changed, 39 insertions(+), 71 deletions(-) delete mode 100644 src/Models/Permission.php diff --git a/src/Actions/CreateRoleAction.php b/src/Actions/CreateRoleAction.php index 39580f4..e079e5a 100644 --- a/src/Actions/CreateRoleAction.php +++ b/src/Actions/CreateRoleAction.php @@ -7,21 +7,20 @@ use Illuminate\Database\Eloquent\Model; use Lloricode\FilamentSpatieLaravelPermissionPlugin\Data\RoleData; use Spatie\Permission\Contracts\Role as RoleContract; -use Spatie\Permission\PermissionRegistrar; -final readonly class CreateRoleAction +readonly class CreateRoleAction { - public function __construct(private PermissionRegistrar $permissionRegistrar) {} + public function __construct(private RoleContract $roleContract) {} public function execute(RoleData $roleData): RoleContract & Model { /** @var RoleContract&Model $role */ - $role = $this->permissionRegistrar->getRoleClass()::create([ - 'name' => $roleData->name, - 'guard_name' => $roleData->guard_name, - ]); + $role = $this->roleContract->findOrCreate( + name: $roleData->name, + guardName: $roleData->guard_name, + ); - $role->syncPermissions($roleData->permissions); + $role->givePermissionTo($roleData->permissions); return $role; } diff --git a/src/Actions/EditRoleAction.php b/src/Actions/EditRoleAction.php index c54ff4f..a2e3caf 100644 --- a/src/Actions/EditRoleAction.php +++ b/src/Actions/EditRoleAction.php @@ -9,7 +9,7 @@ use Lloricode\FilamentSpatieLaravelPermissionPlugin\Data\RoleData; use Spatie\Permission\Contracts\Role as RoleContract; -final readonly class EditRoleAction +readonly class EditRoleAction { public function execute(RoleContract & Model $role, RoleData $roleData): RoleContract & Model { diff --git a/src/Database/Seeders/BasePermissionSeeder.php b/src/Database/Seeders/BasePermissionSeeder.php index 0d0c478..b7bdd9a 100644 --- a/src/Database/Seeders/BasePermissionSeeder.php +++ b/src/Database/Seeders/BasePermissionSeeder.php @@ -7,8 +7,7 @@ use Illuminate\Database\Seeder; use Illuminate\Support\Collection; use Illuminate\Support\Str; -use Lloricode\FilamentSpatieLaravelPermissionPlugin\Models\Permission; -use Spatie\Permission\PermissionRegistrar; +use Spatie\Permission\Contracts\Permission as PermissionContract; abstract class BasePermissionSeeder extends Seeder { @@ -16,8 +15,7 @@ abstract protected function permissionsByGuard(): array; public function run(): void { - /** @var Permission $permissionClass */ - $permissionClass = app(PermissionRegistrar::class)->getPermissionClass(); + $permissionClass = app(PermissionContract::class); collect($this->permissionsByGuard()) ->map(fn (array $permissions) => collect($permissions)) diff --git a/src/Database/Seeders/DefaultRoleSeeder.php b/src/Database/Seeders/DefaultRoleSeeder.php index 87d31b5..61e91bd 100644 --- a/src/Database/Seeders/DefaultRoleSeeder.php +++ b/src/Database/Seeders/DefaultRoleSeeder.php @@ -5,14 +5,14 @@ namespace Lloricode\FilamentSpatieLaravelPermissionPlugin\Database\Seeders; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Config; -use Spatie\Permission\Commands\CreateRole; use Spatie\Permission\Contracts\Permission as PermissionContract; +use Spatie\Permission\Contracts\Role as RoleContract; class DefaultRoleSeeder extends Seeder { public function __construct( + protected readonly RoleContract $roleContract, protected readonly PermissionContract $permissionContract, ) {} @@ -22,23 +22,28 @@ public function __construct( public function run(): void { $guard = Config::string('filament-permission.guard'); + foreach (Config::array('filament-permission.roles') as $roleName) { - Artisan::call(CreateRole::class, [ - 'name' => $roleName, - 'guard' => $guard, - 'permissions' => config('filament-permission.roles.admin') === $roleName - ? $this->permissionContract + + $role = $this->roleContract->findOrCreate( + name: $roleName, + guardName: $guard, + ); + + if (config('filament-permission.roles.admin') === $roleName) { + $role->givePermissionTo( + $this->permissionContract ->where('guard_name', $guard) ->pluck('name') - ->implode('|') - : null, - ]); + ); + } } + foreach (Config::array('filament-permission.extra_roles') as $roleName) { - Artisan::call(CreateRole::class, [ - 'name' => $roleName, - 'guard' => $guard, - ]); + $this->roleContract->findOrCreate( + name: $roleName, + guardName: $guard, + ); } } diff --git a/src/Models/Permission.php b/src/Models/Permission.php deleted file mode 100644 index 8352c8a..0000000 --- a/src/Models/Permission.php +++ /dev/null @@ -1,30 +0,0 @@ - $permissions - * @property-read int|null $permissions_count - * @property-read \Illuminate\Database\Eloquent\Collection $roles - * @property-read int|null $roles_count - * @property-read \Illuminate\Database\Eloquent\Collection $users - * @property-read int|null $users_count - * - * @method static \Illuminate\Database\Eloquent\Builder|Permission newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Permission newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Permission permission($permissions, $without = false) - * @method static \Illuminate\Database\Eloquent\Builder|Permission query() - * @method static \Illuminate\Database\Eloquent\Builder|Permission role($roles, $guard = null, $without = false) - * @method static \Illuminate\Database\Eloquent\Builder|Permission withoutPermission($permissions) - * @method static \Illuminate\Database\Eloquent\Builder|Permission withoutRole($roles, $guard = null) - */ -class Permission extends \Spatie\Permission\Models\Permission {} diff --git a/tests/Actions/EditRoleActionTest.php b/tests/Actions/EditRoleActionTest.php index 1d71ea2..0aa7d6b 100644 --- a/tests/Actions/EditRoleActionTest.php +++ b/tests/Actions/EditRoleActionTest.php @@ -9,6 +9,7 @@ use Lloricode\FilamentSpatieLaravelPermissionPlugin\Actions\EditRoleAction; use Lloricode\FilamentSpatieLaravelPermissionPlugin\Data\RoleData; use Spatie\Permission\Contracts\Role; +use Spatie\Permission\Contracts\Role as RoleContract; use function PHPUnit\Framework\assertTrue; @@ -19,7 +20,7 @@ )); /** @var array $roles */ - $roles = registrarRole()::whereIn('name', $roleNames)->get(); + $roles = app(RoleContract::class)::whereIn('name', $roleNames)->get(); $action = app(EditRoleAction::class); diff --git a/tests/Helpers.php b/tests/Helpers.php index b6836ae..29e713e 100644 --- a/tests/Helpers.php +++ b/tests/Helpers.php @@ -2,12 +2,10 @@ declare(strict_types=1); -use Illuminate\Support\Facades\Artisan; +use Illuminate\Database\Eloquent\Model; use Lloricode\FilamentSpatieLaravelPermissionPlugin\Models\Role; use Lloricode\FilamentSpatieLaravelPermissionPlugin\Tests\Fixture\UserFactory; -use Spatie\Permission\Commands\CreateRole; use Spatie\Permission\Contracts\Role as RoleContract; -use Spatie\Permission\PermissionRegistrar; use function Pest\Laravel\actingAs; @@ -20,17 +18,14 @@ function loginAsSuperAdmin() return $user; } -function createRole(string $name, ?string $guard = null): RoleContract +function createRole(string $name, ?string $guard = null): RoleContract & Model { - Artisan::call(CreateRole::class, [ - 'name' => $name, - 'guard' => $guard ?? config('filament-permission.guard'), - ]); - return registrarRole()::findByName($name); -} + /** @var RoleContract&Model $role */ + $role = app(RoleContract::class)->findOrCreate( + name: $name, + guardName: $guard ?? config('filament-permission.guard'), + ); -function registrarRole(): RoleContract -{ - return app(app(PermissionRegistrar::class)->getRoleClass()); + return $role; }