Skip to content

Commit 9a39065

Browse files
committed
feat: implement global permission checks for role management actions
1 parent b249678 commit 9a39065

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

contexts/Authorization/Application/Coordinators/RoleCoordinator.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
use Contexts\Authorization\Application\DTOs\Role\GetRoleListDTO;
1010
use Contexts\Authorization\Application\DTOs\Role\UpdateRoleDTO;
1111
use Contexts\Authorization\Domain\Factories\RoleFactory;
12+
use Contexts\Authorization\Domain\Policies\GlobalPermissionPolicy;
1213
use Contexts\Authorization\Domain\Repositories\RoleRepository;
1314
use Contexts\Authorization\Domain\Role\Models\Role;
1415
use Contexts\Authorization\Domain\Role\Models\RoleId;
1516
use Contexts\Authorization\Domain\Role\Models\RoleStatus;
1617
use Contexts\Shared\Application\BaseCoordinator;
18+
use Contexts\Shared\Policies\CompositePolicy;
1719
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
1820

1921
class RoleCoordinator extends BaseCoordinator
@@ -25,6 +27,10 @@ public function __construct(
2527

2628
public function create(CreateRoleDTO $data): Role
2729
{
30+
CompositePolicy::allOf([
31+
new GlobalPermissionPolicy('role.create'),
32+
])->check();
33+
2834
$role = $this->factory->create(
2935
RoleId::null(),
3036
$data->label,
@@ -36,16 +42,28 @@ public function create(CreateRoleDTO $data): Role
3642

3743
public function getRole(int $id): Role
3844
{
45+
CompositePolicy::allOf([
46+
new GlobalPermissionPolicy('role.get'),
47+
])->check();
48+
3949
return $this->repository->getById(RoleId::fromInt($id));
4050
}
4151

4252
public function getRoleList(GetRoleListDTO $data): LengthAwarePaginator
4353
{
54+
CompositePolicy::allOf([
55+
new GlobalPermissionPolicy('role.list'),
56+
])->check();
57+
4458
return $this->repository->paginate($data->currentPage, $data->perPage, $data->toCriteria(), $data->toSorting());
4559
}
4660

4761
public function updateRole(int $id, UpdateRoleDTO $data): Role
4862
{
63+
CompositePolicy::allOf([
64+
new GlobalPermissionPolicy('role.udpate'),
65+
])->check();
66+
4967
$role = $this->repository->getById(RoleId::fromInt($id));
5068
$role->modify(
5169
$data->label,
@@ -62,6 +80,10 @@ public function updateRole(int $id, UpdateRoleDTO $data): Role
6280

6381
public function subspendRole(int $id)
6482
{
83+
CompositePolicy::allOf([
84+
new GlobalPermissionPolicy('role.suspend'),
85+
])->check();
86+
6587
$role = $this->repository->getById(RoleId::fromInt($id));
6688
$role->subspend();
6789

@@ -72,6 +94,10 @@ public function subspendRole(int $id)
7294

7395
public function deleteRole(int $id)
7496
{
97+
CompositePolicy::allOf([
98+
new GlobalPermissionPolicy('role.delete'),
99+
])->check();
100+
75101
$role = $this->repository->getById(RoleId::fromInt($id));
76102
$role->delete();
77103

contexts/Authorization/Tests/Feature/RoleTest.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
<?php
22

33
declare(strict_types=1);
4+
use Contexts\Authorization\Domain\Policies\RolePolicy;
45
use Contexts\Authorization\Domain\Role\Models\RoleStatus;
56
use Contexts\Authorization\Infrastructure\Records\RoleRecord;
67

78
beforeEach(function () {
8-
$this->loginAsUser();
9+
Config::set('policies.authorization', [
10+
'context_default' => [
11+
'handler' => RolePolicy::class,
12+
'rules' => [
13+
'roles' => ['admin'],
14+
],
15+
],
16+
]);
17+
$this->loginAsAdmin();
918
});
1019

1120
it('can create active roles via api', function () {
@@ -59,12 +68,14 @@
5968
});
6069

6170
it('can get a list of roles with sorting', function () {
71+
$initialCount = RoleRecord::count();
72+
6273
RoleRecord::factory(3)->create();
6374

6475
$response = $this->get('roles?sorting=[{"id":"id","desc":false}]');
6576

6677
$response->assertStatus(200);
67-
$response->assertJsonCount(3, 'data');
78+
$response->assertJsonCount(3 + $initialCount, 'data');
6879

6980
$responseIds = collect($response->json('data'))->pluck('id')->all();
7081
$sortedIds = collect($responseIds)->sort()->values()->all();

0 commit comments

Comments
 (0)