From a97ee425eb4338df31d1dd418400de9e8d8f583a Mon Sep 17 00:00:00 2001 From: Eduard Lupacescu Date: Thu, 11 Feb 2021 13:04:08 +0200 Subject: [PATCH 1/2] Fixing belongs to filtering. --- src/Filters/SortableFilter.php | 4 +--- src/Sort/SortCollection.php | 10 ++++++++-- src/Traits/InteractWithSearch.php | 6 +++--- tests/Feature/Filters/FilterDefinitionTest.php | 11 ++++------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/Filters/SortableFilter.php b/src/Filters/SortableFilter.php index 9d378a219..deb88f80a 100644 --- a/src/Filters/SortableFilter.php +++ b/src/Filters/SortableFilter.php @@ -53,12 +53,10 @@ public function filter(RestifyRequest $request, $query, $direction) $query->orderBy($this->column, $direction); } - public function usingBelongsTo(BelongsTo $field) + public function usingBelongsTo(BelongsTo $field): self { $this->belongsToField = $field; -// $this->setColumn($field->attam ) //todo - return $this; } diff --git a/src/Sort/SortCollection.php b/src/Sort/SortCollection.php index 8b458876f..8b4b94337 100644 --- a/src/Sort/SortCollection.php +++ b/src/Sort/SortCollection.php @@ -22,6 +22,11 @@ public function __construct($items = []) ? $item : SortableFilter::make(); + if ($queryKey instanceof SortableFilter) { + $unified[] = $queryKey; + continue; + } + $definition->setColumn( $definition->column ?? $queryKey ); @@ -34,7 +39,7 @@ public function __construct($items = []) public function hydrateRepository(Repository $repository): self { - return $this->map(fn (Filter $filter) => $filter->setRepository($repository)); + return $this->each(fn (Filter $filter) => $filter->setRepository($repository)); } public function allowed(RestifyRequest $request, Repository $repository) @@ -53,6 +58,7 @@ public function hydrateDefinition(Repository $repository): SortCollection $definition = Arr::get($repository::getOrderByFields(), $filter->getColumn()); + if (is_callable($definition)) { return $filter->usingClosure($definition); } @@ -73,6 +79,6 @@ public function forEager(RestifyRequest $request): self public function normalize() { - return $this->map(fn (SortableFilter $filter) => $filter->syncDirection()); + return $this->each(fn (SortableFilter $filter) => $filter->syncDirection()); } } diff --git a/src/Traits/InteractWithSearch.php b/src/Traits/InteractWithSearch.php index 62462f7f0..23b6d3890 100644 --- a/src/Traits/InteractWithSearch.php +++ b/src/Traits/InteractWithSearch.php @@ -98,8 +98,8 @@ public static function collectSorts(RestifyRequest $request, Repository $reposit { return SortCollection::make(explode(',', $request->input('sort', ''))) ->normalize() - ->allowed($request, $repository) ->hydrateDefinition($repository) + ->allowed($request, $repository) ->hydrateRepository($repository); } @@ -117,7 +117,7 @@ public static function collectFilters($type): Collection SortableFilter::uriKey() => SortableFilter::class, ])->get($type); - if (! is_subclass_of($base, Filter::class)) { + if (!is_subclass_of($base, Filter::class)) { return collect([]); } @@ -132,7 +132,7 @@ public static function collectFilters($type): Collection } return $type instanceof Filter - ? tap($type, fn ($filter) => $filter->column = $filter->column ?? $column) + ? tap($type, fn($filter) => $filter->column = $filter->column ?? $column) : tap(new $base, function ($filter) use ($column, $type) { $filter->type = $type; $filter->column = $column; diff --git a/tests/Feature/Filters/FilterDefinitionTest.php b/tests/Feature/Filters/FilterDefinitionTest.php index 3d2ee16ec..f6d905919 100644 --- a/tests/Feature/Filters/FilterDefinitionTest.php +++ b/tests/Feature/Filters/FilterDefinitionTest.php @@ -72,14 +72,9 @@ public function test_can_filter_using_belongs_to_field() ]; PostRepository::$sort = [ - 'users.name' => SortableFilter::make()->usingBelongsTo( + 'users.attributes.name' => SortableFilter::make()->setColumn('users.name')->usingBelongsTo( BelongsTo::make('user', 'user', UserRepository::class), ) - /*function (RestifyRequest $request, Builder $builder, $direction) { - $builder->join('users', 'posts.user_id', '=', 'users.id') - ->select('posts.*') - ->orderBy('users.name', $direction); - }*/, ]; factory(Post::class)->create([ @@ -94,7 +89,9 @@ public function test_can_filter_using_belongs_to_field() ]), ]); - $json = $this->getJson(PostRepository::uriKey().'?related=user&sort=-users.name') + $json = $this + ->withoutExceptionHandling() + ->getJson(PostRepository::uriKey() . '?related=user&sort=-users.attributes.name') ->json(); $this->assertSame( From b7ec760cb356160b4ae0ba9533129e8a8157b6e4 Mon Sep 17 00:00:00 2001 From: Lupacescu Eduard Date: Thu, 11 Feb 2021 13:04:31 +0200 Subject: [PATCH 2/2] Apply fixes from StyleCI (#359) --- src/Sort/SortCollection.php | 1 - src/Traits/InteractWithSearch.php | 4 ++-- tests/Feature/Filters/FilterDefinitionTest.php | 6 ++---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/Sort/SortCollection.php b/src/Sort/SortCollection.php index 8b4b94337..7333bc7f2 100644 --- a/src/Sort/SortCollection.php +++ b/src/Sort/SortCollection.php @@ -58,7 +58,6 @@ public function hydrateDefinition(Repository $repository): SortCollection $definition = Arr::get($repository::getOrderByFields(), $filter->getColumn()); - if (is_callable($definition)) { return $filter->usingClosure($definition); } diff --git a/src/Traits/InteractWithSearch.php b/src/Traits/InteractWithSearch.php index 23b6d3890..3221931c8 100644 --- a/src/Traits/InteractWithSearch.php +++ b/src/Traits/InteractWithSearch.php @@ -117,7 +117,7 @@ public static function collectFilters($type): Collection SortableFilter::uriKey() => SortableFilter::class, ])->get($type); - if (!is_subclass_of($base, Filter::class)) { + if (! is_subclass_of($base, Filter::class)) { return collect([]); } @@ -132,7 +132,7 @@ public static function collectFilters($type): Collection } return $type instanceof Filter - ? tap($type, fn($filter) => $filter->column = $filter->column ?? $column) + ? tap($type, fn ($filter) => $filter->column = $filter->column ?? $column) : tap(new $base, function ($filter) use ($column, $type) { $filter->type = $type; $filter->column = $column; diff --git a/tests/Feature/Filters/FilterDefinitionTest.php b/tests/Feature/Filters/FilterDefinitionTest.php index f6d905919..09e62c2df 100644 --- a/tests/Feature/Filters/FilterDefinitionTest.php +++ b/tests/Feature/Filters/FilterDefinitionTest.php @@ -6,13 +6,11 @@ use Binaryk\LaravelRestify\Filters\MatchFilter; use Binaryk\LaravelRestify\Filters\SearchableFilter; use Binaryk\LaravelRestify\Filters\SortableFilter; -use Binaryk\LaravelRestify\Http\Requests\RestifyRequest; use Binaryk\LaravelRestify\Tests\Fixtures\Post\Post; use Binaryk\LaravelRestify\Tests\Fixtures\Post\PostRepository; use Binaryk\LaravelRestify\Tests\Fixtures\User\User; use Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository; use Binaryk\LaravelRestify\Tests\IntegrationTest; -use Illuminate\Database\Eloquent\Builder; class FilterDefinitionTest extends IntegrationTest { @@ -74,7 +72,7 @@ public function test_can_filter_using_belongs_to_field() PostRepository::$sort = [ 'users.attributes.name' => SortableFilter::make()->setColumn('users.name')->usingBelongsTo( BelongsTo::make('user', 'user', UserRepository::class), - ) + ), ]; factory(Post::class)->create([ @@ -91,7 +89,7 @@ public function test_can_filter_using_belongs_to_field() $json = $this ->withoutExceptionHandling() - ->getJson(PostRepository::uriKey() . '?related=user&sort=-users.attributes.name') + ->getJson(PostRepository::uriKey().'?related=user&sort=-users.attributes.name') ->json(); $this->assertSame(