Skip to content

Commit

Permalink
Merge f6b19db into 321e84c
Browse files Browse the repository at this point in the history
  • Loading branch information
mostafamaklad committed Jan 28, 2019
2 parents 321e84c + f6b19db commit ee59f51
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 14 deletions.
11 changes: 11 additions & 0 deletions src/Helpers.php
Original file line number Diff line number Diff line change
Expand Up @@ -132,4 +132,15 @@ public function checkVersion(): bool
{
return ($this->isNotLumen() && app()::VERSION < '5.4');
}

/**
* @param array $items
* @return array
*/
public function flattenArray(array $items): array
{
return collect($items)->map(function ($item) {
return is_string($item) ? explode('|', $item): $item;
})->flatten()->all();
}
}
21 changes: 21 additions & 0 deletions src/Traits/HasPermissions.php
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,27 @@ 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
{
$helpers = new Helpers();
$permissions = $helpers->flattenArray($permissions);

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: 11 additions & 14 deletions src/Traits/HasRoles.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Jenssegers\Mongodb\Eloquent\Builder;
use Jenssegers\Mongodb\Eloquent\Model;
use Maklad\Permission\Contracts\RoleInterface as Role;
use Maklad\Permission\Helpers;
use Maklad\Permission\PermissionRegistrar;
use ReflectionException;

Expand Down Expand Up @@ -145,7 +146,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 +164,21 @@ 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);
}
$helpers = new Helpers();
$roles = $helpers->flattenArray($roles);

if (\is_string($roles) || $roles instanceof Role) {
return $this->hasRole($roles);
foreach ($roles as $role) {
if (!$this->hasRole($role)) {
return false;
}
}

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

return $roles->intersect($this->roles->pluck('name')) == $roles;
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 ee59f51

Please sign in to comment.