Skip to content

Commit

Permalink
Full uuid/ulid support
Browse files Browse the repository at this point in the history
  • Loading branch information
erikn69 committed Feb 6, 2023
1 parent d574775 commit 9394883
Show file tree
Hide file tree
Showing 8 changed files with 86 additions and 13 deletions.
4 changes: 2 additions & 2 deletions src/Models/Permission.php
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,13 @@ public static function findByName(string $name, $guardName = null): PermissionCo
/**
* Find a permission by its id (and optionally guardName).
*
* @param int $id
* @param int|string $id
* @param string|null $guardName
* @return \Spatie\Permission\Contracts\Permission
*
* @throws \Spatie\Permission\Exceptions\PermissionDoesNotExist
*/
public static function findById(int $id, $guardName = null): PermissionContract
public static function findById($id, $guardName = null): PermissionContract
{
$guardName = $guardName ?? Guard::getDefaultName(static::class);
$permission = static::getPermission([(new static())->getKeyName() => $id, 'guard_name' => $guardName]);
Expand Down
4 changes: 2 additions & 2 deletions src/Models/Role.php
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,11 @@ public static function findByName(string $name, $guardName = null): RoleContract
/**
* Find a role by its id (and optionally guardName).
*
* @param int $id
* @param int|string $id
* @param string|null $guardName
* @return \Spatie\Permission\Contracts\Role|\Spatie\Permission\Models\Role
*/
public static function findById(int $id, $guardName = null): RoleContract
public static function findById($id, $guardName = null): RoleContract
{
$guardName = $guardName ?? Guard::getDefaultName(static::class);

Expand Down
10 changes: 5 additions & 5 deletions src/Traits/HasPermissions.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ protected function convertToPermissionModels($permissions): array
if ($permission instanceof Permission) {
return $permission;
}
$method = is_string($permission) ? 'findByName' : 'findById';
$method = is_string($permission) && ! \Str::isUuid($permission) && ! \Str::isUlid($permission) ? 'findByName' : 'findById';

return $this->getPermissionClass()->{$method}($permission, $this->getDefaultGuardName());
}, Arr::wrap($permissions));
Expand All @@ -152,14 +152,14 @@ public function filterPermission($permission, $guardName = null)
{
$permissionClass = $this->getPermissionClass();

if (is_string($permission)) {
if (is_string($permission) && ! \Str::isUuid($permission) && ! \Str::isUlid($permission)) {
$permission = $permissionClass->findByName(
$permission,
$guardName ?? $this->getDefaultGuardName()
);
}

if (is_int($permission)) {
if (is_int($permission) || is_string($permission)) {
$permission = $permissionClass->findById(
$permission,
$guardName ?? $this->getDefaultGuardName()
Expand Down Expand Up @@ -204,7 +204,7 @@ protected function hasWildcardPermission($permission, $guardName = null): bool
{
$guardName = $guardName ?? $this->getDefaultGuardName();

if (is_int($permission)) {
if (is_int($permission) || \Str::isUuid($permission) || \Str::isUlid($permission)) {
$permission = $this->getPermissionClass()->findById($permission, $guardName);
}

Expand Down Expand Up @@ -449,7 +449,7 @@ protected function getStoredPermission($permissions)
{
$permissionClass = $this->getPermissionClass();

if (is_numeric($permissions)) {
if (is_numeric($permissions) || \Str::isUuid($permissions) || \Str::isUlid($permissions)) {
return $permissionClass->findById($permissions, $this->getDefaultGuardName());
}

Expand Down
8 changes: 4 additions & 4 deletions src/Traits/HasRoles.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public function scopeRole(Builder $query, $roles, $guard = null): Builder
return $role;
}

$method = is_numeric($role) ? 'findById' : 'findByName';
$method = is_numeric($role) || \Str::isUuid($role) ? 'findById' : 'findByName';

return $this->getRoleClass()->{$method}($role, $guard ?: $this->getDefaultGuardName());
}, Arr::wrap($roles));
Expand Down Expand Up @@ -195,13 +195,13 @@ public function hasRole($roles, string $guard = null): bool
$roles = $this->convertPipeToArray($roles);
}

if (is_string($roles)) {
if (is_string($roles) && ! \Str::isUuid($roles) && ! \Str::isUlid($roles)) {
return $guard
? $this->roles->where('guard_name', $guard)->contains('name', $roles)
: $this->roles->contains('name', $roles);
}

if (is_int($roles)) {
if (is_int($roles) || is_string($roles)) {
$roleClass = $this->getRoleClass();
$key = (new $roleClass())->getKeyName();

Expand Down Expand Up @@ -325,7 +325,7 @@ protected function getStoredRole($role): Role
{
$roleClass = $this->getRoleClass();

if (is_numeric($role)) {
if (is_numeric($role) || \Str::isUuid($role) || \Str::isUlid($role)) {
return $roleClass->findById($role, $this->getDefaultGuardName());
}

Expand Down
27 changes: 27 additions & 0 deletions tests/HasPermissionsWithCustomModelsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,31 @@ public function it_can_use_custom_fields_from_cache()

$this->assertSame(0, count(DB::getQueryLog()));
}

/** @test */
public function it_can_scope_users_using_a_int()
{
// Skipped because custom model uses uuid,
// replacement "it_can_scope_users_using_a_uuid"
$this->assertTrue(true);
}

/** @test */
public function it_can_scope_users_using_a_uuid()
{
$uuid1 = $this->testUserPermission->getKey();
$uuid2 = app(Permission::class)::where('name', 'edit-news')->first()->getKey();

$user1 = User::create(['email' => '[email protected]']);
$user2 = User::create(['email' => '[email protected]']);
$user1->givePermissionTo([$uuid1, $uuid2]);
$this->testUserRole->givePermissionTo($uuid1);
$user2->assignRole('testRole');

$scopedUsers1 = User::permission($uuid1)->get();
$scopedUsers2 = User::permission([$uuid2])->get();

$this->assertEquals(2, $scopedUsers1->count());
$this->assertEquals(1, $scopedUsers2->count());
}
}
20 changes: 20 additions & 0 deletions tests/Permission.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,24 @@ class Permission extends \Spatie\Permission\Models\Permission
'permission_test_id',
'name',
];

protected static function boot()
{
parent::boot();
static::creating(function ($model) {
if (empty($model->{$model->getKeyName()})) {
$model->{$model->getKeyName()} = \Str::uuid()->toString();
}
});
}

public function getIncrementing()
{
return false;
}

public function getKeyType()
{
return 'string';
}
}
20 changes: 20 additions & 0 deletions tests/Role.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,24 @@ class Role extends \Spatie\Permission\Models\Role
'role_test_id',
'name',
];

protected static function boot()
{
parent::boot();
static::creating(function ($model) {
if (empty($model->{$model->getKeyName()})) {
$model->{$model->getKeyName()} = \Str::uuid()->toString();
}
});
}

public function getIncrementing()
{
return false;
}

public function getKeyType()
{
return 'string';
}
}
6 changes: 6 additions & 0 deletions tests/TestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,13 +159,19 @@ private function prepareMigration()
'(\'id\'); // role id',
'references(\'id\') // permission id',
'references(\'id\') // role id',
'bigIncrements',
'unsignedBigInteger(PermissionRegistrar::$pivotRole)',
'unsignedBigInteger(PermissionRegistrar::$pivotPermission)',
],
[
'CreatePermissionCustomTables',
'(\'permission_test_id\');',
'(\'role_test_id\');',
'references(\'permission_test_id\')',
'references(\'role_test_id\')',
'uuid',
'uuid(PermissionRegistrar::$pivotRole)->nullable(false)',
'uuid(PermissionRegistrar::$pivotPermission)->nullable(false)',
],
file_get_contents(__DIR__.'/../database/migrations/create_permission_tables.php.stub')
);
Expand Down

0 comments on commit 9394883

Please sign in to comment.