Completed
Push — master ( 029fc1...afa99c )
by guillaume
12:29 queued 06:09
created

RegisterUserFromSocialNetworkService::register()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 24
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 4
eloc 15
nc 5
nop 2
dl 0
loc 24
rs 9.7666
c 1
b 1
f 0
1
<?php
2
3
4
namespace App\Src\UseCases\Domain\Auth\Services;
5
6
7
use App\Src\UseCases\Domain\Auth\SocialiteUser;
8
use App\Src\UseCases\Domain\Picture;
9
use App\Src\UseCases\Domain\Ports\UserRepository;
10
use App\Src\UseCases\Domain\User;
11
use App\Src\UseCases\Infra\Gateway\FileStorage;
12
use Illuminate\Support\Facades\Validator;
13
use Ramsey\Uuid\Uuid;
14
15
class RegisterUserFromSocialNetworkService
16
{
17
    private $userRepository;
18
    private $fileStorage;
19
20
    public function __construct(
21
        UserRepository $userRepository,
22
        FileStorage $fileStorage
23
    )
24
    {
25
        $this->userRepository = $userRepository;
26
        $this->fileStorage = $fileStorage;
27
    }
28
29
    public function register(string $provider, SocialiteUser $socialiteUser)
30
    {
31
        $user = $this->userRepository->getByProvider($provider, $socialiteUser->providerId());
32
        if(isset($user)){
33
            return [
34
                'user_id' => $user->id(),
35
                'provider_id' => $socialiteUser->providerId(),
36
                'state' => 'user_already_exist'
37
            ];
38
        }
39
40
        if($socialiteUser->email() !== null) {
41
            $user = $this->userRepository->getByEmail($socialiteUser->email());
42
        }
43
        if(isset($user)){
44
            $user->addProvider($provider, $socialiteUser->providerId());
45
            return [
46
                'user_id' => $user->id(),
47
                'provider_id' => $socialiteUser->providerId(),
48
            ];
49
        }
50
51
        $this->validateData($socialiteUser);
52
        return $this->createUser($socialiteUser, $provider);
53
    }
54
55
    private function validateData(SocialiteUser $socialiteUser): void
56
    {
57
        $rules = [
58
            'email' => 'required|string|email|min:2|max:255',
59
            'firstname' => 'string|required|min:2|max:255',
60
            'lastname' => 'string|required|min:2|max:255'
61
        ];
62
63
        $data = [
64
            'email' => $socialiteUser->email(),
65
            'firstname' => $socialiteUser->firstname(),
66
            'lastname' => $socialiteUser->lastname(),
67
            'provider_id' => $socialiteUser->providerId(),
68
            'picture_url' => $socialiteUser->pictureUrl()
69
        ];
70
        $validator = Validator::make($data, $rules);
71
        $validator->validate();
72
    }
73
74
    private function handlePicture(SocialiteUser $socialiteUser): ?Picture
75
    {
76
        return $socialiteUser->pictureUrl() !== null ? $this->fileStorage->uriToTmpPicture($socialiteUser->pictureUrl()) : null;
77
    }
78
79
    /**
80
     * @param SocialiteUser $socialiteUser
81
     * @param string $provider
82
     * @return array
83
     */
84
    private function createUser(SocialiteUser $socialiteUser, string $provider): array
85
    {
86
        $user = new User($id = Uuid::uuid4(), $socialiteUser->email(), $socialiteUser->firstname(), $socialiteUser->lastname(), null, '', [], [$provider => $socialiteUser->providerId()]);
0 ignored issues
show
Bug introduced by
It seems like $socialiteUser->email() can also be of type null; however, parameter $email of App\Src\UseCases\Domain\User::__construct() does only seem to accept string, maybe add an additional type check? ( Ignorable by Annotation )

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

86
        $user = new User($id = Uuid::uuid4(), /** @scrutinizer ignore-type */ $socialiteUser->email(), $socialiteUser->firstname(), $socialiteUser->lastname(), null, '', [], [$provider => $socialiteUser->providerId()]);
Loading history...
87
        $picture = $this->handlePicture($socialiteUser);
88
        $user->create(null, $picture);
89
        return [
90
            'user_id' => $id,
91
            'provider_id' => $socialiteUser->providerId(),
92
        ];
93
    }
94
}
95