Passed
Push — master ( 1a7811...602998 )
by Alexey
02:28
created

RolesController::actionIndex()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: Alexey Schevchenko <[email protected]>
5
 * Date: 07.10.16
6
 * Time: 5:48
7
 */
8
9
namespace modules\rbac\console;
10
11
use Yii;
12
use yii\console\Controller;
13
use yii\console\Exception;
14
use yii\helpers\ArrayHelper;
15
use modules\users\models\User;
16
use console\components\helpers\Console;
17
18
/**
19
 * Class RolesController
20
 * @package modules\rbac\console
21
 */
22
class RolesController extends Controller
23
{
24
    /**
25
     * Adds role to user
26
     * @throws Exception
27
     */
28
    public function actionAssign()
29
    {
30
        $authManager = Yii::$app->authManager;
31
        $username = $this->prompt(Console::convertEncoding(Yii::t('app', 'Username:')), ['required' => true]);
32
        $user = $this->findModel($username);
33
34
        $roles = Yii::$app->authManager->getRoles();
35
        $roleName = $this->select(Console::convertEncoding(Yii::t('app', 'Role:')), Console::convertEncoding(ArrayHelper::map($roles, 'name', 'description')));
0 ignored issues
show
Bug introduced by
It seems like console\components\helpe...'name', 'description')) can also be of type string; however, parameter $options of yii\console\Controller::select() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

35
        $roleName = $this->select(Console::convertEncoding(Yii::t('app', 'Role:')), /** @scrutinizer ignore-type */ Console::convertEncoding(ArrayHelper::map($roles, 'name', 'description')));
Loading history...
36
        $role = $authManager->getRole($roleName);
37
38
        // Проверяем есть ли уже такая роль у пользователя
39
        $userRoles = $this->getUserRoleValue($user->id);
40
        if ($userRoles === null) {
41
            $authManager->assign($role, $user->id);
42
            $this->stdout(Console::convertEncoding(Yii::t('app', 'Success!')), Console::FG_GREEN, Console::BOLD);
43
            $this->stdout(PHP_EOL);
44
        } else {
45
            $this->stdout(Console::convertEncoding(Yii::t('app', 'The user already has a role.')), Console::FG_RED, Console::BOLD);
46
            $this->stdout(PHP_EOL);
47
        }
48
    }
49
50
    /**
51
     * Removes role from user
52
     * @throws Exception
53
     */
54
    public function actionRevoke()
55
    {
56
        $authManager = Yii::$app->authManager;
57
        $username = $this->prompt(Console::convertEncoding(Yii::t('app', 'Username:')), ['required' => true]);
58
        $user = $this->findModel($username);
59
        $roleName = $this->select(
60
            Console::convertEncoding(Yii::t('app', 'Role:')), ArrayHelper::merge(
61
            ['all' => Console::convertEncoding(Yii::t('app', 'All Roles'))],
62
            Console::convertEncoding(
63
                ArrayHelper::map($authManager->getRolesByUser($user->id), 'name', 'description')
64
            )
65
        )
66
        );
67
        if ($roleName == 'all') {
68
            $authManager->revokeAll($user->id);
69
        } else {
70
            $role = $authManager->getRole($roleName);
71
            $authManager->revoke($role, $user->id);
72
        }
73
        $this->stdout(Console::convertEncoding(Yii::t('app', 'Done!')), Console::FG_GREEN, Console::BOLD);
74
        $this->stdout(PHP_EOL);
75
    }
76
77
    /**
78
     * @param integer $user_id
79
     * @return mixed|null
80
     */
81
    public function getUserRoleValue($user_id)
82
    {
83
        $authManager = Yii::$app->authManager;
84
        if ($role = $authManager->getRolesByUser($user_id)) {
85
            return ArrayHelper::getValue($role, function ($role) {
86
                foreach ($role as $key => $value) {
87
                    return $value->name;
88
                }
89
                return null;
90
            });
91
        }
92
        return null;
93
    }
94
95
    /**
96
     * Finds the User model based on its primary key value.
97
     * If the model is not found, a 404 HTTP exception will be thrown.
98
     *
99
     * @param string $username
100
     * @return User the loaded model
101
     * @throws Exception if the model cannot be found
102
     */
103
    private function findModel($username)
104
    {
105
        if (!$model = User::findOne(['username' => $username])) {
106
            throw new Exception(
107
                Console::convertEncoding(
108
                    Yii::t('app', 'User "{:Username}" not found', [':Username' => $username])
109
                )
110
            );
111
        }
112
        return $model;
113
    }
114
}
115