netgescon-day0/app/Http/Controllers/PublicAccess/AmazonReferralController.php

96 lines
2.9 KiB
PHP

<?php
namespace App\Http\Controllers\PublicAccess;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\View\View;
class AmazonReferralController
{
public function index(Request $request): View
{
return view('public.amazon-referral', [
'associateTag' => $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;
}
}