Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 53 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 1 |
SocialAccountService | |
0.00% |
0 / 53 |
|
0.00% |
0 / 3 |
182 | |
0.00% |
0 / 1 |
findOrCreate | |
0.00% |
0 / 39 |
|
0.00% |
0 / 1 |
132 | |||
parseGoogleData | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
2 | |||
parseFacebookData | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace App\Http\Services; |
4 | |
5 | use App\Events\User\Registered; |
6 | use App\Http\Models\Auth\LinkedSocialAccount; |
7 | use App\Http\Models\Auth\User; |
8 | use Illuminate\Support\Facades\Log; |
9 | use Illuminate\Support\Str; |
10 | use MongoDB\BSON\UTCDateTime; |
11 | |
12 | class SocialAccountService |
13 | { |
14 | public function findOrCreate($providerUser, string $provider) |
15 | { |
16 | $providerId = $provider == 'google' ? $providerUser['sub'] : $providerUser->getId(); |
17 | |
18 | $searchArray = [ |
19 | 'provider_name' => $provider, |
20 | 'provider_id' => $providerId, |
21 | ]; |
22 | $linkedSocialAccount = LinkedSocialAccount::where($searchArray)->first(); |
23 | |
24 | if ($linkedSocialAccount) { |
25 | Log::info('User with ' . $provider . ' id ' . $providerId . ' found', ['providerUser' => $providerUser]); |
26 | |
27 | $avatar = $provider == 'google' ? ($providerUser['picture'] ?? $linkedSocialAccount->user->avatar) : $providerUser->getAvatar(); |
28 | |
29 | if ($linkedSocialAccount->user->avatar != $avatar) { |
30 | $linkedSocialAccount->user()->update(['avatar' => $avatar]); |
31 | } |
32 | if (! $linkedSocialAccount->user->hasVerifiedEmail()) { |
33 | $linkedSocialAccount->user->markEmailAsVerified(); |
34 | } |
35 | |
36 | return $linkedSocialAccount->user; |
37 | } |
38 | |
39 | $user = null; |
40 | $email = $provider == 'google' ? $providerUser['email'] : $providerUser->getEmail(); |
41 | |
42 | if ($email) { |
43 | $user = User::firstWhere('email', $email); |
44 | } |
45 | |
46 | $isNewUser = false; |
47 | if (! $user) { |
48 | $method = 'parse' . Str::ucfirst($provider) . 'Data'; |
49 | $data = $this->{$method}($providerUser); |
50 | $data['signup_source'] = 'google'; |
51 | $data['google_id'] = $providerUser['sub']; |
52 | $data['email_verified_at'] = new UTCDateTime(now()->getTimestamp() * 1000); |
53 | $data['onboardingv2_presented'] = true; |
54 | |
55 | $user = User::create($data); |
56 | $isNewUser = true; |
57 | } |
58 | |
59 | if (! $user->hasVerifiedEmail()) { |
60 | $user->markEmailAsVerified(); |
61 | } |
62 | |
63 | $user->linkedSocialAccounts()->create([ |
64 | 'provider_id' => $providerId, |
65 | 'provider_name' => $provider, |
66 | 'email' => $email, |
67 | ]); |
68 | |
69 | if ($isNewUser) { |
70 | event(new Registered($user)); |
71 | $user->sendWelcomeNotification(); |
72 | } |
73 | |
74 | return $user; |
75 | } |
76 | |
77 | private function parseGoogleData($user) |
78 | { |
79 | return [ |
80 | 'first_name' => $user['given_name'] ?? '', |
81 | 'last_name' => $user['family_name'] ?? '', |
82 | 'email' => $user['email'], |
83 | 'avatar' => $user['picture'] ?? '', |
84 | 'provider' => 'google', |
85 | ]; |
86 | } |
87 | |
88 | private function parseFacebookData($user) |
89 | { |
90 | return [ |
91 | 'first_name' => $user->getName(), |
92 | 'last_name' => $user->getName(), |
93 | 'email' => $user->getEmail(), |
94 | 'avatar' => $user->getAvatar(), |
95 | 'provider' => 'facebook', |
96 | ]; |
97 | } |
98 | } |