Auth::reset()   B
last analyzed

Complexity

Conditions 9
Paths 6

Size

Total Lines 60
Code Lines 38

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 38
c 1
b 0
f 0
dl 0
loc 60
rs 7.7564
cc 9
nc 6
nop 1

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Source\Controllers;
4
5
use stdClass;
6
use Source\Core\Request;
7
use Source\Core\Response;
8
use Source\Core\Token;
9
use Source\Core\Redis;
10
use Source\Models\User;
11
use Source\Core\Rabbit\RabbitSender;
12
13
class Auth
14
{
15
    private $Message;
16
17
    private $Request;
18
19
    public function __construct()
20
    {
21
        $this->Message = new stdClass();
22
        $this->Request = new Request();
23
    }
24
25
    public function login($data)
26
    {
27
        $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
28
29
        $email = filter_var($data["email"], FILTER_VALIDATE_EMAIL);
30
        $passwd = filter_var($data["password"], FILTER_DEFAULT);
31
32
        if (!$email || !$passwd) {
33
            $this->Message->message = 'Informe seu e-mail e senha para logar';
34
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
35
            return;
36
        }
37
38
        $User = new User();
39
40
        $result = $User->findByEmail($email);
41
42
        if (!$result || $result == null) {
43
            $this->Message->message = 'E-mail ou senha inválido';
44
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
45
            return;
46
        }
47
48
        if (!password_verify($passwd, $result->password)) {
49
            $this->Message->message = 'E-mail ou senha inválido';
50
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
51
            return;
52
        }
53
54
        $jwt = new stdClass();
55
        $jwt->id = $result->id;
0 ignored issues
show
Bug Best Practice introduced by
The property id does not exist on Source\Models\User. Since you implemented __get, consider adding a @property annotation.
Loading history...
56
        $jwt->email = $result->email;
57
58
        $this->Message->message = 'login successful';
59
        $this->Message->token = (new Token())->generateNewToken($jwt);
60
61
        (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
62
    }
63
64
    public function register($data)
65
    {
66
        $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
67
68
        $email = filter_var($data["email"], FILTER_VALIDATE_EMAIL);
69
        $passwd = filter_var($data["password"], FILTER_DEFAULT);
70
        $first_name = filter_var($data["first_name"], FILTER_DEFAULT);
71
        $last_name = filter_var($data["last_name"], FILTER_DEFAULT);
72
73
        if (!$email || !$passwd) {
74
            $this->Message->message = 'Informe um e-mail e uma senha para se cadastrar!';
75
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
76
            return;
77
        }
78
79
        if (!$first_name) {
80
            $this->Message->message = 'Informe seu primeiro nome para se cadastrar!';
81
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
82
            return;
83
        }
84
85
        if (!$last_name) {
86
            $this->Message->message = 'Informe seu ultimo nome para se cadastrar!';
87
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
88
            return;
89
        }
90
91
        $User = new User();
92
93
        $User->first_name = $first_name;
0 ignored issues
show
Bug Best Practice introduced by
The property first_name does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
94
        $User->last_name = $last_name;
0 ignored issues
show
Bug Best Practice introduced by
The property last_name does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
95
        $User->email = $email;
0 ignored issues
show
Bug Best Practice introduced by
The property email does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
96
        $User->password = $passwd;
0 ignored issues
show
Bug Best Practice introduced by
The property password does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
97
98
        if (!$User->save()) {
99
            $this->Message->message = $User->message();
100
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
101
            return;
102
        }
103
104
        $result = $User->data();
105
106
        $jwt = new stdClass();
107
        $jwt->id = $result->id;
108
        $jwt->email = $result->email;
109
110
        $this->Message->message = 'registered with success';
111
        $this->Message->token = (new Token())->generateNewToken($jwt);
112
113
        (new RabbitSender('email', 'email'))->sendMessage(json_encode([
114
            'type' => 'confirmEmail',
115
            'content' => [
116
                'email' => $result->email
117
            ]
118
        ]));
119
120
        (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
121
    }
122
123
    public function forget($data)
124
    {
125
        $email = filter_var($data["email"], FILTER_VALIDATE_EMAIL);
126
127
        if (!$email) {
128
            $this->Message->message = 'Informe um e-mail valido para continuar';
129
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
130
            return;
131
        }
132
133
        $User = new User();
134
135
        if (($User = $User->findByEmail($email))) {
136
            $forget = (md5(uniqid(rand(), true)));
137
138
            $User->forget = $forget;
0 ignored issues
show
Bug Best Practice introduced by
The property forget does not exist on Source\Models\User. Since you implemented __set, consider adding a @property annotation.
Loading history...
139
            $User->save();
140
141
            /*********************** ************************/
142
            // fazer um push para o rabbit na fila de email //
143
            /*********************** ************************/
144
145
            (new RabbitSender('email', 'email'))->sendMessage(json_encode([
146
                'type' => 'resetPassword',
147
                'content' => [
148
                    'email' => $email,
149
                    'forget' => $forget
150
                ]
151
            ]));
152
153
            $this->Message->message = 'Enviamos um link de recuperação para seu e-mail';
154
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
155
            return;
156
        }
157
158
        $User = new User();
159
        $User->forget = (md5(uniqid(rand(), true)));
160
161
        $this->Message->message = 'Enviamos um link de recuperação para seu e-mail';
162
        (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
163
    }
164
165
    public function reset($data)
166
    {
167
        $data = filter_var_array($data, FILTER_SANITIZE_STRIPPED);
168
169
        $email = filter_var($data["email"], FILTER_VALIDATE_EMAIL);
170
        $forget = filter_var($data["forget"], FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => "/^[a-f0-9]{32}$/"]]);
171
172
        if (!$email || !$forget) {
173
            $this->Message->message = 'Entrada inválida';
174
            (new Response())->setStatusCode(HTTP_UNAUTHORIZED)->send($this->Message);
175
            return;
176
        }
177
178
        $User = new User();
179
180
        $result = $User->find("email = :e AND forget = :f", "e={$email}&f={$forget}", "id")->fetch();
181
182
        if (!$result || $result == null) {
183
            $this->Message->message = 'Entrada inválida';
184
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
185
            return;
186
        }
187
188
        $passwd = filter_var($data["password"], FILTER_DEFAULT);
189
        $passwdRepeat = filter_var($data["passwordRepeat"], FILTER_DEFAULT);
190
191
        if (!$passwd || !$passwdRepeat) {
192
            $this->Message->message = 'Informe e repita sua nova senha!';
193
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
194
            return;
195
        }
196
197
        if ($passwd != $passwdRepeat) {
198
            $this->Message->message = 'As senhas nao batem!';
199
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
200
            return;
201
        }
202
203
        $result = $result->data();
204
205
        $User = new User();
206
        $User = $User->findById($result->id);
207
208
        $User->forget = null;
0 ignored issues
show
Bug Best Practice introduced by
The property forget does not exist on Source\Core\Model. Since you implemented __set, consider adding a @property annotation.
Loading history...
209
        $User->password = $passwd;
0 ignored issues
show
Bug Best Practice introduced by
The property password does not exist on Source\Core\Model. Since you implemented __set, consider adding a @property annotation.
Loading history...
210
211
        if (!$User->save()) {
0 ignored issues
show
Bug introduced by
The method save() does not exist on Source\Core\Model. Since it exists in all sub-types, consider adding an abstract or default implementation to Source\Core\Model. ( Ignorable by Annotation )

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

211
        if (!$User->/** @scrutinizer ignore-call */ save()) {
Loading history...
212
            $this->Message->message = $User->message();
213
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
214
            return;
215
        }
216
217
        $jwt = new stdClass();
218
        $jwt->id = $User->id;
0 ignored issues
show
Bug Best Practice introduced by
The property id does not exist on Source\Core\Model. Since you implemented __get, consider adding a @property annotation.
Loading history...
219
        $jwt->email = $User->email;
0 ignored issues
show
Bug Best Practice introduced by
The property email does not exist on Source\Core\Model. Since you implemented __get, consider adding a @property annotation.
Loading history...
220
221
        $this->Message->message = 'password altered with success';
222
        $this->Message->token = (new Token())->generateNewToken($jwt);
223
224
        (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
225
    }
226
227
    public function logoff()
228
    {
229
        $token = (object) $this->validateLogin();
230
231
        $Redis = (new Redis())->getClient();
232
233
        if ($Redis->del($token->id . $token->expirationTime) === 0) {
234
            $this->Message->message = 'Ocorreu algum erro!';
235
            (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
236
            return;
237
        }
238
239
        $this->Message->message = 'Você saiu com sucesso volte logo =)';
240
        (new Response())->setStatusCode(HTTP_OK)->send($this->Message);
241
    }
242
243
    public function validateLogin()
244
    {
245
        if (!($jwt = $this->Request->getToken())) {
246
            $this->Message->message = $this->Request->getError();
247
            (new Response())->setStatusCode(HTTP_UNAUTHORIZED)->send($this->Message);
248
            exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
249
        }
250
251
        $validToken = ($Token = new Token())->validateToken($jwt);
252
253
        if (!$validToken) {
254
            $this->Message->message = $Token->getError();
255
            (new Response())->setStatusCode(HTTP_UNAUTHORIZED)->send($this->Message);
256
            exit;
0 ignored issues
show
Best Practice introduced by
Using exit here is not recommended.

In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.

Loading history...
257
        }
258
259
        return $Token->getToken();
260
    }
261
}
262