Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
TrackFlyMsgAIUsageEventListener
0.00% covered (danger)
0.00%
0 / 56
0.00% covered (danger)
0.00%
0 / 2
20
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 / 55
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3namespace App\Listeners;
4
5use App\Http\Models\FlyMsgAI\FlyMsgAITracking;
6use App\Http\Services\StatisticsService;
7use Carbon\Carbon;
8use Illuminate\Contracts\Queue\ShouldQueue;
9
10class TrackFlyMsgAIUsageEventListener implements ShouldQueue
11{
12    public function __construct(protected StatisticsService $statisticsService) {}
13
14    public function handle($event)
15    {
16        $user = $event->user;
17        $prompt_response = $event->prompt_response;
18        $browser = $event->browser;
19        $button = $event->button;
20        $prompt = $event->prompt;
21        $feature = $event->feature;
22        $uniqueId = $event->uniqueId;
23        $aiResult = $event->aiResult;
24        $context = $event->context;
25
26        FlyMsgAITracking::create([
27            'user_id' => $user->id,
28            'browser' => $browser,
29            'button' => $button,
30            'prompt' => $prompt,
31            'feature' => $feature,
32            'prompt_response' => $prompt_response,
33            'unique_id' => $uniqueId,
34            'prompt_plain_response' => $aiResult['response'],
35            'prompt' => $aiResult['prompt'],
36            'context' => $context,
37        ]);
38        // Track characters generated to contribute to time saves
39        $charactersTyped = strlen(strip_tags($prompt_response));
40        $charactersSaved = $charactersTyped;
41        $timeSaved = $this->statisticsService->getTimeSaved($user, $charactersSaved);
42        $costSaved = $this->statisticsService->getCostSaved($user, $timeSaved, now());
43        $user->flycutUsage()->create([
44            'characters_typed' => $charactersTyped,
45            'characters_saved' => $charactersSaved,
46            'time_saved' => $timeSaved,
47            'cost_saved' => $costSaved,
48            'executed_at' => Carbon::now()->toDateTimeString(),
49            'feature' => $feature,
50        ]);
51
52        $monthYear = now()->format('M Y');
53        $newData = [
54            'month_year' => now()->format('M Y'),
55            'characters_typed' => $charactersTyped,
56            'characters_saved' => $charactersSaved,
57            'time_saved' => $timeSaved,
58            'cost_saved' => $costSaved,
59        ];
60
61        if ($user->charts()->exists()) {
62            $chart = $user->charts()->firstWhere('month_year', $monthYear);
63            if ($chart) {
64                $chart->update(
65                    [
66                        'month_year' => now()->format('M Y'),
67                        'characters_typed' => $charactersTyped + $chart->characters_typed,
68                        'characters_saved' => $charactersSaved + $chart->characters_saved,
69                        'time_saved' => $timeSaved + $chart->time_saved,
70                        'cost_saved' => $costSaved + $chart->cost_saved,
71                    ]
72                );
73            } else {
74                $user->charts()->create($newData);
75            }
76        } else {
77            $user->charts()->create($newData);
78        }
79    }
80}