Completed
Push — master ( a53bf3...ad40b1 )
by Igor
01:39
created

SocialController::parsers()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
3
namespace app\modules\auth\controllers;
4
5
use Yii;
6
use app\modules\auth\services\SocialAuth;
7
use app\modules\auth\models\forms\SignupProviderForm;
8
9
class SocialController extends \yii\web\Controller
10
{
11
    /**
12
     * @inheritdoc
13
     */
14
    public function behaviors()
15
    {
16
        return [
17
            'access' => [
18
                'class' => 'yii\filters\AccessControl',
19
                'rules' => [
20
                    [
21
                        'actions' => [
22
                            'index',
23
                            'signup',
24
                        ],
25
                        'allow' => true,
26
                        'roles' => ['?'],
27
                    ],
28
                ],
29
            ],
30
        ];
31
    }
32
33
    /**
34
     * @inheritdoc
35
     */
36
    public function actions()
37
    {
38
        return [
39
            'index' => [
40
                'class' => 'yii\authclient\AuthAction',
41
                'successCallback' => [$this, 'successCallback'],
42
                'successUrl' => '/auth/social/signup'
43
            ],
44
        ];
45
    }
46
47
    public function successCallback($client)
48
    {
49
        Yii::$app->session['authClient'] = $client;
50
    }
51
52
    public function redirect($url, $statusCode = 302)
53
    {
54
        Yii::$app->session['authClient'] = null;
55
        return parent::redirect($url, $statusCode);
56
    }
57
58
    private function parsers()
59
    {
60
        return [
61
            'facebook' => '\app\modules\auth\oauth\parsers\Facebook',
62
        ];
63
    }
64
65
    public function actionSignup()
66
    {
67
        if (Yii::$app->session['authClient'] === null) {
68
            return $this->redirect(['/']);
69
        }
70
71
        $client = Yii::$app->session['authClient'];
72
73
        $parserClass = $this->parsers()[$client->id];
74
        $parser = new $parserClass($client);
75
76
        $socialAuth = Yii::$container->get(SocialAuth::class, [$parser, $client]);
77
        $user = $socialAuth->getUser();
78
        $model = Yii::$container->get(SignupProviderForm::class, [$user]);
79
80
        if (!$user->isNewRecord) {
81
            if ($user->isActive()) {
82
                $model->login();
83
            } else {
84
                Yii::$app->session->setFlash('error', $user->getStatusDescription());
85
            }
86
            return $this->redirect(['/']);
87
        }
88
89
        if ($model->validate() || ($model->load(Yii::$app->request->post()) && $model->validate())) {
90
            $model->signup();
91
            $model->sendEmail();
92
93
            Yii::$app->session->setFlash(
94
                'success',
95
                Yii::t('app.msg', 'Please activate your account') . '. ' .
96
                Yii::t('app.msg', 'A letter for activation was sent to {email}', ['email' => $model->email])
97
            );
98
            return $this->redirect(['/']);
99
        }
100
101
        return $this->render('signup', [
102
            'model' => $model
103
        ]);
104
    }
105
}
106