From 86f767a626108e203744f543bf5ece1fa492941e Mon Sep 17 00:00:00 2001 From: boban Date: Sat, 16 May 2026 01:00:10 +0200 Subject: [PATCH] fix(analytics): UTM from query string, iOS before macOS detection, remove dead referer fallback --- app/Domains/Analytics/Jobs/RecordClickJob.php | 13 +++++++------ app/Http/Controllers/RedirectController.php | 5 +++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/Domains/Analytics/Jobs/RecordClickJob.php b/app/Domains/Analytics/Jobs/RecordClickJob.php index 560fcfe..67d9141 100644 --- a/app/Domains/Analytics/Jobs/RecordClickJob.php +++ b/app/Domains/Analytics/Jobs/RecordClickJob.php @@ -20,6 +20,7 @@ class RecordClickJob implements ShouldQueue public readonly string $ip, public readonly ?string $userAgent, public readonly array $headers, + public readonly array $queryParams = [], ) {} public function handle(): void @@ -40,10 +41,10 @@ class RecordClickJob implements ShouldQueue 'device' => $device, 'os' => $this->detectOs($this->userAgent ?? ''), 'browser' => $this->detectBrowser($this->userAgent ?? ''), - 'referrer_host' => $this->extractHost($this->headers['referer'][0] ?? $this->headers['Referer'][0] ?? null), - 'utm_source' => $this->headers['utm_source'][0] ?? null, - 'utm_medium' => $this->headers['utm_medium'][0] ?? null, - 'utm_campaign' => $this->headers['utm_campaign'][0] ?? null, + 'referrer_host' => $this->extractHost($this->headers['referer'][0] ?? null), + 'utm_source' => $this->queryParams['utm_source'] ?? null, + 'utm_medium' => $this->queryParams['utm_medium'] ?? null, + 'utm_campaign' => $this->queryParams['utm_campaign'] ?? null, 'language' => substr($this->headers['accept-language'][0] ?? 'de', 0, 10), ]); @@ -82,10 +83,10 @@ class RecordClickJob implements ShouldQueue private function detectOs(string $ua): ?string { - if (stripos($ua, 'Windows') !== false) return 'windows'; - if (stripos($ua, 'Mac OS') !== false) return 'macos'; if (stripos($ua, 'iPhone') !== false || stripos($ua, 'iPad') !== false) return 'ios'; if (stripos($ua, 'Android') !== false) return 'android'; + if (stripos($ua, 'Windows') !== false) return 'windows'; + if (stripos($ua, 'Mac OS') !== false) return 'macos'; if (stripos($ua, 'Linux') !== false) return 'linux'; return null; } diff --git a/app/Http/Controllers/RedirectController.php b/app/Http/Controllers/RedirectController.php index dfd6225..35deadf 100644 --- a/app/Http/Controllers/RedirectController.php +++ b/app/Http/Controllers/RedirectController.php @@ -44,9 +44,10 @@ class RedirectController extends Controller // 4. RecordClickJob dispatched in Task 7 \App\Domains\Analytics\Jobs\RecordClickJob::dispatch( (int) $data['link_id'], - $request->ip(), + $request->ip() ?? '', $request->userAgent() ?? '', - $request->headers->all() + $request->headers->all(), + $request->query(), )->onQueue('clicks'); // 5. 302 redirect