Skip to content

Commit

Permalink
Merge a9130bb into 321e84c
Browse files Browse the repository at this point in the history
  • Loading branch information
mostafamaklad committed Jan 26, 2019
2 parents 321e84c + a9130bb commit b44fa4c
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 13 deletions.
24 changes: 24 additions & 0 deletions src/Traits/HasPermissions.php
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,30 @@ public function hasAnyPermission(...$permissions): bool
return false;
}

/**
* Determine if the model has all of the given permissions(s).
*
* @param $permissions
*
* @return bool
* @throws \ReflectionException
*/
public function hasAllPermissions(... $permissions): bool
{
$permissions = collect($permissions)->flatten()->all();

if (is_array($permissions) && count($permissions) === 1) {
$permissions = explode('|', $permissions[0]);
}

foreach ($permissions as $permission) {
if (!$this->hasPermissionTo($permission)) {
return false;
}
}
return true;
}

/**
* Determine if the model has, via roles, the given permission.
*
Expand Down
25 changes: 12 additions & 13 deletions src/Traits/HasRoles.php
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ public function hasRole($roles): bool
return $role instanceof Role ? $role->name : $role;
});

return ! $roles->intersect($this->roles->pluck('name'))->isEmpty();
return !$roles->intersect($this->roles->pluck('name'))->isEmpty();
}

/**
Expand All @@ -163,25 +163,24 @@ public function hasAnyRole($roles): bool
/**
* Determine if the model has all of the given role(s).
*
* @param string|Role|\Illuminate\Support\Collection $roles
* @param $roles
*
* @return bool
*/
public function hasAllRoles($roles): bool
public function hasAllRoles(... $roles): bool
{
if (\is_string($roles) && false !== strpos($roles, '|')) {
$roles = \explode('|', $roles);
}
$roles = collect($roles)->flatten()->all();

if (\is_string($roles) || $roles instanceof Role) {
return $this->hasRole($roles);
if (is_array($roles) && count($roles) === 1) {
$roles = explode('|', $roles[0]);
}

$roles = \collect()->make($roles)->map(function ($role) {
return $role instanceof Role ? $role->name : $role;
});

return $roles->intersect($this->roles->pluck('name')) == $roles;
foreach ($roles as $role) {
if (!$this->hasRole($role)) {
return false;
}
}
return true;
}

/**
Expand Down
55 changes: 55 additions & 0 deletions tests/HasPermissionsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Maklad\Permission\Exceptions\GuardDoesNotMatch;
use Maklad\Permission\Exceptions\PermissionDoesNotExist;
use Maklad\Permission\Models\Permission;
use Maklad\Permission\Models\Role;
use Monolog\Logger;

Expand Down Expand Up @@ -375,4 +376,58 @@ public function it_can_sync_roles_from_a_string_on_a_permission()

$this->assertTrue($this->testUserPermission->hasRole('testRole2'));
}

/** @test
* @throws \ReflectionException
*/
public function it_can_determine_that_a_user_has_all_of_the_given_roles()
{
$permissionModel = app(Permission::class);

$this->assertFalse($this->testUser->hasAllPermissions('edit-news'));

$this->assertFalse($this->testUser->hasAllPermissions($permissionModel->all()->all()));

$this->testUser->givePermissionTo('edit-articles');

$this->refreshTestUser();

$this->assertFalse($this->testUser->hasAllPermissions(['edit-news', 'edit-articles']));

$this->testUser->givePermissionTo('edit-news');

$this->refreshTestUser();

$this->assertTrue($this->testUser->hasAllPermissions('edit-news', 'edit-articles'));
}

/** @test */
public function it_can_determine_that_the_user_has_all_of_the_permissions_directly()
{
$this->testUser->givePermissionTo('edit-articles', 'edit-news');
$this->refreshTestUser();
$this->assertTrue($this->testUser->hasAllPermissions('edit-articles', 'edit-news'));
$this->testUser->revokePermissionTo('edit-articles');
$this->refreshTestUser();
$this->assertFalse($this->testUser->hasAllPermissions('edit-articles', 'edit-news'));
}
/** @test */
public function it_can_determine_that_the_user_has_all_of_the_permissions_directly_using_an_array()
{
$this->assertFalse($this->testUser->hasAllPermissions(['edit-articles', 'edit-news']));
$this->testUser->revokePermissionTo('edit-articles');
$this->refreshTestUser();
$this->assertFalse($this->testUser->hasAllPermissions(['edit-news', 'edit-articles']));
$this->testUser->givePermissionTo('edit-news');
$this->refreshTestUser();
$this->testUser->revokePermissionTo($this->testUserPermission);
$this->assertFalse($this->testUser->hasAllPermissions(['edit-articles', 'edit-news']));
}
/** @test */
public function it_can_determine_that_the_user_has_all_of_the_permissions_via_role()
{
$this->testUserRole->givePermissionTo('edit-articles', 'edit-news');
$this->testUser->assignRole('testRole');
$this->assertTrue($this->testUser->hasAllPermissions('edit-articles', 'edit-news'));
}
}

0 comments on commit b44fa4c

Please sign in to comment.