RoleHierarchyResolver   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 6
lcom 1
cbo 2
dl 0
loc 62
ccs 20
cts 20
cp 1
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A resolve() 0 12 1
A resolveRoleHierarchy() 0 16 4
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Chubbyphp\Security\Authorization;
6
7
use Psr\Log\LoggerInterface;
8
use Psr\Log\NullLogger;
9
10
final class RoleHierarchyResolver implements RoleHierarchyResolverInterface
11
{
12
    /**
13
     * @var array
14
     */
15
    private $roleHierarchy;
16
17
    /**
18
     * @var LoggerInterface
19
     */
20
    private $logger;
21
22
    /**
23
     * @param array $roleHierarchy
24
     */
25 3
    public function __construct(array $roleHierarchy = [], LoggerInterface $logger = null)
26
    {
27 3
        $this->roleHierarchy = $roleHierarchy;
28 3
        $this->logger = $logger ?? new NullLogger();
29 3
    }
30
31
    /**
32
     * @param array $roles
33
     *
34
     * @return array
35
     */
36 3
    public function resolve(array $roles): array
37
    {
38 3
        $resolvedRoles = array_unique($this->resolveRoleHierarchy($roles));
39 3
        sort($resolvedRoles);
40
41 3
        $this->logger->info(
42 3
            'security.authorization.rolehierarchyresolver: resolved roles {resolvedRoles} by given roles {roles}',
43 3
            ['resolvedRoles' => implode(', ', $resolvedRoles), 'roles' => implode(', ', $roles)]
44
        );
45
46 3
        return $resolvedRoles;
47
    }
48
49
    /**
50
     * @param array $roles
51
     * @param array $alreadySolvedRoles
52
     *
53
     * @return array
54
     */
55 3
    private function resolveRoleHierarchy(array $roles, array $alreadySolvedRoles = []): array
56
    {
57 3
        foreach ($roles as $role) {
58 3
            if (isset($this->roleHierarchy[$role])) {
59 2
                if (in_array($role, $alreadySolvedRoles, true)) {
60 1
                    continue;
61
                }
62
63 2
                $alreadySolvedRoles[] = $role;
64 2
                $resolveRoles = $this->resolveRoleHierarchy($this->roleHierarchy[$role], $alreadySolvedRoles);
65 3
                $roles = array_merge($roles, $resolveRoles);
66
            }
67
        }
68
69 3
        return $roles;
70
    }
71
}
72