Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
FlycutResharedListener
0.00% covered (danger)
0.00%
0 / 36
0.00% covered (danger)
0.00%
0 / 3
56
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
 handle
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
12
 updateFlyshare
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace App\Listeners\User;
4
5use App\Events\User\FlycutResharedEvent;
6use App\Http\Models\Auth\User;
7use App\Http\Models\ClonedSharedShortcut;
8use App\Http\Models\FlyShare;
9use App\Http\Models\ShareHistory;
10use App\Http\Services\FlyShareService;
11use App\Mail\FlyCutSharedMail;
12use App\Services\Email\EmailService;
13use Illuminate\Contracts\Queue\ShouldQueue;
14use Illuminate\Support\Facades\Mail;
15use MongoDB\BSON\UTCDateTime;
16
17class FlycutResharedListener implements ShouldQueue
18{
19    /**
20     * The flyshare service implementation.
21     *
22     * @var FlyShareService
23     */
24    protected $flyshareService;
25
26    /**
27     * Create the event listener.
28     *
29     * @return void
30     */
31    public function __construct(
32        FlyShareService $flyshareService,
33        private readonly EmailService $emailService
34    ) {
35        $this->flyshareService = $flyshareService;
36    }
37
38    /**
39     * Handle the event.
40     */
41    public function handle(FlycutResharedEvent $event): void
42    {
43        $flyshare = $event->flyshare;
44        $shortcut = ClonedSharedShortcut::find($event->clonedShortcutId);
45
46        $shortcutPreview = $this->flyshareService->fullTextToPreview($shortcut->text);
47
48        try {
49            $this->emailService->send(
50                $event->recipientEmail,
51                new FlyCutSharedMail(
52                    $flyshare->id,
53                    $flyshare->user->first_name,
54                    $flyshare->user->last_name,
55                    $shortcutPreview,
56                    ''
57                ),
58                'cac_invite_user',
59                false
60            );
61            if (count(Mail::failures()) < 1) {
62                $this->updateFlyshare($flyshare, $event->recipientEmail);
63            }
64        } catch (\Throwable $th) {
65            throw $th;
66        }
67    }
68
69    /**
70     * Update flyshare record with users' email where shortcut invite link was sent to
71     */
72    private function updateFlyshare(FlyShare $flyshare, string $recipientEmail): void
73    {
74        $shareHistory = ShareHistory::where([
75            ['flyshare_id', $flyshare->id],
76            ['email', $recipientEmail],
77        ])->first();
78
79        if ($shareHistory) {
80            $shareHistory->update([
81                'resent_at' => new UTCDateTime(now()),
82            ]);
83
84            return;
85        }
86
87        $user = User::where('email', $recipientEmail)->first();
88
89        $flyshare->shareHistory()->create([
90            'email' => $recipientEmail,
91            'status' => FlyShare::FLYSHARE_INVITE_STATUS_PENDING,
92            'registered' => filled($user),
93            'user_id' => filled($user) ? $user->id : null,
94        ]);
95    }
96}