RespondInvitationToAnOrganization::respond()   B
last analyzed

Complexity

Conditions 7
Paths 7

Size

Total Lines 29
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 17
nc 7
nop 1
dl 0
loc 29
rs 8.8333
c 0
b 0
f 0
1
<?php
2
3
4
namespace App\Src\UseCases\Domain\Organizations\Invitation;
5
6
7
use App\Src\UseCases\Domain\Organizations\Model\Organization;
8
use App\Src\UseCases\Domain\Ports\InvitationRepository;
9
use App\Src\UseCases\Domain\Ports\OrganizationRepository;
10
use App\Src\UseCases\Domain\Ports\UserRepository;
11
use App\Src\UseCases\Domain\Shared\Gateway\AuthGateway;
12
use App\Src\UseCases\Domain\User;
13
14
class RespondInvitationToAnOrganization
15
{
16
    private $userRepository;
17
    private $organizationRepository;
18
    private $authGateway;
19
    private $invitationRepository;
20
21
    public function __construct(
22
        UserRepository $userRepository,
23
        OrganizationRepository $organizationRepository,
24
        AuthGateway $authGateway,
25
        InvitationRepository $invitationRepository
26
    )
27
    {
28
        $this->userRepository = $userRepository;
29
        $this->organizationRepository = $organizationRepository;
30
        $this->authGateway = $authGateway;
31
        $this->invitationRepository = $invitationRepository;
32
    }
33
34
    public function respond(string $hash)
35
    {
36
        $invitation = $this->invitationRepository->getByHash($hash);
37
        list($organizationId, $email, $firstname, $lastname) = $invitation->data();
38
        $user = $this->userRepository->getByEmail($email);
39
        $organizationToJoin = $this->organizationRepository->get($organizationId);
40
41
        $currentUser = $this->authGateway->current();
42
        if(isset($currentUser) && $currentUser->email() !== $email){
43
            $action = 'logout';
44
            $action .= !isset($user) ? '-register' : '-login';
45
46
            if($action == 'logout-login') {
47
                return $this->badUserLoginToAcceptAction($action, $organizationToJoin);
48
            }
49
            return $this->returnLogoutAction($action, $organizationToJoin, $email, $firstname, $lastname);
50
        }
51
52
53
        if(!isset($user)){
54
            return $this->returnRegisterAction($organizationId, $email, $firstname, $lastname);
55
        }
56
57
        $currentUser = $this->authGateway->current();
58
        if(!isset($currentUser)){
59
            return $this->returnLoginAction($organizationToJoin);
60
        }
61
62
        return $this->acceptOrDeclineAction($organizationToJoin, $currentUser);
63
    }
64
65
66
    private function acceptOrDeclineAction(?Organization $organizationToJoin, User $user): array
67
    {
68
        $organization = $this->getCurrentOrganization($user);
69
        return [
70
            'action' => 'accept_or_decline',
71
            'old_organisation' => $organization,
72
            'organization_to_join' => $organizationToJoin
73
        ];
74
    }
75
76
    private function returnLoginAction(?Organization $organizationToJoin): array
77
    {
78
        return [
79
            'action' => 'login',
80
            'organization_to_join' => $organizationToJoin,
81
        ];
82
    }
83
84
    private function returnRegisterAction($organizationId, $email, $firstname, $lastname): array
85
    {
86
        return [
87
            'action' => 'register',
88
            'organization_id' => $organizationId,
89
            'user' => [
90
                'email' => $email,
91
                'firstname' => $firstname,
92
                'lastname' => $lastname,
93
            ]
94
        ];
95
    }
96
97
    private function returnLogoutAction(string $action, ?Organization $organizationToJoin, $email, $firstname, $lastname): array
98
    {
99
        return [
100
            'action' => $action,
101
            'organization_to_join' => $organizationToJoin,
102
            'user' => [
103
                'email' => $email,
104
                'firstname' => $firstname,
105
                'lastname' => $lastname,
106
            ]
107
        ];
108
    }
109
110
    private function badUserLoginToAcceptAction(string $action, ?Organization $organizationToJoin): array
111
    {
112
        return [
113
            'action' => $action,
114
            'organization_to_join' => $organizationToJoin,
115
        ];
116
    }
117
118
    private function getCurrentOrganization(User $user)
119
    {
120
        $organization = null;
121
        if ($user->organizationId() !== null) {
122
            $organization = $this->organizationRepository->get($user->organizationId());
123
        }
124
        return $organization;
125
    }
126
}
127