Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
100.00% |
35 / 35 |
|
100.00% |
5 / 5 |
CRAP | |
100.00% |
1 / 1 |
| TelemetryService | |
100.00% |
35 / 35 |
|
100.00% |
5 / 5 |
10 | |
100.00% |
1 / 1 |
| deleteSession | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| mergeSessions | |
100.00% |
11 / 11 |
|
100.00% |
1 / 1 |
1 | |||
| ungroupSession | |
100.00% |
8 / 8 |
|
100.00% |
1 / 1 |
3 | |||
| groupSessions | |
100.00% |
10 / 10 |
|
100.00% |
1 / 1 |
4 | |||
| resetAll | |
100.00% |
5 / 5 |
|
100.00% |
1 / 1 |
1 | |||
| 1 | <?php |
| 2 | |
| 3 | namespace App\Services; |
| 4 | |
| 5 | use App\Models\TelemetryEvent; |
| 6 | use App\Models\TelemetryMetric; |
| 7 | use App\Models\TelemetrySession; |
| 8 | use Illuminate\Support\Facades\DB; |
| 9 | use Illuminate\Support\Str; |
| 10 | |
| 11 | class 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 | } |