Passed
Push — develop ( 2b0133...275e57 )
by Mario
02:37
created

ValidValidator   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 109
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 70
dl 0
loc 109
rs 10
c 0
b 0
f 0
wmc 18

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
C validate() 0 89 17
1
<?php
2
3
namespace AppBundle\Validator\Constraints\Role\Permissions;
4
5
use Ds\Component\Api\Api\Api;
6
use Ds\Component\Security\Model\Permission;
7
use OutOfRangeException;
8
use Symfony\Component\Validator\Constraint;
9
use Symfony\Component\Validator\ConstraintValidator;
10
11
/**
12
 * Class ValidValidator
13
 *
14
 * @example
15
 * <code>
16
 * {
17
 *     "identities": [
18
 *         {
19
 *             "scope": "owned_by",
20
 *             "entity": "BusinessUnit",
21
 *             "entityUuid": "aff1370c-9cb7-432d-a608-57021637f278",
22
 *             "permissions": [
23
 *                 {
24
 *                     "key": "individual",
25
 *                     "attributes": ["BROWSE", "READ"]
26
 *                 },
27
 *                 {
28
 *                     "key": "individual_uuid",
29
 *                     "attributes": ["BROWSE", "READ"]
30
 *                 }
31
 *             ]
32
 *         }
33
 *     ]
34
 * }
35
 * </code>
36
 */
37
class ValidValidator extends ConstraintValidator
38
{
39
    /**
40
     * @var \Ds\Component\Api\Api\Api
41
     */
42
    protected $api;
43
44
    /**
45
     * Constructor
46
     *
47
     * @param \Ds\Component\Api\Api\Api $api
48
     */
49
    public function __construct(Api $api)
50
    {
51
        $this->api = $api;
52
    }
53
54
    /**
55
     * {@inheritdoc}
56
     */
57
    public function validate($role, Constraint $constraint)
58
    {
59
        foreach ($role->getPermissions() as $service => $permissions) {
60
            try {
61
                $this->api->get($service.'.access');
62
            } catch (OutOfRangeException $exception) {
63
                $this->context
64
                    ->buildViolation($constraint->serviceUndefined)
65
                    ->setParameter('{{ service }}', '"' . $service . '"')
66
                    ->atPath('permissions.' . $service)
67
                    ->addViolation();
68
69
                continue;
70
            }
71
72
            if (!is_array($permissions)) {
73
                $this->context
74
                    ->buildViolation($constraint->permissionsNotArray)
75
                    ->setParameter('{{ service }}', '"'.$service.'"')
76
                    ->atPath('permissions.'.$service)
77
                    ->addViolation();
78
79
                continue;
80
            }
81
82
            foreach ($permissions as $index => $permission) {
83
                if (!is_array($permission)) {
84
                    $this->context
85
                        ->buildViolation($constraint->permissionNotObject)
86
                        ->setParameter('{{ service }}', '"'.$service.'"')
87
                        ->atPath('permissions.'.$service.'['.$index.']')
88
                        ->addViolation();
89
90
                    continue;
91
                }
92
93
                foreach (['scope', 'entity', 'entityUuid', 'permissions'] as $attribute) {
94
                    if (!array_key_exists($attribute, $permission)) {
95
                        $this->context
96
                            ->buildViolation($constraint->permissionAttributeMissing)
97
                            ->setParameter('{{ service }}', '"'.$service.'"')
98
                            ->setParameter('{{ attribute }}', '"'.$attribute.'"')
99
                            ->atPath('permissions.'.$service.'['.$index.'].'.$attribute)
100
                            ->addViolation();
101
                    }
102
103
                    if ('permissions' === $attribute) {
104
                        if (!is_array($permission['permissions'])) {
105
                            $this->context
106
                                ->buildViolation($constraint->subpermissionsNotArray)
107
                                ->setParameter('{{ service }}', '"'.$service.'"')
108
                                ->atPath('permissions.'.$service.'['.$index.'].permissions')
109
                                ->addViolation();
110
111
                            continue;
112
                        }
113
114
                        foreach ($permission['permissions'] as $subindex => $subpermission) {
115
                            if (!is_array($subpermission)) {
116
                                $this->context
117
                                    ->buildViolation($constraint->subpermissionNotObject)
118
                                    ->setParameter('{{ service }}', '"'.$service.'"')
119
                                    ->atPath('permissions.'.$service.'['.$index.'].permissions['.$subindex.']')
120
                                    ->addViolation();
121
122
                                continue;
123
                            }
124
125
                            foreach (['key', 'attributes'] as $subattribute) {
126
                                if (!array_key_exists($subattribute, $subpermission)) {
127
                                    $this->context
128
                                        ->buildViolation($constraint->subpermissionAttributeMissing)
129
                                        ->setParameter('{{ service }}', '"'.$service.'"')
130
                                        ->setParameter('{{ attribute }}', '"'.$subattribute.'"')
131
                                        ->atPath('permissions.'.$service.'['.$index.'].'.$attribute.'['.$subindex.'].'.$subattribute)
132
                                        ->addViolation();
133
134
                                    continue;
135
                                }
136
137
                                if ('attributes' === $subattribute) {
138
                                    foreach ($subpermission['attributes'] as $item) {
139
                                        if (!in_array($item, [Permission::BROWSE, Permission::READ, Permission::EDIT, Permission::ADD, Permission::DELETE, Permission::EXECUTE])) {
140
                                            $this->context
141
                                                ->buildViolation($constraint->subpermissionUndefined)
142
                                                ->setParameter('{{ service }}', '"'.$service.'"')
143
                                                ->setParameter('{{ attribute }}', '"'.$item.'"')
144
                                                ->atPath('permissions.'.$service.'['.$index.'].'.$attribute.'['.$subindex.'].attributes')
145
                                                ->addViolation();
146
                                        }
147
                                    }
148
                                }
149
                            }
150
                        }
151
                    }
152
                }
153
            }
154
        }
155
    }
156
}
157