From 1742fb859fb7ad6bde4a31a50a1c7497c38a03df Mon Sep 17 00:00:00 2001 From: isaacclad Date: Thu, 2 Jul 2026 08:19:29 +0000 Subject: [PATCH] Fall back to Events when platform QR proxy returns 404. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Event pages like sales-webinar live on events.ladill.com, but ladl.link only proxied to ladill.com/q/* — fix by retrying events.ladill.com when the platform hub has no matching code. Co-authored-by: Cursor --- .env.example | 1 + app/Services/Link/LinkPlatformProxy.php | 37 +++++++++++++++++++------ config/app.php | 1 + tests/Feature/LinkRedirectTest.php | 28 +++++++++++++++++++ 4 files changed, 59 insertions(+), 8 deletions(-) diff --git a/.env.example b/.env.example index 7de9b40..169cd5a 100644 --- a/.env.example +++ b/.env.example @@ -9,6 +9,7 @@ PLATFORM_DOMAIN=ladill.com AUTH_DOMAIN=auth.ladill.com ACCOUNT_DOMAIN=account.ladill.com LINK_PUBLIC_DOMAIN=ladl.link +EVENTS_DOMAIN=events.ladill.com DB_CONNECTION=mysql DB_HOST=127.0.0.1 diff --git a/app/Services/Link/LinkPlatformProxy.php b/app/Services/Link/LinkPlatformProxy.php index 551b568..4864d0e 100644 --- a/app/Services/Link/LinkPlatformProxy.php +++ b/app/Services/Link/LinkPlatformProxy.php @@ -27,8 +27,17 @@ class LinkPlatformProxy ); } - $platform = rtrim((string) config('app.platform_url', 'https://ladill.com'), '/'); - $target = $platform.'/q/'.$slug; + $platformResponse = $this->forwardToQrHub($request, $slug, $normalizedPath, $this->platformBaseUrl()); + if ($platformResponse->getStatusCode() !== 404) { + return $platformResponse; + } + + return $this->forwardToQrHub($request, $slug, $normalizedPath, $this->eventsBaseUrl()); + } + + private function forwardToQrHub(Request $request, string $slug, string $normalizedPath, string $hubBase): Response + { + $target = rtrim($hubBase, '/').'/q/'.$slug; if ($normalizedPath !== '') { $target .= '/'.$normalizedPath; } @@ -98,6 +107,18 @@ class LinkPlatformProxy return $this->forward($request, $slug, substr($path, strlen($slugPrefix))); } + private function platformBaseUrl(): string + { + return rtrim((string) config('app.platform_url', 'https://ladill.com'), '/'); + } + + private function eventsBaseUrl(): string + { + $domain = (string) config('app.events_domain', 'events.ladill.com'); + + return 'https://'.$domain; + } + private function transferBaseUrl(): string { $domain = (string) config('app.transfer_domain', 'transfer.ladill.com'); @@ -133,13 +154,13 @@ class LinkPlatformProxy private function rewriteLocation(string $location, string $slug): string { - $platform = rtrim((string) config('app.platform_url', 'https://ladill.com'), '/'); - $prefix = $platform.'/q/'.$slug; + foreach ([$this->platformBaseUrl(), $this->eventsBaseUrl()] as $base) { + $prefix = $base.'/q/'.$slug; + if (str_starts_with($location, $prefix)) { + $suffix = substr($location, strlen($prefix)); - if (str_starts_with($location, $prefix)) { - $suffix = substr($location, strlen($prefix)); - - return LadillLink::url($slug).$suffix; + return LadillLink::url($slug).$suffix; + } } $transfer = rtrim($this->transferBaseUrl(), '/').'/q/'.$slug; diff --git a/config/app.php b/config/app.php index eb4d8d5..9766217 100644 --- a/config/app.php +++ b/config/app.php @@ -130,6 +130,7 @@ return [ 'account_domain' => env('ACCOUNT_DOMAIN', 'account.'.(parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com')), 'link_domain' => env('LINK_DOMAIN', parse_url((string) env('APP_URL', 'https://link.ladill.com'), PHP_URL_HOST) ?: 'link.ladill.com'), 'transfer_domain' => env('TRANSFER_DOMAIN', 'transfer.ladill.com'), + 'events_domain' => env('EVENTS_DOMAIN', 'events.ladill.com'), 'servers_domain' => env('SERVERS_DOMAIN', 'servers.'.(parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com')), 'domains_domain' => env('DOMAINS_DOMAIN', 'domains.'.(parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com')), diff --git a/tests/Feature/LinkRedirectTest.php b/tests/Feature/LinkRedirectTest.php index f9bcec0..63ac79e 100644 --- a/tests/Feature/LinkRedirectTest.php +++ b/tests/Feature/LinkRedirectTest.php @@ -95,4 +95,32 @@ class LinkRedirectTest extends TestCase && $request->hasHeader('X-Ladill-Internal', '1'); }); } + + public function test_event_qr_falls_back_to_events_app_when_platform_returns_404(): void + { + $user = $this->user(); + ShortLink::create([ + 'user_id' => $user->id, + 'slug' => 'sales-webinar', + 'source_app' => 'events', + 'source_kind' => 'qr', + 'is_managed_here' => false, + 'destination_url' => 'https://ladl.link/sales-webinar', + 'is_active' => true, + ]); + + Http::fake([ + 'https://ladill.com/q/sales-webinar' => Http::response('Not found', 404), + 'https://events.ladill.com/q/sales-webinar' => Http::response('Event page', 200), + ]); + + $this->get('https://ladl.link/sales-webinar') + ->assertOk() + ->assertSee('Event page'); + + Http::assertSent(function ($request) { + return $request->url() === 'https://events.ladill.com/q/sales-webinar' + && $request->hasHeader('X-Ladill-Internal', '1'); + }); + } }