Skip to content

Commit 9597736

Browse files
committed
feat: implement RoleLabelUniquenessService for role label validation and integrate RoleFactory in RoleCoordinator
1 parent 1ae358b commit 9597736

File tree

4 files changed

+50
-12
lines changed

4 files changed

+50
-12
lines changed

contexts/Authorization/Application/Coordinators/RoleCoordinator.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Contexts\Authorization\Application\DTOs\Role\CreateRoleDTO;
1010
use Contexts\Authorization\Application\DTOs\Role\GetRoleListDTO;
1111
use Contexts\Authorization\Application\DTOs\Role\UpdateRoleDTO;
12+
use Contexts\Authorization\Domain\Factories\RoleFactory;
1213
use Contexts\Authorization\Domain\Repositories\RoleRepository;
1314
use Contexts\Authorization\Domain\Role\Models\Role;
1415
use Contexts\Authorization\Domain\Role\Models\RoleId;
@@ -18,12 +19,14 @@
1819
class RoleCoordinator extends BaseCoordinator
1920
{
2021
public function __construct(
21-
private RoleRepository $repository
22-
) {}
22+
private RoleRepository $repository,
23+
private RoleFactory $factory
24+
) {
25+
}
2326

2427
public function create(CreateRoleDTO $data): Role
2528
{
26-
$role = Role::create(
29+
$role = $this->factory->create(
2730
RoleId::null(),
2831
$data->label,
2932
$data->created_at ? CarbonImmutable::parse($data->created_at) : null
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Contexts\Authorization\Domain\Services;
6+
7+
use App\Exceptions\BizException;
8+
use Contexts\Authorization\Domain\Repositories\RoleRepository;
9+
10+
class RoleLabelUniquenessService
11+
{
12+
public function __construct(
13+
private readonly RoleRepository $roleRepository
14+
) {}
15+
16+
public function ensureUnique(string $label)
17+
{
18+
if ($this->roleRepository->existsByLabel($label)) {
19+
throw BizException::make('Role label already exists: :label')
20+
->with('label', $label);
21+
}
22+
}
23+
}

contexts/Authorization/Tests/Feature/Application/GlobalPermissionServiceCoordinatorTest.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
use Contexts\Authorization\Infrastructure\Persistence\UserPersistence;
1313
use Contexts\Authorization\Infrastructure\Records\UserRecord;
1414
use Illuminate\Support\Facades\Config;
15+
use Contexts\Authorization\Domain\Services\RoleLabelUniquenessService;
16+
use Contexts\Authorization\Domain\Factories\RoleFactory;
1517

1618
beforeEach(function () {
1719
Config::set('policies.article_publishing', [
@@ -37,6 +39,10 @@
3739
],
3840
],
3941
]);
42+
43+
$this->roleLabelUniquenessService = mock(RoleLabelUniquenessService::class);
44+
$this->roleLabelUniquenessService->shouldReceive('ensureUnique')->andReturn(true);
45+
$this->roleFactory = new RoleFactory($this->roleLabelUniquenessService);
4046
});
4147

4248
it('can be instantiated through container', function () {
@@ -47,15 +53,15 @@
4753

4854
it('can check permission for admin user', function () {
4955
// Setup repositories
50-
$userPersistence = new UserPersistence;
51-
$rolePersistence = new RolePersistence;
56+
$userPersistence = new UserPersistence();
57+
$rolePersistence = new RolePersistence();
5258

5359
// Create admin user
5460
$userRecord = UserRecord::factory()->create();
5561
$this->actingAs($userRecord);
5662

5763
// Create admin role
58-
$adminRole = Role::create(RoleId::null(), 'admin');
64+
$adminRole = $this->roleFactory->create(RoleId::null(), 'admin');
5965
$adminRole = $rolePersistence->create($adminRole);
6066

6167
// Assign admin role to user
@@ -70,15 +76,15 @@
7076

7177
it('denies permission for users without required roles', function () {
7278
// Setup repositories
73-
$userPersistence = new UserPersistence;
74-
$rolePersistence = new RolePersistence;
79+
$userPersistence = new UserPersistence();
80+
$rolePersistence = new RolePersistence();
7581

7682
// Create regular user
7783
$userRecord = UserRecord::factory()->create();
7884
$this->actingAs($userRecord);
7985

8086
// Create editor role (not admin)
81-
$editorRole = Role::create(RoleId::null(), 'editor');
87+
$editorRole = $this->roleFactory->create(RoleId::null(), 'editor');
8288
$editorRole = $rolePersistence->create($editorRole);
8389

8490
// Assign editor role to user

contexts/Authorization/Tests/Feature/PolicyTest.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
use Contexts\Authorization\Infrastructure\Persistence\UserPersistence;
1212
use Contexts\Authorization\Infrastructure\Records\UserRecord;
1313
use Illuminate\Support\Facades\Config;
14+
use Contexts\Authorization\Domain\Services\RoleLabelUniquenessService;
15+
use Contexts\Authorization\Domain\Factories\RoleFactory;
1416

1517
beforeEach(function () {
1618
Config::set('policies.article_publishing', [
@@ -30,6 +32,10 @@
3032
],
3133
],
3234
]);
35+
36+
$this->roleLabelUniquenessService = mock(RoleLabelUniquenessService::class);
37+
$this->roleLabelUniquenessService->shouldReceive('ensureUnique')->andReturn(true);
38+
$this->roleFactory = new RoleFactory($this->roleLabelUniquenessService);
3339
});
3440

3541
it('can get default policy handler', function () {
@@ -41,14 +47,14 @@
4147
});
4248

4349
it('can evaluate user against policy', function () {
44-
$userPersistence = new UserPersistence;
50+
$userPersistence = new UserPersistence();
4551

4652
$userRecord = UserRecord::factory()->create();
4753

4854
$this->actingAs($userRecord);
4955

50-
$role = Role::create(RoleId::null(), 'admin');
51-
$rolePersistence = new RolePersistence;
56+
$role = $this->roleFactory->create(RoleId::null(), 'admin');
57+
$rolePersistence = new RolePersistence();
5258
$role = $rolePersistence->create($role);
5359

5460
$user = $userRecord->toDomain();

0 commit comments

Comments
 (0)