Fall back to Events when platform QR proxy returns 404.
Deploy Ladill Link / deploy (push) Successful in 48s
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:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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')),
|
||||||
|
|
||||||
|
|||||||
@@ -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');
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user