Passed
Push — master ( c21478...d8f21e )
by Alexey
02:27
created

Permission::processCheckPermissionName()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.6666
c 0
b 0
f 0
cc 3
eloc 5
nc 3
nop 1
1
<?php
2
3
namespace modules\rbac\models;
4
5
use Yii;
6
use yii\base\Model;
7
use modules\rbac\traits\ModuleTrait;
8
use modules\rbac\Module;
9
10
/**
11
 * Class Permission
12
 * @package modules\rbac\models
13
 */
14
class Permission extends Model
15
{
16
    use ModuleTrait;
17
18
    // разрешения
19
    const PERMISSION_VIEW_ADMIN_PAGE = 'viewAdminPage';
20
    const PERMISSION_VIEW_ADMIN_PAGE_DESCRIPTION = 'Access to the admin area';
21
22
    const PERMISSION_MANAGER_RBAC = 'managerRbac';
23
    const PERMISSION_MANAGER_RBAC_DESCRIPTION = 'Access to RBAC management';
24
25
    const PERMISSION_MANAGER_USERS = 'managerUsers';
26
    const PERMISSION_MANAGER_USERS_DESCRIPTION = 'Access to Users management';
27
28
    const PERMISSION_MANAGER_POST = 'managerPosts';
29
    const PERMISSION_MANAGER_POST_DESCRIPTION = 'Access to Posts management';
30
31
    // редактирование только своих постов
32
    const PERMISSION_UPDATE_OWN_POST = 'updateOwnPost';
33
    const PERMISSION_UPDATE_OWN_POST_DESCRIPTION = 'Editing your own post';
34
35
    // сценарии
36
    const SCENARIO_CREATE = 'create';
37
    const SCENARIO_UPDATE = 'update';
38
39
    public $name;
40
    public $description;
41
    public $isNewRecord = false;
42
43
    /** @var  array $permissions Установленные разрешения для роли */
44
    public $permissions;
45
    /** @var array $permissionItems Разрешения */
46
    public $permissionItems;
47
48
    /**
49
     * @inheritdoc
50
     * @return array
51
     */
52
    public function rules()
53
    {
54
        return [
55
            ['name', 'required', 'on' => self::SCENARIO_CREATE],
56
            ['name', 'string', 'max' => 64, 'on' => self::SCENARIO_CREATE],
57
            ['name', 'match', 'pattern' => '#^[\w_-]+$#i', 'message' => Module::t('module', 'It is allowed to use the Latin alphabet, numbers, dashes and underscores.(A-z,0-1,-,_)'), 'on' => self::SCENARIO_CREATE],
58
            ['name', 'validateUniqueName', 'skipOnEmpty' => false, 'skipOnError' => false, 'on' => [self::SCENARIO_CREATE]],
59
60
            [['description'], 'string'],
61
            [['permissionItems', 'permissions'], 'required', 'message' => Module::t('module', 'You must select in the field «{attribute}».'), 'on' => self::SCENARIO_UPDATE],
62
        ];
63
    }
64
65
    /**
66
     * @param string $attribute
67
     */
68
    public function validateUniqueName($attribute)
69
    {
70
        if (!$attribute) {
71
            $this->addError($attribute, Module::t('module', 'Enter name permission.'));
72
        }
73
74
        if (!$this->hasErrors()) {
75
            $this->processCheckPermissionName($attribute);
76
        }
77
    }
78
79
    /**
80
     * @return array
81
     */
82
    public function getPermissionsArray()
83
    {
84
        return [
85
            self::PERMISSION_VIEW_ADMIN_PAGE => self::PERMISSION_VIEW_ADMIN_PAGE_DESCRIPTION,
86
            self::PERMISSION_MANAGER_RBAC => self::PERMISSION_MANAGER_RBAC_DESCRIPTION,
87
            self::PERMISSION_MANAGER_USERS => self::PERMISSION_MANAGER_USERS_DESCRIPTION,
88
            self::PERMISSION_MANAGER_POST => self::PERMISSION_MANAGER_POST_DESCRIPTION,
89
            self::PERMISSION_UPDATE_OWN_POST => self::PERMISSION_UPDATE_OWN_POST_DESCRIPTION,
90
        ];
91
    }
92
93
    /**
94
     * @param string $attribute
95
     * @return mixed
96
     */
97
    public function processCheckPermissionName($attribute)
98
    {
99
        if (!empty($this->name)) {
100
            $auth = Yii::$app->authManager;
101
            if ($auth->getPermission($this->name)) {
102
                $this->addError($attribute, Module::t('module', 'This name is already taken.'));
103
            }
104
        }
105
        return $attribute;
106
    }
107
108
    /**
109
     * @return array
110
     */
111
    public function scenarios()
112
    {
113
        $scenarios = parent::scenarios();
114
        $scenarios[self::SCENARIO_CREATE] = ['name', 'description'];
115
        $scenarios[self::SCENARIO_UPDATE] = ['name', 'description', 'permissionItems', 'permissions'];
116
        return $scenarios;
117
    }
118
119
    /**
120
     * @return array
121
     */
122
    public function attributeLabels()
123
    {
124
        return [
125
            'name' => Module::t('module', 'Name'),
126
            'description' => Module::t('module', 'Description'),
127
            'rolesByPermission' => Module::t('module', 'Roles by permission'),
128
            'itemsRoles' => Module::t('module', 'Items roles'),
129
            'permissions' => Module::t('module', 'Permissions by role'),
130
            'permissionItems' => Module::t('module', 'Items permissions'),
131
        ];
132
    }
133
134
    /**
135
     * Возвращает детей разрешения для текущего разрешения
136
     * @return array
137
     */
138
    public function getPermissionChildren()
139
    {
140
        $auth = Yii::$app->authManager;
141
        $perm = $auth->getChildren($this->name);
142
        $arr = [];
143
        foreach ($perm as $value) {
144
            if ($value->name != $this->name) {
145
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
146
            }
147
        }
148
        return $arr;
149
    }
150
151
    /**
152
     * Возвращает все разрешения
153
     * @return array
154
     */
155
    public function getItemsPermissions()
156
    {
157
        $auth = Yii::$app->authManager;
158
        $perm = $auth->getPermissions();
159
        $arr = [];
160
        foreach ($perm as $value) {
161
            if ($value->name != $this->name) {
162
                $arr[$value->name] = $value->name . ' (' . $value->description . ')';
163
            }
164
        }
165
        $permChild = $this->getPermissionChildren();
166
        return array_diff($arr, $permChild);
167
    }
168
}
169