Role   A
last analyzed

Complexity

Total Complexity 35

Size/Duplication

Total Lines 308
Duplicated Lines 0 %

Importance

Changes 3
Bugs 1 Features 1
Metric Value
wmc 35
eloc 127
c 3
b 1
f 1
dl 0
loc 308
rs 9.6

17 Methods

Rating   Name   Duplication   Size   Complexity  
A validateUniqueName() 0 7 3
A scenarios() 0 8 1
A attributeLabels() 0 9 1
A getRolePermissions() 0 11 3
A getItemsPermissions() 0 12 3
A rules() 0 28 1
A tree() 0 8 1
A getRoleChildArray() 0 10 3
A getRoleItemsArray() 0 10 3
A getRolesByRole() 0 11 3
A processCheckRoleName() 0 9 3
A getPermissionsByRole() 0 11 3
A getRoleChild() 0 4 1
A rolesArray() 0 8 1
A getItemsRoles() 0 12 3
A getChildren() 0 4 1
A getRoles() 0 4 1
1
<?php
2
3
namespace modules\rbac\models;
4
5
use Yii;
6
use yii\base\Model;
7
use yii\rbac\Item;
8
use modules\rbac\Module;
9
10
/**
11
 * Class Role
12
 * @package modules\rbac\models
13
 *
14
 * @property-read Role[] $roles
15
 * @property-read array $roleItemsArray
16
 * @property-read array $rolePermissions
17
 * @property-read Item[] $children
18
 * @property-read array $roleChildArray
19
 * @property-read Role[] $roleChild
20
 */
21
class Role extends Model
22
{
23
    // константы ролей
24
    const ROLE_SUPER_ADMIN = 'super_admin';
25
    const ROLE_SUPER_ADMIN_DESCRIPTION = 'Super Administrator';
26
27
    const ROLE_ADMIN = 'admin';
28
    const ROLE_ADMIN_DESCRIPTION = 'Administrator';
29
30
    const ROLE_MANAGER = 'manager';
31
    const ROLE_MANAGER_DESCRIPTION = 'FileStateForm';
32
33
    const ROLE_EDITOR = 'editor';
34
    const ROLE_EDITOR_DESCRIPTION = 'Editor';
35
36
    const ROLE_DEFAULT = 'user';
37
    const ROLE_DEFAULT_DESCRIPTION = 'User';
38
39
    // сценарии
40
    const SCENARIO_CREATE = 'create';
41
    const SCENARIO_UPDATE = 'update';
42
43
    public $name;
44
    public $description;
45
    public $isNewRecord = false;
46
47
    /** @var  array $rolesByRole Наследуемые роли */
48
    public $rolesByRole;
49
    /** @var  array $itemsRoles Доступные роли */
50
    public $itemsRoles;
51
52
    /** @var  array $permissionsByRole Установленные разрешения для роли */
53
    public $permissionsByRole;
54
    /** @var array $itemsPermissions Разрешения */
55
    public $itemsPermissions;
56
57
    /**
58
     * @inheritdoc
59
     * @return array
60
     */
61
    public function rules()
62
    {
63
        return [
64
            ['name', 'required', 'on' => self::SCENARIO_CREATE],
65
            ['name', 'string', 'max' => 64, 'on' => self::SCENARIO_CREATE],
66
            [
67
                'name',
68
                'match',
69
                'pattern' => '#^[\w_-]+$#i',
70
                'message' => Module::translate(
71
                    'module',
72
                    'It is allowed to use the Latin alphabet, numbers, dashes and underscores.(A-z,0-1,-,_)'
73
                ),
74
                'on' => self::SCENARIO_CREATE
75
            ],
76
            [
77
                'name',
78
                'validateUniqueName',
79
                'skipOnEmpty' => false,
80
                'skipOnError' => false,
81
                'on' => self::SCENARIO_CREATE
82
            ],
83
84
            [['description'], 'string'],
85
            [
86
                ['rolesByRole', 'itemsRoles', 'permissionsByRole', 'itemsPermissions'],
87
                'required',
88
                'on' => self::SCENARIO_UPDATE
89
            ]
90
        ];
91
    }
92
93
    /**
94
     * @param string $attribute
95
     */
96
    public function validateUniqueName($attribute)
97
    {
98
        if (!$attribute) {
99
            $this->addError($attribute, Module::translate('module', 'Enter name role.'));
100
        }
101
        if (!$this->hasErrors()) {
102
            $this->processCheckRoleName($attribute);
103
        }
104
    }
105
106
    /**
107
     * Tree roles
108
     * @return array
109
     */
110
    public static function tree()
111
    {
112
        return [
113
            self::ROLE_SUPER_ADMIN => [
114
                self::ROLE_ADMIN => [
115
                    self::ROLE_MANAGER => [
116
                        self::ROLE_EDITOR => [
117
                            self::ROLE_DEFAULT
118
                        ]
119
                    ]
120
                ]
121
            ]
122
        ];
123
    }
124
125
    /**
126
     * @param string $attribute
127
     * @return mixed
128
     */
129
    public function processCheckRoleName($attribute)
130
    {
131
        if (!empty($this->name)) {
132
            $auth = Yii::$app->authManager;
133
            if ($auth->getRole($this->name)) {
134
                $this->addError($attribute, Module::translate('module', 'This name is already taken.'));
135
            }
136
        }
137
        return $attribute;
138
    }
139
140
    /**
141
     * @return array
142
     */
143
    public function scenarios()
144
    {
145
        $scenarios = parent::scenarios();
146
        $scenarios[self::SCENARIO_CREATE] = ['name', 'description'];
147
        $scenarios[self::SCENARIO_UPDATE] = [
148
            'name', 'description', 'rolesByRole', 'itemsRoles', 'permissionsByRole', 'itemsPermissions'
149
        ];
150
        return $scenarios;
151
    }
152
153
    /**
154
     * @inheritdoc
155
     * @return array
156
     */
157
    public function attributeLabels()
158
    {
159
        return [
160
            'name' => Module::translate('module', 'Name'),
161
            'description' => Module::translate('module', 'Description'),
162
            'rolesByRole' => Module::translate('module', 'Roles by role'),
163
            'itemsRoles' => Module::translate('module', 'Items roles'),
164
            'permissionsByRole' => Module::translate('module', 'Permissions by role'),
165
            'itemsPermissions' => Module::translate('module', 'Items permissions')
166
        ];
167
    }
168
169
    /**
170
     * @return array
171
     */
172
    public static function rolesArray()
173
    {
174
        return [
175
            self::ROLE_SUPER_ADMIN => self::ROLE_SUPER_ADMIN_DESCRIPTION,
176
            self::ROLE_ADMIN => self::ROLE_ADMIN_DESCRIPTION,
177
            self::ROLE_MANAGER => self::ROLE_MANAGER_DESCRIPTION,
178
            self::ROLE_EDITOR => self::ROLE_EDITOR_DESCRIPTION,
179
            self::ROLE_DEFAULT => self::ROLE_DEFAULT_DESCRIPTION
180
        ];
181
    }
182
183
    /**
184
     * Возвращает установленные разрешения для роли
185
     * @return array
186
     */
187
    public function getPermissionsByRole()
188
    {
189
        $auth = Yii::$app->authManager;
190
        $perm = $auth->getPermissionsByRole($this->name);
191
        $arr = [];
192
        foreach ($perm as $value) {
193
            if ($value->name !== $this->name) {
194
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
195
            }
196
        }
197
        return $arr;
198
    }
199
200
    /**
201
     * Возвращает все разрешения
202
     * @return array
203
     */
204
    public function getItemsPermissions()
205
    {
206
        $auth = Yii::$app->authManager;
207
        $perm = $auth->getPermissions();
208
        $arr = [];
209
        foreach ($perm as $value) {
210
            if ($value->name !== $this->name) {
211
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
212
            }
213
        }
214
        $permByRole = $this->getPermissionsByRole();
215
        return array_diff($arr, $permByRole);
216
    }
217
218
    /**
219
     * Возвращает дочерние роли
220
     * @return array
221
     */
222
    public function getRolesByRole()
223
    {
224
        $auth = Yii::$app->authManager;
225
        $roles = $auth->getChildRoles($this->name);
226
        $arr = [];
227
        foreach ($roles as $value) {
228
            if ($value->name !== $this->name) {
229
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
230
            }
231
        }
232
        return $arr;
233
    }
234
235
    /**
236
     * Возвращает все роли
237
     * @return array
238
     */
239
    public function getItemsRoles()
240
    {
241
        $auth = Yii::$app->authManager;
242
        $roles = $auth->getRoles();
243
        $arr = [];
244
        foreach ($roles as $value) {
245
            if ($value->name !== $this->name) {
246
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
247
            }
248
        }
249
        $rolesByRole = $this->getRolesByRole();
250
        return array_diff($arr, $rolesByRole);
251
    }
252
253
    /**
254
     * @return \yii\rbac\Role[]
255
     */
256
    public function getRoleChild()
257
    {
258
        $auth = Yii::$app->authManager;
259
        return $auth->getChildRoles($this->name);
260
    }
261
262
    /**
263
     * Возвращает массив дочерних ролей
264
     * @return array
265
     */
266
    public function getRoleChildArray()
267
    {
268
        $roles = $this->getRoleChild();
269
        $arr = [];
270
        foreach ($roles as $value) {
271
            if ($value->name !== $this->name) {
272
                $arr[$value->name] = $value->description;
273
            }
274
        }
275
        return $arr;
276
    }
277
278
    /**
279
     * Получаем все роли
280
     * @return \yii\rbac\Role[]
281
     */
282
    public function getRoles()
283
    {
284
        $auth = Yii::$app->authManager;
285
        return $auth->getRoles();
286
    }
287
288
    /**
289
     * Возвращает массив ролей
290
     * @return array
291
     */
292
    public function getRoleItemsArray()
293
    {
294
        $roles = $this->getRoles();
295
        $arr = [];
296
        foreach ($roles as $value) {
297
            if ($value->name !== $this->name) {
298
                $arr[$value->name] = $value->description;
299
            }
300
        }
301
        return $arr;
302
    }
303
304
    /**
305
     *
306
     * @return array
307
     */
308
    public function getRolePermissions()
309
    {
310
        $auth = Yii::$app->authManager;
311
        $children = $auth->getChildren($this->name);
312
        $perm = [];
313
        foreach ($children as $key => $child) {
314
            if ($child->type === 2) {
315
                $perm[$key] = $child;
316
            }
317
        }
318
        return $perm;
319
    }
320
321
    /**
322
     * Все дети
323
     * @return Item[]
324
     */
325
    public function getChildren()
326
    {
327
        $auth = Yii::$app->authManager;
328
        return $auth->getChildren($this->name);
329
    }
330
}
331