From d942ebaa8361945140eb10c4d476ab6faea2f3fc Mon Sep 17 00:00:00 2001 From: isaacclad Date: Thu, 2 Jul 2026 08:14:17 +0000 Subject: [PATCH] Fix event branding images broken by legacy QR redirect. Keep logo and cover asset URLs on Events instead of redirecting them to ladl.link, which does not serve uploaded QR storage files. Co-authored-by: Cursor --- .../RedirectLegacyQrToLadillLink.php | 43 ++++++++++++++++++ tests/Feature/LegacyQrRedirectTest.php | 45 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 tests/Feature/LegacyQrRedirectTest.php diff --git a/app/Http/Middleware/RedirectLegacyQrToLadillLink.php b/app/Http/Middleware/RedirectLegacyQrToLadillLink.php index 3e3d799..aaa8203 100644 --- a/app/Http/Middleware/RedirectLegacyQrToLadillLink.php +++ b/app/Http/Middleware/RedirectLegacyQrToLadillLink.php @@ -9,6 +9,23 @@ use Symfony\Component\HttpFoundation\Response; class RedirectLegacyQrToLadillLink { + /** @var list */ + private const STORAGE_ASSET_SUFFIXES = [ + 'event-logo', + 'event-cover', + 'itinerary-cover', + 'business-logo', + 'business-cover', + 'menu-logo', + 'menu-cover', + 'church-logo', + 'church-cover', + 'book-cover', + 'vcard-avatar', + 'app-icon', + 'file', + ]; + public function handle(Request $request, Closure $next): Response { if (! preg_match('#^q/[a-z0-9]#i', ltrim($request->path(), '/'))) { @@ -19,6 +36,32 @@ class RedirectLegacyQrToLadillLink return $next($request); } + if ($this->servesStoredAsset($request)) { + return $next($request); + } + return LadillLink::legacyRedirect($request); } + + private function servesStoredAsset(Request $request): bool + { + $shortCode = $request->route('shortCode'); + if (! is_string($shortCode) || $shortCode === '') { + return false; + } + + $path = ltrim($request->path(), '/'); + $prefix = 'q/'.$shortCode.'/'; + if (! str_starts_with($path, $prefix)) { + return false; + } + + $suffix = substr($path, strlen($prefix)); + + if (in_array($suffix, self::STORAGE_ASSET_SUFFIXES, true)) { + return true; + } + + return (bool) preg_match('#^(image/\d+|item-image/\d+/\d+)$#', $suffix); + } } diff --git a/tests/Feature/LegacyQrRedirectTest.php b/tests/Feature/LegacyQrRedirectTest.php new file mode 100644 index 0000000..07b3903 --- /dev/null +++ b/tests/Feature/LegacyQrRedirectTest.php @@ -0,0 +1,45 @@ +setRouteResolver(function () use ($request) { + return new class($request) + { + public function __construct(private Request $request) {} + + public function parameter(string $name): ?string + { + return $name === 'shortCode' ? 'demo-event' : null; + } + }; + }); + + $response = $middleware->handle($request, fn () => response('ok')); + + $this->assertSame(200, $response->getStatusCode()); + $this->assertSame('ok', $response->getContent()); + } + } + + public function test_public_event_pages_still_redirect_to_ladill_link(): void + { + config(['link.public_domain' => 'ladl.link']); + + $response = $this->get('/q/demo-event'); + + $response->assertRedirect(LadillLink::url('demo-event')); + } +}