Fall back to Events when platform QR proxy returns 404.
Deploy Ladill Link / deploy (push) Successful in 48s

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 <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-02 08:19:29 +00:00
co-authored by Cursor
parent c73a0d869b
commit 1742fb859f
4 changed files with 59 additions and 8 deletions
+1
View File
@@ -9,6 +9,7 @@ PLATFORM_DOMAIN=ladill.com
AUTH_DOMAIN=auth.ladill.com AUTH_DOMAIN=auth.ladill.com
ACCOUNT_DOMAIN=account.ladill.com ACCOUNT_DOMAIN=account.ladill.com
LINK_PUBLIC_DOMAIN=ladl.link LINK_PUBLIC_DOMAIN=ladl.link
EVENTS_DOMAIN=events.ladill.com
DB_CONNECTION=mysql DB_CONNECTION=mysql
DB_HOST=127.0.0.1 DB_HOST=127.0.0.1
+29 -8
View File
@@ -27,8 +27,17 @@ class LinkPlatformProxy
); );
} }
$platform = rtrim((string) config('app.platform_url', 'https://ladill.com'), '/'); $platformResponse = $this->forwardToQrHub($request, $slug, $normalizedPath, $this->platformBaseUrl());
$target = $platform.'/q/'.$slug; 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 !== '') { if ($normalizedPath !== '') {
$target .= '/'.$normalizedPath; $target .= '/'.$normalizedPath;
} }
@@ -98,6 +107,18 @@ class LinkPlatformProxy
return $this->forward($request, $slug, substr($path, strlen($slugPrefix))); 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 private function transferBaseUrl(): string
{ {
$domain = (string) config('app.transfer_domain', 'transfer.ladill.com'); $domain = (string) config('app.transfer_domain', 'transfer.ladill.com');
@@ -133,13 +154,13 @@ class LinkPlatformProxy
private function rewriteLocation(string $location, string $slug): string private function rewriteLocation(string $location, string $slug): string
{ {
$platform = rtrim((string) config('app.platform_url', 'https://ladill.com'), '/'); foreach ([$this->platformBaseUrl(), $this->eventsBaseUrl()] as $base) {
$prefix = $platform.'/q/'.$slug; $prefix = $base.'/q/'.$slug;
if (str_starts_with($location, $prefix)) {
$suffix = substr($location, strlen($prefix));
if (str_starts_with($location, $prefix)) { return LadillLink::url($slug).$suffix;
$suffix = substr($location, strlen($prefix)); }
return LadillLink::url($slug).$suffix;
} }
$transfer = rtrim($this->transferBaseUrl(), '/').'/q/'.$slug; $transfer = rtrim($this->transferBaseUrl(), '/').'/q/'.$slug;
+1
View File
@@ -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')), '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'), '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'), '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')), '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')), 'domains_domain' => env('DOMAINS_DOMAIN', 'domains.'.(parse_url((string) env('PLATFORM_URL', 'https://ladill.com'), PHP_URL_HOST) ?: 'ladill.com')),
+28
View File
@@ -95,4 +95,32 @@ class LinkRedirectTest extends TestCase
&& $request->hasHeader('X-Ladill-Internal', '1'); && $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('<html>Event page</html>', 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');
});
}
} }