From a1c746f0ee364ef0c482ff9e9f02f384940a3915 Mon Sep 17 00:00:00 2001 From: antoine Date: Thu, 22 Jan 2026 12:21:07 +0100 Subject: [PATCH] Redirect to associated route when invalid global filter --- src/Http/Middleware/HandleGlobalFilters.php | 22 +++++++++++++++------ tests/Http/GlobalFilterRoutesTest.php | 14 ++++++++++--- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/Http/Middleware/HandleGlobalFilters.php b/src/Http/Middleware/HandleGlobalFilters.php index 59a666753..f87d714a8 100644 --- a/src/Http/Middleware/HandleGlobalFilters.php +++ b/src/Http/Middleware/HandleGlobalFilters.php @@ -6,6 +6,7 @@ use Code16\Sharp\Filters\GlobalFilters\GlobalFilters; use Code16\Sharp\Filters\GlobalRequiredFilter; use Illuminate\Http\Request; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\URL; class HandleGlobalFilters @@ -20,9 +21,7 @@ public function handle(Request $request, Closure $next) if ($this->globalFiltersHandler->isEnabled()) { $globalFilters = $this->globalFiltersHandler->getFilters(); if (count($globalFilterValues) !== count($globalFilters)) { - return redirect()->route('code16.sharp.home', [ - 'globalFilter' => sharp()->context()->globalFilterUrlSegmentValue(), - ]); + return $this->redirectTo($request); } collect($globalFilters) @@ -34,9 +33,7 @@ public function handle(Request $request, Closure $next) && ! $request->wantsJson() && $request->isMethod('GET') ) { - return redirect()->route('code16.sharp.home', [ - 'globalFilter' => sharp()->context()->globalFilterUrlSegmentValue(), - ]); + return $this->redirectTo($request); } } } @@ -45,4 +42,17 @@ public function handle(Request $request, Closure $next) return $next($request); } + + protected function redirectTo(Request $request) + { + return $request->route()?->hasParameter('globalFilter') + ? redirect()->route($request->route()->getName(), [ + 'globalFilter' => sharp()->context()->globalFilterUrlSegmentValue(), + ...Arr::except($request->route()->parameters(), 'globalFilter'), + ...$request->query(), + ]) + : redirect()->route('code16.sharp.home', [ + 'globalFilter' => sharp()->context()->globalFilterUrlSegmentValue(), + ]); + } } diff --git a/tests/Http/GlobalFilterRoutesTest.php b/tests/Http/GlobalFilterRoutesTest.php index c08ca1228..d8604c933 100644 --- a/tests/Http/GlobalFilterRoutesTest.php +++ b/tests/Http/GlobalFilterRoutesTest.php @@ -86,15 +86,23 @@ public function execute(array $data = []): array {} expect(sharp()->context()->globalFilterValue('test'))->toEqual('one'); }); -it('redirects to the homepage if an invalid globalFilter is set in the URL', function () { +it('redirects to the corresponding route with valid globalFilter if an invalid globalFilter is set in the URL', function () { fakeGlobalFilter(); - $this->get('/sharp/five/s-list/person/s-show/person/1') - ->assertRedirect(route('code16.sharp.home', ['globalFilter' => 'two'])); + $this->get('/sharp/five/s-list/person/s-show/person/1?highlight=1') + ->assertRedirect('/sharp/two/s-list/person/s-show/person/1?highlight=1'); expect(sharp()->context()->globalFilterValue('test'))->toEqual('two'); }); +it('redirects to the corresponding route with valid globalFilter if a different number of filters is sent', function () { + fakeGlobalFilter('test1'); + fakeGlobalFilter('test2'); + + $this->get('/sharp/two/s-list/person/s-show/person/1?highlight=1') + ->assertRedirect('/sharp/two~two/s-list/person/s-show/person/1?highlight=1'); +}); + it('redirects to route with correct globalFilters when missing and multiple global filters are defined', function () { fakeGlobalFilter('test1'); fakeGlobalFilter('test2');