Passed
Push — master ( 55c5fc...ead978 )
by Alexey
02:42
created

Permission::getPermissionsArray()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 1
Metric Value
eloc 10
c 3
b 0
f 1
dl 0
loc 12
rs 9.9332
cc 1
nc 1
nop 0
1
<?php
2
3
namespace modules\rbac\models;
4
5
use Yii;
6
use yii\base\Model;
7
use modules\rbac\Module;
8
9
/**
10
 * Class Permission
11
 * @package modules\rbac\models
12
 *
13
 * @property-read array $itemsPermissions
14
 * @property-read array $permissionChildren
15
 */
16
class Permission extends Model
17
{
18
    // разрешения
19
    const PERMISSION_MANAGER_MAINTENANCE = 'managerMaintenance';
20
    const PERMISSION_MANAGER_MAINTENANCE_DESCRIPTION = 'Access to Maintenance management';
21
22
    const PERMISSION_MAINTENANCE = 'maintenanceView';
23
    const PERMISSION_MAINTENANCE_DESCRIPTION = 'View a site in maintenance mode';
24
25
    const PERMISSION_VIEW_ADMIN_PAGE = 'viewAdminPage';
26
    const PERMISSION_VIEW_ADMIN_PAGE_DESCRIPTION = 'Access to the admin area';
27
28
    const PERMISSION_MANAGER_CONFIG = 'managerConfig';
29
    const PERMISSION_MANAGER_CONFIG_DESCRIPTION = 'Access to the config site';
30
31
    const PERMISSION_MANAGER_RBAC = 'managerRbac';
32
    const PERMISSION_MANAGER_RBAC_DESCRIPTION = 'Access to RBAC management';
33
34
    const PERMISSION_MANAGER_USERS = 'managerUsers';
35
    const PERMISSION_MANAGER_USERS_DESCRIPTION = 'Access to Users management';
36
37
    const PERMISSION_MANAGER_POST = 'managerPosts';
38
    const PERMISSION_MANAGER_POST_DESCRIPTION = 'Access to Posts management';
39
40
    const PERMISSION_MANAGER_COMMENTS = 'managerComments';
41
    const PERMISSION_MANAGER_COMMENTS_DESCRIPTION = 'Access to Comments management';
42
43
    // редактирование только своих постов
44
    const PERMISSION_UPDATE_OWN_POST = 'updateOwnPost';
45
    const PERMISSION_UPDATE_OWN_POST_DESCRIPTION = 'Editing your own post';
46
47
    // сценарии
48
    const SCENARIO_CREATE = 'create';
49
    const SCENARIO_UPDATE = 'update';
50
51
    public $name;
52
    public $description;
53
    public $isNewRecord = false;
54
55
    /** @var  array $permissions Установленные разрешения для роли */
56
    public $permissions;
57
    /** @var array $permissionItems Разрешения */
58
    public $permissionItems;
59
60
61
    /**
62
     * @return string[]
63
     */
64
    public static function permissionsArray()
65
    {
66
        return [
67
            self::PERMISSION_MANAGER_MAINTENANCE => self::PERMISSION_MANAGER_MAINTENANCE_DESCRIPTION,
68
            self::PERMISSION_MAINTENANCE => self::PERMISSION_MAINTENANCE_DESCRIPTION,
69
            self::PERMISSION_VIEW_ADMIN_PAGE => self::PERMISSION_VIEW_ADMIN_PAGE_DESCRIPTION,
70
            self::PERMISSION_MANAGER_CONFIG => self::PERMISSION_MANAGER_CONFIG_DESCRIPTION,
71
            self::PERMISSION_MANAGER_RBAC => self::PERMISSION_MANAGER_RBAC_DESCRIPTION,
72
            self::PERMISSION_MANAGER_USERS => self::PERMISSION_MANAGER_USERS_DESCRIPTION,
73
            self::PERMISSION_MANAGER_POST => self::PERMISSION_MANAGER_POST_DESCRIPTION,
74
            self::PERMISSION_MANAGER_COMMENTS => self::PERMISSION_MANAGER_COMMENTS_DESCRIPTION,
75
            self::PERMISSION_UPDATE_OWN_POST => self::PERMISSION_UPDATE_OWN_POST_DESCRIPTION
76
        ];
77
    }
78
79
    /**
80
     * Groups permissions
81
     * @return array
82
     */
83
    public static function getGroups()
84
    {
85
        return [
86
            Role::ROLE_SUPER_ADMIN => self::groupSuperAdmin(),
87
            Role::ROLE_ADMIN => self::groupAdmin(),
88
            Role::ROLE_MANAGER => self::groupManager(),
89
            Role::ROLE_EDITOR => self::groupEditor()
90
        ];
91
    }
92
93
    /**
94
     * Group permissions to role super_admin
95
     * @return array
96
     */
97
    public static function groupSuperAdmin()
98
    {
99
        return [
100
            self::PERMISSION_MANAGER_MAINTENANCE,
101
            self::PERMISSION_MAINTENANCE,
102
            self::PERMISSION_VIEW_ADMIN_PAGE,
103
            self::PERMISSION_MANAGER_CONFIG,
104
            self::PERMISSION_MANAGER_POST,
105
            self::PERMISSION_MANAGER_COMMENTS,
106
            self::PERMISSION_MANAGER_USERS,
107
            self::PERMISSION_MANAGER_RBAC
108
        ];
109
    }
110
111
    /**
112
     * Group permissions to role admin
113
     * @return array
114
     */
115
    public static function groupAdmin()
116
    {
117
        return [
118
            self::PERMISSION_MANAGER_MAINTENANCE,
119
            self::PERMISSION_MAINTENANCE,
120
            self::PERMISSION_VIEW_ADMIN_PAGE,
121
            self::PERMISSION_MANAGER_POST,
122
            self::PERMISSION_MANAGER_COMMENTS,
123
            self::PERMISSION_MANAGER_USERS
124
        ];
125
    }
126
127
    /**
128
     * Group permissions to role manager
129
     * @return array
130
     */
131
    public static function groupManager()
132
    {
133
        return [
134
            self::PERMISSION_VIEW_ADMIN_PAGE,
135
            self::PERMISSION_MANAGER_POST
136
        ];
137
    }
138
139
    /**
140
     * Group permissions to role editor
141
     * @return array
142
     */
143
    public static function groupEditor()
144
    {
145
        return [
146
            self::PERMISSION_VIEW_ADMIN_PAGE,
147
            self::PERMISSION_UPDATE_OWN_POST
148
        ];
149
    }
150
151
    /**
152
     * @inheritdoc
153
     * @return array
154
     */
155
    public function rules()
156
    {
157
        return [
158
            ['name', 'required', 'on' => self::SCENARIO_CREATE],
159
            ['name', 'string', 'max' => 64, 'on' => self::SCENARIO_CREATE],
160
            [
161
                'name',
162
                'match',
163
                'pattern' => '#^[\w_-]+$#i',
164
                'message' => Module::translate(
165
                    'module',
166
                    'It is allowed to use the Latin alphabet, numbers, dashes and underscores.(A-z,0-1,-,_)'
167
                ),
168
                'on' => self::SCENARIO_CREATE
169
            ],
170
            [
171
                'name',
172
                'validateUniqueName',
173
                'skipOnEmpty' => false,
174
                'skipOnError' => false,
175
                'on' => [self::SCENARIO_CREATE
176
                ]
177
            ],
178
179
            [['description'], 'string'],
180
            [['permissionItems', 'permissions'], 'required', 'on' => self::SCENARIO_UPDATE]
181
        ];
182
    }
183
184
    /**
185
     * @param string $attribute
186
     */
187
    public function validateUniqueName($attribute)
188
    {
189
        if (!$attribute) {
190
            $this->addError($attribute, Module::translate('module', 'Enter name permission.'));
191
        }
192
193
        if (!$this->hasErrors()) {
194
            $this->processCheckPermissionName($attribute);
195
        }
196
    }
197
198
    /**
199
     * @param string $attribute
200
     * @return mixed
201
     */
202
    public function processCheckPermissionName($attribute)
203
    {
204
        if (!empty($this->name)) {
205
            $auth = Yii::$app->authManager;
206
            if ($auth->getPermission($this->name)) {
207
                $this->addError($attribute, Module::translate('module', 'This name is already taken.'));
208
            }
209
        }
210
        return $attribute;
211
    }
212
213
    /**
214
     * @return array
215
     */
216
    public function scenarios()
217
    {
218
        $scenarios = parent::scenarios();
219
        $scenarios[self::SCENARIO_CREATE] = ['name', 'description'];
220
        $scenarios[self::SCENARIO_UPDATE] = ['name', 'description', 'permissionItems', 'permissions'];
221
        return $scenarios;
222
    }
223
224
    /**
225
     * @return array
226
     */
227
    public function attributeLabels()
228
    {
229
        return [
230
            'name' => Module::translate('module', 'Name'),
231
            'description' => Module::translate('module', 'Description'),
232
            'rolesByPermission' => Module::translate('module', 'Roles with permissions'),
233
            'itemsRoles' => Module::translate('module', 'Items roles'),
234
            'permissions' => Module::translate('module', 'Permissions by role'),
235
            'permissionItems' => Module::translate('module', 'Items permissions')
236
        ];
237
    }
238
239
    /**
240
     * Возвращает детей разрешения для текущего разрешения
241
     * @return array
242
     */
243
    public function getPermissionChildren()
244
    {
245
        $auth = Yii::$app->authManager;
246
        $perm = $auth->getChildren($this->name);
247
        $arr = [];
248
        foreach ($perm as $value) {
249
            if ($value->name !== $this->name) {
250
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
251
            }
252
        }
253
        return $arr;
254
    }
255
256
    /**
257
     * Возвращает все разрешения
258
     * @return array
259
     */
260
    public function getItemsPermissions()
261
    {
262
        $auth = Yii::$app->authManager;
263
        $perm = $auth->getPermissions();
264
        $arr = [];
265
        foreach ($perm as $value) {
266
            if ($value->name !== $this->name) {
267
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
268
            }
269
        }
270
        $permChild = $this->getPermissionChildren();
271
        return array_diff($arr, $permChild);
272
    }
273
}
274