From 119f486bb8c4fe8996ca71b6618a540b7ea00aef Mon Sep 17 00:00:00 2001 From: michele Date: Sat, 2 May 2026 22:40:02 +0000 Subject: [PATCH] Add public Amazon referral page --- .../PublicAccess/AmazonReferralController.php | 96 +++++++ .../views/public/amazon-referral.blade.php | 242 ++++++++++++++++++ routes/web.php | 21 +- 3 files changed, 352 insertions(+), 7 deletions(-) create mode 100644 app/Http/Controllers/PublicAccess/AmazonReferralController.php create mode 100644 resources/views/public/amazon-referral.blade.php diff --git a/app/Http/Controllers/PublicAccess/AmazonReferralController.php b/app/Http/Controllers/PublicAccess/AmazonReferralController.php new file mode 100644 index 0000000..1f3a09c --- /dev/null +++ b/app/Http/Controllers/PublicAccess/AmazonReferralController.php @@ -0,0 +1,96 @@ + $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; + } +} \ No newline at end of file diff --git a/resources/views/public/amazon-referral.blade.php b/resources/views/public/amazon-referral.blade.php new file mode 100644 index 0000000..6a1b205 --- /dev/null +++ b/resources/views/public/amazon-referral.blade.php @@ -0,0 +1,242 @@ + + + + + + Amazon con Tag NetGescon + + + +
+
+
+
Tag attivo: {{ $associateTag }}
+

Apri Amazon con il link affiliato NetGescon

+

Questa pagina pubblica serve ad aprire Amazon con il tag corretto. Puoi cercare un prodotto, incollare un ASIN oppure ripulire un link Amazon già esistente aggiungendo automaticamente il tag.

+

In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei.

+
+ +
+

Come usarla

+
    +
  • Se conosci il nome del prodotto usa la ricerca per testo.
  • +
  • Se hai già il codice ASIN, incollalo e apri direttamente la scheda prodotto.
  • +
  • Se ti mandano un link Amazon, incollalo qui e il sistema aggiunge il tag automaticamente.
  • +
+
+
+ +
+
+

Ricerca per testo

+
+ + +
+
+ +
+
+ +
+

Apertura diretta ASIN

+
+ + +
+
+ +
+
+ +
+

Normalizza link Amazon

+
+ + +
+
+ +
+
+
+ +
+

Esempio pronto

+

Puoi già distribuire anche un link diretto, ad esempio per il prodotto che stavamo testando.

+ Apri B0DN6PD8QS con tag NetGescon +
Link base da far girare: {{ route('public.amazon.index') }}
+
+
+ + \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 5b074a2..f47ffa0 100755 --- a/routes/web.php +++ b/routes/web.php @@ -45,6 +45,11 @@ return redirect('/admin-filament'); }); +Route::prefix('public/amazon')->name('public.amazon.')->group(function () { + Route::get('/', [\App\Http\Controllers\PublicAccess\AmazonReferralController::class, 'index'])->name('index'); + Route::get('/go', [\App\Http\Controllers\PublicAccess\AmazonReferralController::class, 'go'])->name('go'); +}); + Route::middleware('signed')->prefix('public/letture-acqua')->name('public.water-reading.')->group(function () { Route::get('/', [\App\Http\Controllers\PublicAccess\WaterReadingRequestController::class, 'show'])->name('show'); Route::post('/', [\App\Http\Controllers\PublicAccess\WaterReadingRequestController::class, 'store'])->name('store'); @@ -168,6 +173,15 @@ ->name('diagnostica_fatture_elettroniche'); }); + Route::middleware(['role:super-admin|admin|amministratore|collaboratore|fornitore'])->prefix('admin')->name('admin.')->group(function () { + // Fatture elettroniche ricevute (azioni) + Route::get('fatture-elettroniche/{fattura}/download-xml', [\App\Http\Controllers\Admin\FattureElettronicheRicevuteController::class, 'downloadXml']) + ->name('fatture-elettroniche.download-xml'); + + Route::get('fatture-elettroniche/{fattura}/download-pdf', [\App\Http\Controllers\Admin\FattureElettronicheRicevuteController::class, 'downloadPdf']) + ->name('fatture-elettroniche.download-pdf'); + }); + // --- ADMIN / AMMINISTRATORE PANEL --- Route::middleware(['role:super-admin|admin|amministratore|collaboratore'])->prefix('admin')->name('admin.')->group(function () { // Dashboard dell'amministratore @@ -185,13 +199,6 @@ Route::get('filament/stabili/{stabile}', [FilamentBridgeController::class, 'openStabile']) ->name('filament.stabili.open'); - // Fatture elettroniche ricevute (azioni) - Route::get('fatture-elettroniche/{fattura}/download-xml', [\App\Http\Controllers\Admin\FattureElettronicheRicevuteController::class, 'downloadXml']) - ->name('fatture-elettroniche.download-xml'); - - Route::get('fatture-elettroniche/{fattura}/download-pdf', [\App\Http\Controllers\Admin\FattureElettronicheRicevuteController::class, 'downloadPdf']) - ->name('fatture-elettroniche.download-pdf'); - // Dashboard per categorie del menu Route::prefix('dashboards')->name('dashboards.')->group(function () { Route::get('/stabili', [\App\Http\Controllers\Admin\CategoryDashboardController::class, 'stabili'])->name('stabili');