DefaultController   A
last analyzed

Complexity

Total Complexity 24

Size/Duplication

Total Lines 168
Duplicated Lines 0 %

Importance

Changes 7
Bugs 3 Features 0
Metric Value
wmc 24
eloc 60
c 7
b 3
f 0
dl 0
loc 168
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A behaviors() 0 21 1
A actionLogin() 0 9 3
A processResetPassword() 0 3 2
A processGoHome() 0 8 2
A actionRequestPasswordReset() 0 14 4
A actionLogout() 0 8 2
A actionEmailConfirm() 0 12 3
A actionSignup() 0 9 3
A actionResetPassword() 0 14 4
1
<?php
2
3
namespace modules\users\controllers\frontend;
4
5
use Yii;
6
use yii\base\Exception;
7
use yii\base\Model;
8
use yii\web\Controller;
9
use modules\users\models\SignupForm;
10
use modules\users\models\LoginForm;
11
use modules\users\models\EmailConfirmForm;
12
use modules\users\models\ResetPasswordForm;
13
use modules\users\models\PasswordResetRequestForm;
14
use yii\filters\AccessControl;
15
use yii\base\InvalidArgumentException;
16
use yii\web\BadRequestHttpException;
17
use yii\filters\VerbFilter;
18
use modules\users\Module;
19
use yii\web\Response;
20
21
/**
22
 * Class DefaultController
23
 * @package modules\users\controllers\frontend
24
 */
25
class DefaultController extends Controller
26
{
27
    /**
28
     * @inheritdoc
29
     * @return array
30
     */
31
    public function behaviors()
32
    {
33
        return [
34
            'access' => [
35
                'class' => AccessControl::class,
36
                'rules' => [
37
                    [
38
                        'allow' => true,
39
                        'roles' => ['?']
40
                    ],
41
                    [
42
                        'actions' => ['logout'],
43
                        'allow' => true,
44
                        'roles' => ['@']
45
                    ]
46
                ]
47
            ],
48
            'verbs' => [
49
                'class' => VerbFilter::class,
50
                'actions' => [
51
                    'logout' => ['post']
52
                ]
53
            ]
54
        ];
55
    }
56
57
    /**
58
     * Logs in a user.
59
     *
60
     * @return string|Response
61
     */
62
    public function actionLogin()
63
    {
64
        $model = new LoginForm();
65
        $load = $model->load(Yii::$app->request->post());
66
        if ($load && $model->login()) {
67
            return $this->goBack();
68
        }
69
        return $this->render('login', [
70
            'model' => $model
71
        ]);
72
    }
73
74
    /**
75
     * Logs out the current user.
76
     *
77
     * @return Response
78
     */
79
    public function actionLogout()
80
    {
81
        /** @var yii\web\User $user */
82
        $user = Yii::$app->user;
83
        if ($user->logout()) {
84
            return $this->processGoHome();
85
        }
86
        return $this->redirect(Yii::$app->request->referrer);
87
    }
88
89
    /**
90
     * @return string|Response
91
     * @throws Exception
92
     */
93
    public function actionSignup()
94
    {
95
        $model = new SignupForm();
96
        $load = $model->load(Yii::$app->request->post());
97
        if ($load && $model->signup()) {
98
            return $this->processGoHome(Module::translate('module', 'It remains to activate the account.'));
99
        }
100
        return $this->render('signup', [
101
            'model' => $model
102
        ]);
103
    }
104
105
    /**
106
     * @param mixed $token
107
     * @return Response
108
     * @throws BadRequestHttpException
109
     * @throws \Exception
110
     */
111
    public function actionEmailConfirm($token)
112
    {
113
        try {
114
            $model = new EmailConfirmForm($token);
115
        } catch (InvalidArgumentException $e) {
116
            throw new BadRequestHttpException($e->getMessage());
117
        }
118
119
        if ($model->confirmEmail()) {
120
            return $this->processGoHome(Module::translate('module', 'Thank you for registering!'));
121
        }
122
        return $this->processGoHome(Module::translate('module', 'Error sending message!'), 'error');
123
    }
124
125
    /**
126
     * Requests password reset.
127
     *
128
     * @return string|Response
129
     */
130
    public function actionRequestPasswordReset()
131
    {
132
        $model = new PasswordResetRequestForm();
133
        $load = $model->load(Yii::$app->request->post());
134
        if ($load && $model->validate()) {
135
            if ($model->sendEmail()) {
136
                return $this->processGoHome(Module::translate('module', 'Check your email for further instructions.'));
137
            }
138
            /** @var yii\web\Session $session */
139
            $session = Yii::$app->session;
140
            $session->setFlash('error', Module::translate('module', 'Sorry, we are unable to reset password.'));
141
        }
142
        return $this->render('requestPasswordResetToken', [
143
            'model' => $model
144
        ]);
145
    }
146
147
    /**
148
     * @param mixed $token
149
     * @return string|Response
150
     * @throws BadRequestHttpException
151
     * @throws Exception
152
     */
153
    public function actionResetPassword($token)
154
    {
155
        try {
156
            $model = new ResetPasswordForm($token);
157
        } catch (InvalidArgumentException $e) {
158
            throw new BadRequestHttpException($e->getMessage());
159
        }
160
        $load = $model->load(Yii::$app->request->post());
161
        if ($load && $this->processResetPassword($model)) {
162
            return $this->processGoHome(Module::translate('module', 'Password changed successfully.'));
163
        }
164
165
        return $this->render('resetPassword', [
166
            'model' => $model
167
        ]);
168
    }
169
170
    /**
171
     * @param $model ResetPasswordForm|Model
172
     * @return bool
173
     * @throws Exception
174
     */
175
    protected function processResetPassword($model)
176
    {
177
        return $model->validate() && $model->resetPassword();
178
    }
179
180
    /**
181
     * @param string $message
182
     * @param string $type
183
     * @return Response
184
     */
185
    public function processGoHome($message = '', $type = 'success')
186
    {
187
        if (!empty($message)) {
188
            /** @var yii\web\Session $session */
189
            $session = Yii::$app->session;
190
            $session->setFlash($type, $message);
191
        }
192
        return $this->goHome();
193
    }
194
}
195