Passed
Push — master ( 261c41...4db453 )
by Kirill
06:16 queued 11s
created

RolePermissionsCommand   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 67
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 27
dl 0
loc 67
rs 10
c 1
b 0
f 1
wmc 9

3 Methods

Rating   Name   Duplication   Size   Complexity  
A markPermissionAllowed() 0 3 2
A perform() 0 23 5
A getRolePermissions() 0 14 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Spiral\Security\Command;
6
7
use Spiral\Console\Command;
8
use Spiral\Console\Exception\CommandException;
9
use Spiral\Security\PermissionsInterface;
10
use Spiral\Security\Rule\AllowRule;
11
use Symfony\Component\Console\Input\InputArgument;
12
13
class RolePermissionsCommand extends Command
14
{
15
    protected const NAME = 'security:role:permissions';
16
    protected const DESCRIPTION = 'Get Role(s) Permissions';
17
18
    protected const ARGUMENTS = [
19
        ['role', InputArgument::OPTIONAL, 'Role to get permissions'],
20
    ];
21
22
    private const TABLE_HEADERS = ['role', 'permission', 'rule', 'allowed'];
23
24
    /**
25
     * @param PermissionsInterface $rbac
26
     *
27
     * @throws CommandException
28
     */
29
    protected function perform(PermissionsInterface $rbac): void
30
    {
31
        $role = $this->argument('role');
32
33
        if ($role !== null && !$rbac->hasRole($role)) {
34
            throw new CommandException('Unknown role provided');
35
        }
36
37
        if ($role !== null) {
38
            $rows = $this->getRolePermissions($role, $rbac);
39
        } else {
40
            $rows = [];
41
42
            foreach ($rbac->getRoles() as $role) {
43
                /** @noinspection SlowArrayOperationsInLoopInspection */
44
                $rows = array_merge(
45
                    $this->getRolePermissions($role, $rbac),
46
                    $rows
47
                );
48
            }
49
        }
50
51
        $this->table(self::TABLE_HEADERS, $rows)->render();
52
    }
53
54
    /**
55
     * Can be used in your command to prepare more complex output
56
     *
57
     * @param string $rule
58
     *
59
     * @return string|null
60
     */
61
    protected function markPermissionAllowed(string $rule): ?string
62
    {
63
        return $rule === AllowRule::class ? '+' : null;
64
    }
65
66
    private function getRolePermissions(string $role, PermissionsInterface $rbac): array
67
    {
68
        $permissions = [];
69
70
        foreach ($rbac->getPermissions($role) as $permission => $rule) {
71
            $permissions[] = [
72
                'role' => $role,
73
                'permission' => $permission,
74
                'rule' => $rule,
75
                'allowed' => $this->markPermissionAllowed($rule),
76
            ];
77
        }
78
79
        return $permissions;
80
    }
81
}
82