Skip to content

Commit fef9cfc

Browse files
committed
ISSUE-345: admin privileges
1 parent 14c1b3a commit fef9cfc

File tree

8 files changed

+150
-4
lines changed

8 files changed

+150
-4
lines changed

src/Identity/OpenApi/SwaggerSchemasRequest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@
3636
type: 'boolean',
3737
example: false
3838
),
39+
new OA\Property(
40+
property: 'privileges',
41+
description: 'Array of privileges where keys are privilege names and values are booleans',
42+
properties: [
43+
new OA\Property(property: 'subscribers', type: 'boolean', example: true),
44+
new OA\Property(property: 'campaigns', type: 'boolean', example: false),
45+
new OA\Property(property: 'statistics', type: 'boolean', example: true),
46+
new OA\Property(property: 'settings', type: 'boolean', example: false),
47+
],
48+
type: 'object',
49+
example: ['subscribers' => true, 'campaigns' => false, 'statistics' => true, 'settings' => false]
50+
),
3951
],
4052
type: 'object'
4153
)]
@@ -68,6 +80,18 @@
6880
type: 'boolean',
6981
example: false
7082
),
83+
new OA\Property(
84+
property: 'privileges',
85+
description: 'Array of privileges where keys are privilege names and values are booleans',
86+
properties: [
87+
new OA\Property(property: 'subscribers', type: 'boolean', example: true),
88+
new OA\Property(property: 'campaigns', type: 'boolean', example: false),
89+
new OA\Property(property: 'statistics', type: 'boolean', example: true),
90+
new OA\Property(property: 'settings', type: 'boolean', example: false),
91+
],
92+
type: 'object',
93+
example: ['subscribers' => true, 'campaigns' => false, 'statistics' => true, 'settings' => false]
94+
),
7195
],
7296
type: 'object'
7397
)]

src/Identity/Request/CreateAdministratorRequest.php

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PhpList\Core\Domain\Identity\Model\Administrator;
88
use PhpList\Core\Domain\Identity\Model\Dto\CreateAdministratorDto;
9+
use PhpList\Core\Domain\Identity\Model\PrivilegeFlag;
910
use PhpList\RestBundle\Common\Request\RequestInterface;
1011
use PhpList\RestBundle\Identity\Validator\Constraint\UniqueEmail;
1112
use PhpList\RestBundle\Identity\Validator\Constraint\UniqueLoginName;
@@ -31,13 +32,26 @@ class CreateAdministratorRequest implements RequestInterface
3132
#[Assert\Type('bool')]
3233
public bool $superUser = false;
3334

35+
/**
36+
* Array of privileges where keys are privilege names (from PrivilegeFlag enum) and values are booleans.
37+
* Example: ['subscribers' => true, 'campaigns' => false, 'statistics' => true, 'settings' => false]
38+
*/
39+
#[Assert\Type('array')]
40+
#[Assert\All([
41+
'constraints' => [
42+
new Assert\Type(['type' => 'bool']),
43+
],
44+
])]
45+
public array $privileges = [];
46+
3447
public function getDto(): CreateAdministratorDto
3548
{
3649
return new CreateAdministratorDto(
37-
$this->loginName,
38-
$this->password,
39-
$this->email,
40-
$this->superUser
50+
loginName: $this->loginName,
51+
password: $this->password,
52+
email: $this->email,
53+
isSuperUser: $this->superUser,
54+
privileges: $this->privileges
4155
);
4256
}
4357
}

src/Identity/Request/UpdateAdministratorRequest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PhpList\Core\Domain\Identity\Model\Administrator;
88
use PhpList\Core\Domain\Identity\Model\Dto\UpdateAdministratorDto;
9+
use PhpList\Core\Domain\Identity\Model\PrivilegeFlag;
910
use PhpList\RestBundle\Common\Request\RequestInterface;
1011
use PhpList\RestBundle\Identity\Validator\Constraint\UniqueEmail;
1112
use PhpList\RestBundle\Identity\Validator\Constraint\UniqueLoginName;
@@ -29,6 +30,18 @@ class UpdateAdministratorRequest implements RequestInterface
2930
#[Assert\Type('bool')]
3031
public ?bool $superAdmin = null;
3132

33+
/**
34+
* Array of privileges where keys are privilege names (from PrivilegeFlag enum) and values are booleans.
35+
* Example: ['subscribers' => true, 'campaigns' => false, 'statistics' => true, 'settings' => false]
36+
*/
37+
#[Assert\Type('array')]
38+
#[Assert\All([
39+
'constraints' => [
40+
new Assert\Type(['type' => 'bool']),
41+
],
42+
])]
43+
public array $privileges = [];
44+
3245
public function getDto(): UpdateAdministratorDto
3346
{
3447
return new UpdateAdministratorDto(
@@ -37,6 +50,7 @@ public function getDto(): UpdateAdministratorDto
3750
password: $this->password,
3851
email: $this->email,
3952
superAdmin: $this->superAdmin,
53+
privileges: $this->privileges
4054
);
4155
}
4256
}

src/Identity/Serializer/AdministratorNormalizer.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public function normalize($object, string $format = null, array $context = []):
2626
'login_name' => $object->getLoginName(),
2727
'email' => $object->getEmail(),
2828
'super_admin' => $object->isSuperUser(),
29+
'privileges' => $object->getPrivileges()->all(),
2930
'created_at' => $object->getCreatedAt()?->format(DateTimeInterface::ATOM),
3031
];
3132
}

tests/Integration/Identity/Controller/AdministratorControllerTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,24 @@ public function testCreateAdministratorWithValidDataReturnsCreated(): void
6060
'loginName' => 'new.admin',
6161
'password' => 'NewPassword123!',
6262
'email' => '[email protected]',
63+
'privileges' => [
64+
'subscribers' => true,
65+
'campaigns' => false,
66+
'statistics' => true,
67+
'settings' => false,
68+
],
6369
]));
6470

6571
$this->assertHttpCreated();
6672
$data = $this->getDecodedJsonResponseContent();
6773
self::assertSame('new.admin', $data['login_name']);
74+
75+
$administrator = $this->administratorRepository->findOneBy(['loginName' => 'new.admin']);
76+
$privileges = $administrator->getPrivileges()->all();
77+
self::assertTrue($privileges['subscribers']);
78+
self::assertFalse($privileges['campaigns']);
79+
self::assertTrue($privileges['statistics']);
80+
self::assertFalse($privileges['settings']);
6881
}
6982

7083
public function testUpdateAdministratorReturnsOk(): void
@@ -73,11 +86,24 @@ public function testUpdateAdministratorReturnsOk(): void
7386

7487
$this->authenticatedJsonRequest('put', '/api/v2/administrators/1', [], [], [], json_encode([
7588
'email' => '[email protected]',
89+
'privileges' => [
90+
'subscribers' => false,
91+
'campaigns' => true,
92+
'statistics' => false,
93+
'settings' => true,
94+
],
7695
]));
7796

7897
$this->assertHttpOkay();
7998
$data = $this->getDecodedJsonResponseContent();
8099
self::assertSame('[email protected]', $data['email']);
100+
101+
$administrator = $this->administratorRepository->find(1);
102+
$privileges = $administrator->getPrivileges()->all();
103+
self::assertFalse($privileges['subscribers']);
104+
self::assertTrue($privileges['campaigns']);
105+
self::assertFalse($privileges['statistics']);
106+
self::assertTrue($privileges['settings']);
81107
}
82108

83109
public function testDeleteAdministratorReturnsNoContent(): void
@@ -116,4 +142,32 @@ public function testPutAdministratorWithInvalidIdReturns404(): void
116142

117143
$this->assertHttpNotFound();
118144
}
145+
146+
public function testUpdateAdministratorPrivilegesOnly(): void
147+
{
148+
$this->loadFixtures([AdministratorFixture::class]);
149+
150+
$originalAdmin = $this->administratorRepository->find(1);
151+
$originalEmail = $originalAdmin->getEmail();
152+
153+
$this->authenticatedJsonRequest('put', '/api/v2/administrators/1', [], [], [], json_encode([
154+
'privileges' => [
155+
'subscribers' => true,
156+
'campaigns' => true,
157+
'statistics' => true,
158+
'settings' => true,
159+
],
160+
]));
161+
162+
$this->assertHttpOkay();
163+
164+
$updatedAdmin = $this->administratorRepository->find(1);
165+
self::assertSame($originalEmail, $updatedAdmin->getEmail());
166+
167+
$privileges = $updatedAdmin->getPrivileges()->all();
168+
self::assertTrue($privileges['subscribers']);
169+
self::assertTrue($privileges['campaigns']);
170+
self::assertTrue($privileges['statistics']);
171+
self::assertTrue($privileges['settings']);
172+
}
119173
}

tests/Unit/Identity/Request/CreateAdministratorRequestTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,25 @@ public function testGetDtoReturnsCorrectDto(): void
1616
$request->password = 'password123';
1717
$request->email = '[email protected]';
1818
$request->superUser = true;
19+
$request->privileges = [
20+
'subscribers' => true,
21+
'campaigns' => false,
22+
'statistics' => true,
23+
'settings' => false,
24+
];
1925

2026
$dto = $request->getDto();
2127

2228
$this->assertEquals('testuser', $dto->loginName);
2329
$this->assertEquals('password123', $dto->password);
2430
$this->assertEquals('[email protected]', $dto->email);
2531
$this->assertTrue($dto->isSuperUser);
32+
$this->assertEquals([
33+
'subscribers' => true,
34+
'campaigns' => false,
35+
'statistics' => true,
36+
'settings' => false,
37+
], $dto->privileges);
2638
}
2739

2840
public function testGetDtoWithDefaultSuperUserValue(): void
@@ -38,5 +50,6 @@ public function testGetDtoWithDefaultSuperUserValue(): void
3850
$this->assertEquals('password123', $dto->password);
3951
$this->assertEquals('[email protected]', $dto->email);
4052
$this->assertFalse($dto->isSuperUser);
53+
$this->assertEquals([], $dto->privileges);
4154
}
4255
}

tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ public function testGetDtoReturnsCorrectDto(): void
1818
$request->password = 'password123';
1919
$request->email = '[email protected]';
2020
$request->superAdmin = true;
21+
$request->privileges = [
22+
'subscribers' => true,
23+
'campaigns' => false,
24+
'statistics' => true,
25+
'settings' => false,
26+
];
2127

2228
$dto = $request->getDto();
2329

@@ -26,6 +32,12 @@ public function testGetDtoReturnsCorrectDto(): void
2632
$this->assertEquals('password123', $dto->password);
2733
$this->assertEquals('[email protected]', $dto->email);
2834
$this->assertTrue($dto->superAdmin);
35+
$this->assertEquals([
36+
'subscribers' => true,
37+
'campaigns' => false,
38+
'statistics' => true,
39+
'settings' => false,
40+
], $dto->privileges);
2941
}
3042

3143
public function testGetDtoWithNullValues(): void
@@ -40,5 +52,6 @@ public function testGetDtoWithNullValues(): void
4052
$this->assertNull($dto->password);
4153
$this->assertNull($dto->email);
4254
$this->assertNull($dto->superAdmin);
55+
$this->assertEquals([], $dto->privileges);
4356
}
4457
}

tests/Unit/Identity/Serializer/AdministratorNormalizerTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use DateTime;
88
use InvalidArgumentException;
99
use PhpList\Core\Domain\Identity\Model\Administrator;
10+
use PhpList\Core\Domain\Identity\Model\Privileges;
1011
use PhpList\RestBundle\Identity\Serializer\AdministratorNormalizer;
1112
use PHPUnit\Framework\TestCase;
1213

@@ -20,6 +21,12 @@ public function testNormalizeValidAdministrator(): void
2021
$admin->method('getEmail')->willReturn('[email protected]');
2122
$admin->method('isSuperUser')->willReturn(true);
2223
$admin->method('getCreatedAt')->willReturn(new DateTime('2024-01-01T10:00:00+00:00'));
24+
$admin->method('getPrivileges')->willReturn(new Privileges([
25+
'subscribers' => true,
26+
'campaigns' => false,
27+
'statistics' => true,
28+
'settings' => false,
29+
]));
2330

2431
$normalizer = new AdministratorNormalizer();
2532
$data = $normalizer->normalize($admin);
@@ -30,6 +37,12 @@ public function testNormalizeValidAdministrator(): void
3037
'login_name' => 'admin',
3138
'email' => '[email protected]',
3239
'super_admin' => true,
40+
'privileges' => [
41+
'subscribers' => true,
42+
'campaigns' => false,
43+
'statistics' => true,
44+
'settings' => false,
45+
],
3346
'created_at' => '2024-01-01T10:00:00+00:00',
3447
], $data);
3548
}

0 commit comments

Comments
 (0)