Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 38
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
UpdateUserAction
0.00% covered (danger)
0.00%
0 / 38
0.00% covered (danger)
0.00%
0 / 3
182
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 execute
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
20
 changeEmail
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
72
1<?php
2
3namespace App\Actions\Users;
4
5use App\DTO\User\SendUserInvitationDTO;
6use App\DTO\User\UpdateUserDTO;
7use App\Http\Models\Admin\AdminUserInvitation;
8use App\Http\Models\Auth\User;
9use App\Http\Repositories\InstancyRepository;
10use App\Jobs\Instancy\UpdateUserEmail;
11use App\Traits\SubscriptionTrait;
12use stdClass;
13
14class UpdateUserAction
15{
16    use SubscriptionTrait;
17
18    public function __construct(
19        private SendUserInvitationAction $sendUserInvitationAction,
20        private InstancyRepository $instancyRepository
21    ) {
22    }
23
24    public function execute(User $user, UpdateUserDTO $userDTO)
25    {
26        if ($user->status == "Invited") {
27            throw new ExpectedException("This user has not signed up yet. Please try again later.");
28        }
29
30        if ($user->email != $userDTO->email) {
31            $this->changeEmail($user, $userDTO->email);
32        }
33
34        $user->email = $userDTO->email;
35        $user->first_name = $userDTO->firstName;
36        $user->last_name = $userDTO->lastName;
37
38        $saveUser = $user->save();
39
40        if (!$saveUser) {
41            throw new ExpectedException("Failed to update the users data. Please try again later.");
42        }
43
44        return $saveUser;
45    }
46
47    private function changeEmail(User $user, string $email)
48    {
49        $emailExists = User::where('email', $email)->first();
50
51        if ($emailExists) {
52            throw new ExpectedException("This email is already in use. Please try again with a different email.");
53        }
54
55        if ($user->status == "Invited") {
56            $invitation = AdminUserInvitation::where('email', $user->email)->first();
57
58            if ($invitation) {
59                $invitationDTO = new SendUserInvitationDTO(
60                    $user,
61                    $invitation,
62                    $email,
63                    $invitation->admin_email,
64                    $user->company->name,
65                );
66
67                $this->sendUserInvitationAction->execute($invitationDTO);
68            }
69        }
70
71        if (strpos($this->getCurrentPlan($user)->identifier, 'pro') !== false && $user->instancy_id != null) {
72            $instancyDTO = new stdClass();
73            $instancyDTO->email = $email;
74            $instancyDTO->instancyId = $user->instancy_id;
75
76            UpdateUserEmail::dispatch($instancyDTO);
77        }
78
79        if ($user->hubspot_id) {
80            $data = [
81                "email" => $email
82            ];
83
84            try {
85                (new HubspotService)->batchUpdate($user->hubspot_id, $data);
86            } catch (\Exception $e) {
87                Log::error('Error updating user email in Hubspot: ' . $e->getMessage());
88            }
89        }
90    }
91}