Skip to content

Commit f5ad427

Browse files
Merge pull request #83 from mostafamaklad/v1.10
V1.10.2
2 parents 027fcfa + 19f0be8 commit f5ad427

File tree

4 files changed

+98
-14
lines changed

4 files changed

+98
-14
lines changed

src/Helpers.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,4 +132,15 @@ public function checkVersion(): bool
132132
{
133133
return ($this->isNotLumen() && app()::VERSION < '5.4');
134134
}
135+
136+
/**
137+
* @param array $items
138+
* @return array
139+
*/
140+
public function flattenArray(array $items): array
141+
{
142+
return collect($items)->map(function ($item) {
143+
return is_string($item) ? explode('|', $item): $item;
144+
})->flatten()->all();
145+
}
135146
}

src/Traits/HasPermissions.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,27 @@ public function hasAnyPermission(...$permissions): bool
281281
return false;
282282
}
283283

284+
/**
285+
* Determine if the model has all of the given permissions(s).
286+
*
287+
* @param $permissions
288+
*
289+
* @return bool
290+
* @throws \ReflectionException
291+
*/
292+
public function hasAllPermissions(... $permissions): bool
293+
{
294+
$helpers = new Helpers();
295+
$permissions = $helpers->flattenArray($permissions);
296+
297+
foreach ($permissions as $permission) {
298+
if (!$this->hasPermissionTo($permission)) {
299+
return false;
300+
}
301+
}
302+
return true;
303+
}
304+
284305
/**
285306
* Determine if the model has, via roles, the given permission.
286307
*

src/Traits/HasRoles.php

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Jenssegers\Mongodb\Eloquent\Builder;
77
use Jenssegers\Mongodb\Eloquent\Model;
88
use Maklad\Permission\Contracts\RoleInterface as Role;
9+
use Maklad\Permission\Helpers;
910
use Maklad\Permission\PermissionRegistrar;
1011
use ReflectionException;
1112

@@ -145,7 +146,7 @@ public function hasRole($roles): bool
145146
return $role instanceof Role ? $role->name : $role;
146147
});
147148

148-
return ! $roles->intersect($this->roles->pluck('name'))->isEmpty();
149+
return !$roles->intersect($this->roles->pluck('name'))->isEmpty();
149150
}
150151

151152
/**
@@ -163,25 +164,21 @@ public function hasAnyRole($roles): bool
163164
/**
164165
* Determine if the model has all of the given role(s).
165166
*
166-
* @param string|Role|\Illuminate\Support\Collection $roles
167+
* @param $roles
167168
*
168169
* @return bool
169170
*/
170-
public function hasAllRoles($roles): bool
171+
public function hasAllRoles(... $roles): bool
171172
{
172-
if (\is_string($roles) && false !== strpos($roles, '|')) {
173-
$roles = \explode('|', $roles);
174-
}
173+
$helpers = new Helpers();
174+
$roles = $helpers->flattenArray($roles);
175175

176-
if (\is_string($roles) || $roles instanceof Role) {
177-
return $this->hasRole($roles);
176+
foreach ($roles as $role) {
177+
if (!$this->hasRole($role)) {
178+
return false;
179+
}
178180
}
179-
180-
$roles = \collect()->make($roles)->map(function ($role) {
181-
return $role instanceof Role ? $role->name : $role;
182-
});
183-
184-
return $roles->intersect($this->roles->pluck('name')) == $roles;
181+
return true;
185182
}
186183

187184
/**

tests/HasPermissionsTest.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Maklad\Permission\Exceptions\GuardDoesNotMatch;
66
use Maklad\Permission\Exceptions\PermissionDoesNotExist;
7+
use Maklad\Permission\Models\Permission;
78
use Maklad\Permission\Models\Role;
89
use Monolog\Logger;
910

@@ -375,4 +376,58 @@ public function it_can_sync_roles_from_a_string_on_a_permission()
375376

376377
$this->assertTrue($this->testUserPermission->hasRole('testRole2'));
377378
}
379+
380+
/** @test
381+
* @throws \ReflectionException
382+
*/
383+
public function it_can_determine_that_a_user_has_all_of_the_given_roles()
384+
{
385+
$permissionModel = app(Permission::class);
386+
387+
$this->assertFalse($this->testUser->hasAllPermissions('edit-news'));
388+
389+
$this->assertFalse($this->testUser->hasAllPermissions($permissionModel->all()->all()));
390+
391+
$this->testUser->givePermissionTo('edit-articles');
392+
393+
$this->refreshTestUser();
394+
395+
$this->assertFalse($this->testUser->hasAllPermissions(['edit-news', 'edit-articles']));
396+
397+
$this->testUser->givePermissionTo('edit-news');
398+
399+
$this->refreshTestUser();
400+
401+
$this->assertTrue($this->testUser->hasAllPermissions('edit-news', 'edit-articles'));
402+
}
403+
404+
/** @test */
405+
public function it_can_determine_that_the_user_has_all_of_the_permissions_directly()
406+
{
407+
$this->testUser->givePermissionTo('edit-articles', 'edit-news');
408+
$this->refreshTestUser();
409+
$this->assertTrue($this->testUser->hasAllPermissions('edit-articles', 'edit-news'));
410+
$this->testUser->revokePermissionTo('edit-articles');
411+
$this->refreshTestUser();
412+
$this->assertFalse($this->testUser->hasAllPermissions('edit-articles', 'edit-news'));
413+
}
414+
/** @test */
415+
public function it_can_determine_that_the_user_has_all_of_the_permissions_directly_using_an_array()
416+
{
417+
$this->assertFalse($this->testUser->hasAllPermissions(['edit-articles', 'edit-news']));
418+
$this->testUser->revokePermissionTo('edit-articles');
419+
$this->refreshTestUser();
420+
$this->assertFalse($this->testUser->hasAllPermissions(['edit-news', 'edit-articles']));
421+
$this->testUser->givePermissionTo('edit-news');
422+
$this->refreshTestUser();
423+
$this->testUser->revokePermissionTo($this->testUserPermission);
424+
$this->assertFalse($this->testUser->hasAllPermissions(['edit-articles', 'edit-news']));
425+
}
426+
/** @test */
427+
public function it_can_determine_that_the_user_has_all_of_the_permissions_via_role()
428+
{
429+
$this->testUserRole->givePermissionTo('edit-articles', 'edit-news');
430+
$this->testUser->assignRole('testRole');
431+
$this->assertTrue($this->testUser->hasAllPermissions('edit-articles', 'edit-news'));
432+
}
378433
}

0 commit comments

Comments
 (0)