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')); + } +}