$this->associateTag(), 'defaultQuery' => trim((string) $request->query('q', '')), 'defaultAsin' => trim((string) $request->query('asin', '')), 'defaultUrl' => trim((string) $request->query('url', '')), ]); } public function go(Request $request): RedirectResponse { $asin = $this->normalizeAsin((string) $request->query('asin', '')); if ($asin !== null) { return redirect()->away($this->appendAssociateTag('https://www.amazon.it/dp/' . rawurlencode($asin))); } $url = trim((string) $request->query('url', '')); if ($url !== '' && filter_var($url, FILTER_VALIDATE_URL)) { return redirect()->away($this->appendAssociateTag($this->normalizeAmazonUrl($url))); } $query = trim((string) $request->query('q', '')); if ($query !== '') { return redirect()->away($this->appendAssociateTag('https://www.amazon.it/s?k=' . rawurlencode($query))); } return redirect()->route('public.amazon.index'); } private function associateTag(): string { $tag = trim((string) config('services.amazon.referral_tag', '')); if ($tag === '') { $tag = trim((string) config('catalog.amazon.associate_tag', 'netgescon-21')); } return $tag !== '' ? $tag : 'netgescon-21'; } private function appendAssociateTag(string $url): string { $parts = parse_url($url); if (! is_array($parts)) { return $url; } $query = []; parse_str((string) ($parts['query'] ?? ''), $query); $query['tag'] = $this->associateTag(); $base = ($parts['scheme'] ?? 'https') . '://' . ($parts['host'] ?? 'www.amazon.it') . ($parts['path'] ?? ''); return $base . '?' . http_build_query($query); } private function normalizeAmazonUrl(string $url): string { $asin = $this->extractAsinFromUrl($url); if ($asin !== null) { return 'https://www.amazon.it/dp/' . rawurlencode($asin); } return $url; } private function extractAsinFromUrl(string $url): ?string { if (preg_match('~/(?:dp|gp/product)/([A-Z0-9]{10})(?:[/?]|$)~i', $url, $matches)) { return strtoupper($matches[1]); } return null; } private function normalizeAsin(string $value): ?string { $value = strtoupper(trim($value)); $value = preg_replace('/[^A-Z0-9]/', '', $value) ?? ''; return preg_match('/^[A-Z0-9]{10}$/', $value) ? $value : null; } }