Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
8 / 8
CRAP
100.00% covered (success)
100.00%
1 / 1
RbacAuthorizationService
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
8 / 8
10
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 can
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 canAny
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 canAll
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getPermissions
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAllPermissions
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getAllSubjects
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 checkPermission
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3// ╔════════════════════════════════════════════════════════════╗
4// ║ MIT Licence (#Expat) - https://opensource.org/licenses/MIT ║
5// ║ Copyright 2026 Frederic Poeydomenge <dyno@phexium.com>     ║
6// ╚════════════════════════════════════════════════════════════╝
7
8declare(strict_types=1);
9
10namespace Phexium\Plugin\Authorization\Adapter;
11
12use Override;
13use Phexium\Plugin\Authorization\Port\AuthorizationInterface;
14use Phexium\Plugin\Authorization\Port\SubjectInterface;
15
16final readonly class RbacAuthorizationService implements AuthorizationInterface
17{
18    public function __construct(
19        private array $permissionsConfig
20    ) {}
21
22    #[Override]
23    public function can(SubjectInterface $subject, string $permission): bool
24    {
25        if ($permission === '') {
26            return false;
27        }
28
29        return $this->checkPermission($subject, $permission);
30    }
31
32    #[Override]
33    public function canAny(SubjectInterface $subject, array $permissions): bool
34    {
35        return array_any(
36            $permissions,
37            fn (string $permission): bool => $this->can($subject, $permission)
38        );
39    }
40
41    #[Override]
42    public function canAll(SubjectInterface $subject, array $permissions): bool
43    {
44        return array_all($permissions, fn (string $permission): bool => $this->can($subject, $permission));
45    }
46
47    #[Override]
48    public function getPermissions(SubjectInterface $subject): array
49    {
50        return array_values(array_unique($this->permissionsConfig[$subject->getIdentifier()] ?? []));
51    }
52
53    #[Override]
54    public function getAllPermissions(): array
55    {
56        $allPermissions = [];
57
58        foreach ($this->permissionsConfig as $permissions) {
59            $allPermissions = array_merge($allPermissions, $permissions);
60        }
61
62        return array_values(array_unique($allPermissions));
63    }
64
65    #[Override]
66    public function getAllSubjects(): array
67    {
68        return array_keys($this->permissionsConfig);
69    }
70
71    private function checkPermission(SubjectInterface $subject, string $permission): bool
72    {
73        $permissions = $this->getPermissions($subject);
74
75        return in_array($permission, $permissions, true);
76    }
77}