Passed
Push — master ( 7c839d...1abac9 )
by Ion
13:45
created

AuthController::loginWithRememberToken()   A

Complexity

Conditions 5
Paths 16

Size

Total Lines 34
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 18
c 1
b 0
f 0
nc 16
nop 1
dl 0
loc 34
rs 9.3554
1
<?php
2
3
namespace App\Http\Controllers;
4
5
6
use App\Constants\TranslationCode;
7
use App\Models\User;
8
use App\Models\UserToken;
9
use App\Services\LogService;
10
use App\Services\UserService;
11
use Exception;
12
use Illuminate\Http\JsonResponse;
13
use Illuminate\Http\Request;
14
use Illuminate\Support\Facades\Auth;
15
use Illuminate\Support\Facades\DB;
16
use Illuminate\Support\Facades\Log;
17
use Laravel\Socialite\Facades\Socialite;
18
use Laravel\Socialite\Two\User as SocialiteUser;
19
20
/**
21
 * Class AuthController
22
 *
23
 * @package App\Http\Controllers
24
 */
25
class AuthController extends Controller
26
{
27
    /** @var UserService */
28
    private $userService;
29
30
    /**
31
     * UserController constructor.
32
     */
33
    public function __construct()
34
    {
35
        parent::__construct();
36
37
        $this->userService = new UserService();
38
    }
39
40
    /**
41
     * Login user with email and password or remember token
42
     *
43
     * @param Request $request
44
     *
45
     * @return JsonResponse
46
     */
47
    public function login(Request $request)
48
    {
49
        try {
50
            $validator = $this->userService->validateLoginRequest($request);
51
52
            if (!$validator->passes()) {
53
                return $this->userErrorResponse($validator->messages());
54
            }
55
56
            $user = $this->userService->loginUser($request->only('email', 'password'));
57
58
            if (!$user) {
59
                return $this->userErrorResponse(['credentials' => TranslationCode::ERROR_CREDENTIALS_INVALID]);
60
            }
61
62
            if ($user->status === User::STATUS_UNCONFIRMED) {
63
                return $this->userErrorResponse(['account' => TranslationCode::ERROR_ACCOUNT_UNACTIVATED]);
64
            }
65
66
            $loginData = $this->userService->generateLoginData($user, $request->has('remember'));
67
68
            return $this->successResponse($loginData);
69
        } catch (Exception $e) {
70
            Log::error(LogService::getExceptionTraceAsString($e));
71
72
            return $this->errorResponse();
73
        }
74
    }
75
76
    /**
77
     * Login with remember token
78
     *
79
     * @param Request $request
80
     *
81
     * @return JsonResponse
82
     */
83
    public function loginWithRememberToken(Request $request)
84
    {
85
        try {
86
            $validator = $this->userService->validateTokenLoginRequest($request);
87
88
            if (!$validator->passes()) {
89
                return $this->userErrorResponse($validator->messages());
90
            }
91
92
            $rememberToken = $request->get('rememberToken');
93
94
            $user = $this->userService->loginUserWithRememberToken($rememberToken);
95
96
            if (!$user) {
97
                return $this->userErrorResponse(['rememberToken' => TranslationCode::ERROR_REMEMBER_TOKEN_INVALID]);
98
            }
99
100
            if ($user->status === User::STATUS_UNCONFIRMED) {
101
                return $this->userErrorResponse(['account' => TranslationCode::ERROR_ACCOUNT_UNACTIVATED]);
102
            }
103
104
            DB::beginTransaction();
105
106
            $this->userService->updateRememberTokenValability($rememberToken);
107
108
            $loginData = $this->userService->generateLoginData($user);
109
110
            DB::commit();
111
112
            return $this->successResponse($loginData);
113
        } catch (Exception $e) {
114
            Log::error(LogService::getExceptionTraceAsString($e));
115
116
            return $this->errorResponse();
117
        }
118
    }
119
120
    /**
121
     * Login with facebook
122
     *
123
     * @param Request $request
124
     *
125
     * @return JsonResponse
126
     */
127
    public function loginWithFacebook(Request $request)
128
    {
129
        try {
130
            $validator = $this->userService->validateFacebookLoginRequest($request);
131
132
            if (!$validator->passes()) {
133
                return $this->userErrorResponse($validator->messages());
134
            }
135
136
            $token = $request->get('accessToken');
137
138
            /** @var SocialiteUser $facebookUser */
139
            $facebookUser = Socialite::driver('facebook')->userFromToken($token);
0 ignored issues
show
Bug introduced by
The method userFromToken() does not exist on Laravel\Socialite\Contracts\Provider. It seems like you code against a sub-type of Laravel\Socialite\Contracts\Provider such as Laravel\Socialite\Two\AbstractProvider. ( Ignorable by Annotation )

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

139
            $facebookUser = Socialite::driver('facebook')->/** @scrutinizer ignore-call */ userFromToken($token);
Loading history...
140
141
            if ($facebookUser->getId() !== $request->get('facebookId')) {
142
                return $this->userErrorResponse(['token' => TranslationCode::ERROR_TOKEN_MISMATCH]);
143
            }
144
145
            if (!$facebookUser->getEmail()) {
146
                return $this->userErrorResponse(['permission' => TranslationCode::ERROR_PERMISSION_EMAIL]);
147
            }
148
149
            DB::beginTransaction();
150
151
            $user = $this->userService->loginUserWithSocial($facebookUser, $this->baseService->getLanguage($request), 'facebook_id');
152
153
            $loginData = $this->userService->generateLoginData($user);
154
155
            DB::commit();
156
157
            return $this->successResponse($loginData);
158
        } catch (Exception $e) {
159
            Log::error(LogService::getExceptionTraceAsString($e));
160
161
            return $this->errorResponse();
162
        }
163
    }
164
165
    /**
166
     * Login with twitter
167
     *
168
     * @param Request $request
169
     *
170
     * @return JsonResponse
171
     */
172
    public function loginWithTwitter(Request $request)
173
    {
174
        try {
175
            $validator = $this->userService->validateTwitterLoginRequest($request);
176
177
            if (!$validator->passes()) {
178
                return $this->userErrorResponse($validator->messages());
179
            }
180
181
            $token = $request->get('accessToken');
182
183
            /** @var SocialiteUser $twitterUser */
184
            $twitterUser = Socialite::driver('twitter')->userFromToken($token);
185
186
            if ($twitterUser->getId() !== $request->get('twitter_id')) {
187
                return $this->userErrorResponse(['token' => TranslationCode::ERROR_TOKEN_MISMATCH]);
188
            }
189
190
            if (!$twitterUser->getEmail()) {
191
                return $this->userErrorResponse(['permission' => TranslationCode::ERROR_PERMISSION_EMAIL]);
192
            }
193
194
            DB::beginTransaction();
195
196
            $user = $this->userService->loginUserWithSocial($twitterUser, $this->baseService->getLanguage($request), 'twitter_id');
197
198
            $loginData = $this->userService->generateLoginData($user);
199
200
            DB::commit();
201
202
            return $this->successResponse($loginData);
203
        } catch (Exception $e) {
204
            Log::error(LogService::getExceptionTraceAsString($e));
205
206
            return $this->errorResponse();
207
        }
208
    }
209
210
    /**
211
     * Login with google
212
     *
213
     * @param Request $request
214
     *
215
     * @return JsonResponse
216
     */
217
    public function loginWithGoogle(Request $request)
218
    {
219
        try {
220
            $validator = $this->userService->validateGoogleLoginRequest($request);
221
222
            if (!$validator->passes()) {
223
                return $this->userErrorResponse($validator->messages());
224
            }
225
226
            $token = $request->get('accessToken');
227
228
            /** @var SocialiteUser $googleUser */
229
            $googleUser = Socialite::driver('twitter')->userFromToken($token);
230
231
            if ($googleUser->getId() !== $request->get('google_id')) {
232
                return $this->userErrorResponse(['token' => TranslationCode::ERROR_TOKEN_MISMATCH]);
233
            }
234
235
            if (!$googleUser->getEmail()) {
236
                return $this->userErrorResponse(['permission' => TranslationCode::ERROR_PERMISSION_EMAIL]);
237
            }
238
239
            DB::beginTransaction();
240
241
            $user = $this->userService->loginUserWithSocial($googleUser, $this->baseService->getLanguage($request), 'google_id');
242
243
            $loginData = $this->userService->generateLoginData($user);
244
245
            DB::commit();
246
247
            return $this->successResponse($loginData);
248
        } catch (Exception $e) {
249
            Log::error(LogService::getExceptionTraceAsString($e));
250
251
            return $this->errorResponse();
252
        }
253
    }
254
255
    /**
256
     * Logout user
257
     *
258
     * @param Request $request
259
     *
260
     * @return JsonResponse
261
     */
262
    public function logout(Request $request)
263
    {
264
        try {
265
            /** @var User $user */
266
            $user = Auth::user();
267
268
            if ($request->has('rememberToken')) {
269
                DB::beginTransaction();
270
271
                UserToken::where('token', $request->get('rememberToken'))
272
                    ->where('user_id', $user->id)
273
                    ->where('type', UserToken::TYPE_REMEMBER_ME)
274
                    ->delete();
275
276
                DB::commit();
277
            }
278
279
            return $this->successResponse();
280
        } catch (Exception $e) {
281
            Log::error(LogService::getExceptionTraceAsString($e));
282
283
            return $this->errorResponse();
284
        }
285
    }
286
}
287