RoleHierarchyResolver::resolveRoleHierarchy()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 16
ccs 9
cts 9
cp 1
rs 9.7333
c 0
b 0
f 0
cc 4
nc 4
nop 2
crap 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