96 lines
2.9 KiB
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;
|
|
}
|
|
} |