Skip to content

Commit 066450a

Browse files
committed
feat: add advanced filters meta payload
1 parent fb36195 commit 066450a

File tree

6 files changed

+91
-6
lines changed

6 files changed

+91
-6
lines changed

src/Filters/AdvancedFilter.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,10 @@ protected function input(?string $key = null, $default = null)
3737
return data_get($this->dataObject->value, $key, $default);
3838
}
3939

40+
protected function rest(?string $key = null, $default = null)
41+
{
42+
return data_get($this->dataObject->rest, $key, $default);
43+
}
44+
4045
abstract public function rules(Request $request): array;
4146
}

src/Filters/AdvancedFilterPayloadDataObject.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@
66

77
class AdvancedFilterPayloadDataObject extends Data
88
{
9+
public array $rest;
10+
911
public function __construct(
1012
public string $key,
1113
public mixed $value,
14+
array $rest = []
15+
1216
) {
17+
$this->rest = $rest;
1318
}
1419
}

src/Filters/AdvancedFiltersCollection.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,17 @@ public static function collectQueryFilters(RestifyRequest $request, Repository $
4747

4848
$advancedFilter = clone $advancedFilter;
4949

50+
$key = data_get($queryFilter, 'key');
51+
$value = data_get($queryFilter, 'value');
52+
unset($queryFilter['key'], $queryFilter['value']);
53+
5054
return $advancedFilter->resolve($request, $dto = new AdvancedFilterPayloadDataObject(
51-
key: data_get($queryFilter, 'key'),
52-
value: data_get($queryFilter, 'value'),
53-
))->validatePayload($request, $dto);
55+
$key,
56+
$value,
57+
$queryFilter,
58+
))
59+
->withMeta($queryFilter['meta'] ?? [])
60+
->validatePayload($request, $dto);
5461
})
5562
->filter();
5663
}

tests/Feature/Filters/AdvancedFilterTest.php

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Binaryk\LaravelRestify\Tests\Fixtures\Post\Post;
1111
use Binaryk\LaravelRestify\Tests\Fixtures\Post\PostRepository;
1212
use Binaryk\LaravelRestify\Tests\Fixtures\Post\SelectCategoryFilter;
13+
use Binaryk\LaravelRestify\Tests\Fixtures\Post\ValueFilter;
1314
use Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository;
1415
use Binaryk\LaravelRestify\Tests\IntegrationTestCase;
1516
use Illuminate\Testing\Fluent\AssertableJson;
@@ -37,7 +38,7 @@ public function test_filters_can_have_definition(): void
3738
$this->getJson(PostRepository::route('filters', query: [
3839
'only' => 'matches,searchables,sortables',
3940
]))->assertJson(
40-
fn (AssertableJson $json) => $json
41+
fn(AssertableJson $json) => $json
4142
->where('data.1.repository.key', 'users')
4243
->where('data.1.repository.label', 'Users')
4344
->where('data.1.repository.display_key', 'id')
@@ -72,7 +73,7 @@ public function test_value_filter_doesnt_require_value(): void
7273
'filters' => $filters,
7374
]))
7475
->assertJson(
75-
fn (AssertableJson $json) => $json
76+
fn(AssertableJson $json) => $json
7677
->where('data.0.attributes.title', $expectedTitle)
7778
->etc()
7879
)
@@ -196,10 +197,49 @@ public function test_the_timestamp_filter_is_applied(): void
196197
]))
197198
->assertOk()
198199
->assertJson(
199-
fn (AssertableJson $json) => $json
200+
fn(AssertableJson $json) => $json
200201
->where('data.0.attributes.title', 'Valid post')
201202
->count('data', 1)
202203
->etc()
203204
);
204205
}
206+
207+
public function test_filter_can_send_meta(): void
208+
{
209+
Post::factory()->create([
210+
'title' => 'Valid post',
211+
'description' => 'Zoo bar post',
212+
]);
213+
214+
Post::factory()->create([
215+
'title' => 'Active post',
216+
'description' => 'Foo bar post',
217+
]);
218+
219+
$filters = base64_encode(json_encode([
220+
[
221+
'key' => ValueFilter::uriKey(),
222+
'value' => 'Valid%',
223+
'operator' => 'like',
224+
'column' => 'title',
225+
],
226+
], JSON_THROW_ON_ERROR));
227+
228+
$this->getJson(PostRepository::route(query: [
229+
'filters' => $filters,
230+
]))->assertJsonCount(1, 'data');
231+
232+
$filters = base64_encode(json_encode([
233+
[
234+
'key' => ValueFilter::uriKey(),
235+
'value' => 'Valid%',
236+
'operator' => 'like',
237+
'column' => 'description',
238+
],
239+
], JSON_THROW_ON_ERROR));
240+
241+
$this->getJson(PostRepository::route(query: [
242+
'filters' => $filters,
243+
]))->assertJsonCount(0, 'data');
244+
}
205245
}

tests/Fixtures/Post/PostRepository.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public function filters(RestifyRequest $request): array
9595
SelectCategoryFilter::new(),
9696
CreatedAfterDateFilter::new(),
9797
InactiveFilter::new(),
98+
ValueFilter::new(),
9899
];
99100
}
100101

tests/Fixtures/Post/ValueFilter.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Binaryk\LaravelRestify\Tests\Fixtures\Post;
4+
5+
use Binaryk\LaravelRestify\Filters\AdvancedFilter;
6+
use Binaryk\LaravelRestify\Http\Requests\RestifyRequest;
7+
use Illuminate\Database\Eloquent\Builder;
8+
use Illuminate\Database\Eloquent\Relations\Relation;
9+
use Illuminate\Http\Request;
10+
11+
class ValueFilter extends AdvancedFilter
12+
{
13+
public function filter(RestifyRequest $request, Builder|Relation $query, $value)
14+
{
15+
$operator = $this->rest('operator');
16+
$column = $this->rest('column');
17+
18+
$query->where($column, $operator, $value);
19+
}
20+
21+
public function rules(Request $request): array
22+
{
23+
return [
24+
'is_active' => 'required|boolean',
25+
];
26+
}
27+
}

0 commit comments

Comments
 (0)