Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
35 / 35
100.00% covered (success)
100.00%
5 / 5
CRAP
100.00% covered (success)
100.00%
1 / 1
TelemetryService
100.00% covered (success)
100.00%
35 / 35
100.00% covered (success)
100.00%
5 / 5
10
100.00% covered (success)
100.00%
1 / 1
 deleteSession
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 mergeSessions
100.00% covered (success)
100.00%
11 / 11
100.00% covered (success)
100.00%
1 / 1
1
 ungroupSession
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 groupSessions
100.00% covered (success)
100.00%
10 / 10
100.00% covered (success)
100.00%
1 / 1
4
 resetAll
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace App\Services;
4
5use App\Models\TelemetryEvent;
6use App\Models\TelemetryMetric;
7use App\Models\TelemetrySession;
8use Illuminate\Support\Facades\DB;
9use Illuminate\Support\Str;
10
11class TelemetryService
12{
13    public function deleteSession(string $sessionId): bool
14    {
15        return (bool) TelemetrySession::where('session_id', $sessionId)->delete();
16    }
17
18    public function mergeSessions(string $sourceId, string $targetId): void
19    {
20        $source = TelemetrySession::where('session_id', $sourceId)->firstOrFail();
21        $target = TelemetrySession::where('session_id', $targetId)->firstOrFail();
22
23        DB::transaction(function () use ($source, $target, $sourceId, $targetId) {
24            TelemetryMetric::where('session_id', $sourceId)->update(['session_id' => $targetId]);
25            TelemetryEvent::where('session_id', $sourceId)->update(['session_id' => $targetId]);
26
27            $target->update([
28                'first_seen_at' => min($target->first_seen_at, $source->first_seen_at),
29                'last_seen_at' => max($target->last_seen_at, $source->last_seen_at),
30            ]);
31
32            $source->delete();
33        });
34    }
35
36    public function ungroupSession(string $sessionId): void
37    {
38        $session = TelemetrySession::where('session_id', $sessionId)->firstOrFail();
39        $groupId = $session->session_group_id;
40
41        if (! $groupId) {
42            return;
43        }
44
45        $session->update(['session_group_id' => null]);
46
47        $remaining = TelemetrySession::where('session_group_id', $groupId)->count();
48        if ($remaining === 1) {
49            TelemetrySession::where('session_group_id', $groupId)->update(['session_group_id' => null]);
50        }
51    }
52
53    public function groupSessions(string $sessionIdA, string $sessionIdB): void
54    {
55        $a = TelemetrySession::where('session_id', $sessionIdA)->firstOrFail();
56        $b = TelemetrySession::where('session_id', $sessionIdB)->firstOrFail();
57
58        $groupId = $a->session_group_id ?? $b->session_group_id ?? (string) Str::ulid();
59
60        DB::transaction(function () use ($a, $b, $groupId) {
61            if ($a->session_group_id && $b->session_group_id && $a->session_group_id !== $b->session_group_id) {
62                TelemetrySession::where('session_group_id', $b->session_group_id)
63                    ->update(['session_group_id' => $groupId]);
64            }
65
66            $a->update(['session_group_id' => $groupId]);
67            $b->update(['session_group_id' => $groupId]);
68        });
69    }
70
71    public function resetAll(): void
72    {
73        DB::transaction(function () {
74            TelemetryEvent::truncate();
75            TelemetryMetric::truncate();
76            TelemetrySession::truncate();
77        });
78    }
79}