Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 216
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
FlyGrammarController
0.00% covered (danger)
0.00%
0 / 216
0.00% covered (danger)
0.00%
0 / 5
1980
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
 quota
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 create
0.00% covered (danger)
0.00%
0 / 38
0.00% covered (danger)
0.00%
0 / 1
56
 actions
0.00% covered (danger)
0.00%
0 / 170
0.00% covered (danger)
0.00%
0 / 1
1190
 dictionary
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Http\Controllers\v1;
4
5use App\Http\Controllers\Controller;
6use App\Http\Models\FlyGrammarActions;
7use App\Http\Models\Setting;
8use App\Http\Models\UserExtensionTrackActions;
9use App\Http\Models\UserInfo;
10use App\Http\Requests\TrackingFlyGrammarFormRequest;
11use App\Http\Services\StatisticsService;
12use App\Http\Services\WPSService;
13use App\Services\UserInfo\UserInfoService;
14use App\Traits\SubscriptionTrait;
15use Carbon\Carbon;
16use Exception;
17use Illuminate\Http\JsonResponse;
18use Illuminate\Http\Request;
19use Illuminate\Support\Facades\Log;
20use MongoDB\BSON\UTCDateTime;
21use Symfony\Component\HttpFoundation\Response;
22
23class FlyGrammarController extends Controller
24{
25    use SubscriptionTrait;
26
27    public function __construct(
28        protected StatisticsService $statisticsService,
29        protected UserInfoService $userInfoService,
30        protected WPSService $wpsService
31    ) {}
32
33    public function quota(Request $request): JsonResponse
34    {
35        $user = $request->user();
36
37        $quota = $this->getGrammarQuota($user);
38
39        return response()->json(['data' => $quota], Response::HTTP_OK);
40    }
41
42    public function create(TrackingFlyGrammarFormRequest $request): JsonResponse
43    {
44        try {
45            $data = $request->validated();
46            $user = $request->user();
47
48            $chromeVersion = $request->header('flymsg_extension_version_for_chrome') ?? $request->header('Flymsg_extension_version_for_chrome') ?? $request->header('flymsgextensionversionforchrome') ?? $request->header('flymsgExtensionVersionForChrome');
49            $edgeVersion = $request->header('flymsg_extension_version_for_edge') ?? $request->header('Flymsg_extension_version_for_edge') ?? $request->header('flymsgextensionversionforedge') ?? $request->header('flymsgExtensionVersionForEdge');
50
51            if (empty($chromeVersion) && empty($edgeVersion)) {
52                Log::info('Extension version not found in headers. User: '.$user->email, [
53                    'user' => $user,
54                    'headers' => $request->header(),
55                ]);
56            }
57
58            $plan = $this->getCurrentPlan($user);
59
60            $charactersSaved = strlen($data['result_text'] ?? '');
61            $timeSaved = $this->statisticsService->getTimeSaved($user, $charactersSaved);
62            $costSaved = $this->statisticsService->getCostSaved($user, $timeSaved, now());
63
64            FlyGrammarActions::create([
65                'name' => $data['description'] ?? '',
66                'original_text' => $data['original_text'] ?? '',
67                'result_text' => $data['result_text'] ?? '',
68                'action_type' => $data['description'] ?? '',
69                'user_id' => $user->id,
70                'provider' => $data['provider'] ?? '',
71                'characters_count' => $charactersSaved,
72                'characters_saved' => $charactersSaved,
73                // 'characters_saved' => strlen($data['result_text']) <= strlen($data['original_text']) ? strlen($data['result_text']) : (strlen($data['original_text']) - strlen($data['result_text'])),
74                'time_saved' => $timeSaved,
75                'cost_saved' => $costSaved,
76                'plan_id' => $plan?->id,
77                'company_id' => $user->company_id,
78                'language' => $data['language'] ?? '',
79            ]);
80
81            $userInfo = UserInfo::where('user_id', $user->id)->first();
82            if ($userInfo) {
83                $userInfo->last_date_user_used_flygrammar = new UTCDateTime(now()->getTimestamp() * 1000);
84                if (! empty($chromeVersion)) {
85                    $userInfo->flymsg_extension_version_for_chrome = $chromeVersion;
86                }
87
88                if (! empty($edgeVersion)) {
89                    $userInfo->flymsg_extension_version_for_edge = $edgeVersion;
90                }
91            }
92        } catch (Exception $e) {
93            return response()->json(['data' => [], 'message' => $e->getMessage(), 'error' => 1], Response::HTTP_INTERNAL_SERVER_ERROR);
94        }
95
96        return response()->json(['data' => [], 'message' => 'Succeed', 'error' => 0], Response::HTTP_OK);
97    }
98
99    public function actions(Request $request): JsonResponse
100    {
101        try {
102            $user = $request->user();
103
104            $chromeVersion = $request->header('flymsg_extension_version_for_chrome') ?? $request->header('Flymsg_extension_version_for_chrome') ?? $request->header('flymsgextensionversionforchrome') ?? $request->header('flymsgExtensionVersionForChrome');
105            $edgeVersion = $request->header('flymsg_extension_version_for_edge') ?? $request->header('Flymsg_extension_version_for_edge') ?? $request->header('flymsgextensionversionforedge') ?? $request->header('flymsgExtensionVersionForEdge');
106
107            if (empty($chromeVersion) && empty($edgeVersion)) {
108                Log::info('Extension version not found in headers. User: '.$user->email, [
109                    'user' => $user,
110                    'headers' => $request->header(),
111                ]);
112            }
113
114            $plan = $this->getCurrentPlan($user);
115
116            $action = $request->input('action', '');
117
118            if ($action !== 'check') {
119
120                if ($action === 'accept' || $action === 'replace' || $action === 'accept') {
121                    if (! empty($user)) {
122                        $event = new UserExtensionTrackActions;
123                        $event->user_id = $user->id;
124                        $event->heap_analytics_id = $user->heap_analytics_id;
125                        $event->event_name = 'flymsg_extension_flygrammar_accept_suggestion';
126                        $event->type = $request->input('type', '');
127
128                        if (! empty($request->extension_version)) {
129                            $event->extension_version = $request->extension_version;
130                        }
131
132                        if (! empty($request->domain)) {
133                            $event->domain = $request->domain;
134                        }
135
136                        if (! empty($request->url)) {
137                            $event->url = $request->url;
138                        }
139
140                        if (! empty($request->browser)) {
141                            $event->browser = $request->browser;
142                        }
143
144                        if (! empty($request->executed_at)) {
145                            $date = Carbon::parse($request->executed_at);
146                            $event->executed_at = new UTCDateTime($date->getTimestamp() * 1000);
147                        }
148
149                        $event->save();
150                    }
151                }
152
153                if ($action === 'autocorrect') {
154                    $charactersSaved = strlen($request->input('replacement', ''));
155                    $timeSaved = $this->statisticsService->getTimeSaved($user, $charactersSaved);
156                    $costSaved = $this->statisticsService->getCostSaved($user, $timeSaved, now());
157                    $userSettings = Setting::where('user_id', $user->id)->first();
158
159                    $quota = $this->getGrammarQuota($user);
160
161                    FlyGrammarActions::create([
162                        'name' => $request->input('action', ''),
163                        'original_text' => $request->input('word', ''),
164                        'result_text' => $request->input('replacement', ''),
165                        'action_type' => $action,
166                        'user_id' => $user->id,
167                        'provider' => 'wsc',
168                        'characters_count' => $charactersSaved,
169                        'characters_saved' => $charactersSaved,
170                        'time_saved' => $timeSaved,
171                        'cost_saved' => $costSaved,
172                        'plan_id' => $plan?->id,
173                        'company_id' => $user->company_id,
174                        'language' => $userSettings?->fly_grammar_default_language ?? 'auto',
175                        'executed_at' => $request->input('executed_at', ''),
176                    ]);
177
178                    $quota['remaining'] = max($quota['remaining'] - 1, 0);
179                    $quota['used'] += 1;
180
181                    return response()->json(['data' => [
182                        'quota' => $quota,
183                    ], 'message' => 'Succeed'], Response::HTTP_OK);
184                }
185
186                if ($action === 'replace') {
187                    $charactersSaved = strlen($request->input('newText', ''));
188                    $timeSaved = $this->statisticsService->getTimeSaved($user, $charactersSaved);
189                    $costSaved = $this->statisticsService->getCostSaved($user, $timeSaved, now());
190
191                    $type = $request->input('type', '');
192
193                    $multiplierNegativeCount = 1;
194
195                    if ($type === 'autocorrect') {
196                        $multiplierNegativeCount = -1;
197                    }
198                    $quota = $this->getGrammarQuota($user);
199
200                    FlyGrammarActions::create([
201                        'name' => $type,
202                        'original_text' => $request->input('text', ''),
203                        'result_text' => $request->input('newText', ''),
204                        'action_type' => $action,
205                        'user_id' => $user->id,
206                        'provider' => 'wsc',
207                        'characters_count' => $charactersSaved * $multiplierNegativeCount,
208                        'characters_saved' => $charactersSaved * $multiplierNegativeCount,
209                        // 'characters_saved' => strlen($data['result_text']) <= strlen($data['original_text']) ? strlen($data['result_text']) : (strlen($data['original_text']) - strlen($data['result_text'])),
210                        'time_saved' => $timeSaved * $multiplierNegativeCount,
211                        'cost_saved' => $costSaved * $multiplierNegativeCount,
212                        'plan_id' => $plan?->id,
213                        'company_id' => $user->company_id,
214                        'language' => $request->input('detectedLang', $request->input('lang', 'auto')),
215                        'executed_at' => $request->input('executed_at', ''),
216                        'context' => $request->input('context', ''),
217                    ]);
218
219                    $userInfo = UserInfo::where('user_id', $user->id)->first();
220                    if ($userInfo) {
221                        $userInfo->last_date_user_used_flygrammar = new UTCDateTime(now()->getTimestamp() * 1000);
222                        if (! empty($chromeVersion)) {
223                            $userInfo->flymsg_extension_version_for_chrome = $chromeVersion;
224                        }
225
226                        if (! empty($edgeVersion)) {
227                            $userInfo->flymsg_extension_version_for_edge = $edgeVersion;
228                        }
229                    }
230
231                    $quota['remaining'] = max($quota['remaining'] - 1, 0);
232                    $quota['used'] += 1;
233
234                    return response()->json(['data' => [
235                        'quota' => $quota,
236                    ], 'message' => 'Succeed'], Response::HTTP_OK);
237                }
238
239                $type = $request->input('type', '');
240                if ($action === 'accept' && $type === 'autocomplete') {
241                    $charactersSaved = strlen($request->input('newText', ''));
242                    $timeSaved = $this->statisticsService->getTimeSaved($user, $charactersSaved);
243                    $costSaved = $this->statisticsService->getCostSaved($user, $timeSaved, now());
244
245                    $quota = $this->getGrammarQuota($user);
246
247                    FlyGrammarActions::create([
248                        'name' => $action,
249                        'original_text' => $request->input('text', ''),
250                        'result_text' => $request->input('newText', ''),
251                        'action_type' => $type,
252                        'user_id' => $user->id,
253                        'provider' => 'wsc',
254                        'characters_count' => $charactersSaved,
255                        'characters_saved' => $charactersSaved,
256                        'time_saved' => $timeSaved,
257                        'cost_saved' => $costSaved,
258                        'plan_id' => $plan?->id,
259                        'company_id' => $user->company_id,
260                        'language' => $request->input('lang', 'auto'),
261                        'executed_at' => $request->input('url', ''),
262                        'context' => $request->input('context', ''),
263                    ]);
264
265                    $userInfo = UserInfo::where('user_id', $user->id)->first();
266                    if ($userInfo) {
267                        $userInfo->last_date_user_used_flygrammar = new UTCDateTime(now()->getTimestamp() * 1000);
268                        if (! empty($chromeVersion)) {
269                            $userInfo->flymsg_extension_version_for_chrome = $chromeVersion;
270                        }
271
272                        if (! empty($edgeVersion)) {
273                            $userInfo->flymsg_extension_version_for_edge = $edgeVersion;
274                        }
275                    }
276
277                    $quota['remaining'] = max($quota['remaining'] - 1, 0);
278                    $quota['used'] += 1;
279
280                    return response()->json(['data' => [
281                        'quota' => $quota,
282                    ], 'message' => 'Succeed'], Response::HTTP_OK);
283                }
284
285                if ($action === 'settings_change' && $request->input('settings', false)) {
286                    $userSettings = Setting::where('user_id', $user->id)->first();
287                    $newSettings = [];
288
289                    if ($userSettings) {
290                        if (! empty($userSettings->fly_grammar_settings)) {
291                            $newSettings = $userSettings->fly_grammar_settings;
292                        }
293
294                        foreach ($request->input('settings') as $key => $value) {
295                            $newSettings[$key] = $value;
296                        }
297
298                        $userSettings->fly_grammar_settings = $newSettings;
299                        $userSettings->save();
300                    } else {
301                        $newSettings = $request->input('settings');
302                        Setting::create([
303                            'user_id' => $user->id,
304                            'fly_grammar_settings' => $request->input('settings'),
305                        ]);
306                    }
307
308                    if (! empty($request->input('settings')['lang'])) {
309                        $userSetting = Setting::where('user_id', $user->id)->first();
310                        if ($userSetting) {
311                            $userSetting->fly_grammar_default_language = $request->input('settings')['lang'];
312                            $userSetting->save();
313                        }
314                    }
315
316                    return response()->json(['data' => [
317                        'grammar_settings' => $newSettings,
318                    ], 'message' => 'Succeed'], Response::HTTP_OK);
319                }
320
321                if ($action === 'delete') {
322                    $word = $request->input('text', '');
323
324                    $this->wpsService->removeWordToUserDictionary($user, $word);
325
326                    $dictionary = $this->wpsService->getUserDictionary($request->user());
327
328                    return response()->json(['data' => [
329                        'dictionary' => $dictionary,
330                    ], 'message' => 'Succeed'], Response::HTTP_OK);
331                }
332
333                if ($action === 'add') {
334                    $word = $request->input('text', '');
335
336                    $this->wpsService->addWordToUserDictionary($user, $word);
337
338                    $dictionary = $this->wpsService->getUserDictionary($request->user());
339
340                    return response()->json(['data' => [
341                        'dictionary' => $dictionary,
342                    ], 'message' => 'Succeed'], Response::HTTP_OK);
343                }
344
345                // if ($action === 'usage') {
346                //     $charactersSaved = strlen($request->input('replacement', ''));
347                //     $timeSaved = $this->statisticsService->getTimeSaved($user, $charactersSaved);
348                //     $costSaved = $this->statisticsService->getCostSaved($user, $timeSaved, now());
349                //     $userSettings = Setting::where('user_id', $user->id)->first();
350
351                //     $quota = $this->getGrammarQuota($user);
352
353                //     FlyGrammarActions::create([
354                //         'name' => $request->input('action', ''),
355                //         'original_text' => $request->input('text', ''),
356                //         'action_type' => $action,
357                //         'user_id' => $user->id,
358                //         'provider' => 'wsc',
359
360                //         'result_text' => $request->input('replacement', ''),
361                //         'characters_count' => $charactersSaved,
362                //         'characters_saved' => $charactersSaved,
363                //         'time_saved' => $timeSaved,
364                //         'cost_saved' => $costSaved,
365                //         'plan_id' => $plan?->id,
366                //         'company_id' => $user->company_id,
367                //         'language' => $userSettings?->fly_grammar_default_language ?? 'auto',
368                //         'executed_at' => $request->input('executed_at', ''),
369                //     ]);
370
371                //     $quota['remaining'] = max($quota['remaining'] - 1, 0);
372                //     $quota['used'] += 1;
373
374                //     return response()->json(['data' => [
375                //         'quota' => $quota,
376                //     ], 'message' => 'Succeed'], Response::HTTP_OK);
377                // }
378            }
379        } catch (Exception $e) {
380            return response()->json(['data' => [], 'message' => $e->getMessage(), 'error' => 1], Response::HTTP_OK);
381        }
382
383        return response()->json(['data' => [], 'message' => 'Succeed'], Response::HTTP_OK);
384    }
385
386    public function dictionary(Request $request): JsonResponse
387    {
388        $word = $request->input('word', '');
389
390        $this->wpsService->addWordToUserDictionary($request->user(), $word);
391
392        $dictionary = $this->wpsService->getUserDictionary($request->user());
393
394        return response()->json(['data' => $dictionary, 'message' => 'Succeed'], Response::HTTP_OK);
395    }
396}