Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
SocialAccountService
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 3
182
0.00% covered (danger)
0.00%
0 / 1
 findOrCreate
0.00% covered (danger)
0.00%
0 / 39
0.00% covered (danger)
0.00%
0 / 1
132
 parseGoogleData
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 parseFacebookData
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Http\Services;
4
5use App\Events\User\Registered;
6use App\Http\Models\Auth\LinkedSocialAccount;
7use App\Http\Models\Auth\User;
8use Illuminate\Support\Facades\Log;
9use Illuminate\Support\Str;
10use MongoDB\BSON\UTCDateTime;
11
12class 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}