Skip to content

Commit

Permalink
feat: add advanced filters meta payload
Browse files Browse the repository at this point in the history
  • Loading branch information
binaryk committed Jul 1, 2024
1 parent fb36195 commit 066450a
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 6 deletions.
5 changes: 5 additions & 0 deletions src/Filters/AdvancedFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,10 @@ protected function input(?string $key = null, $default = null)
return data_get($this->dataObject->value, $key, $default);
}

protected function rest(?string $key = null, $default = null)
{
return data_get($this->dataObject->rest, $key, $default);
}

abstract public function rules(Request $request): array;
}
5 changes: 5 additions & 0 deletions src/Filters/AdvancedFilterPayloadDataObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,14 @@

class AdvancedFilterPayloadDataObject extends Data
{
public array $rest;

public function __construct(
public string $key,
public mixed $value,
array $rest = []

) {
$this->rest = $rest;
}
}
13 changes: 10 additions & 3 deletions src/Filters/AdvancedFiltersCollection.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,17 @@ public static function collectQueryFilters(RestifyRequest $request, Repository $

$advancedFilter = clone $advancedFilter;

$key = data_get($queryFilter, 'key');
$value = data_get($queryFilter, 'value');
unset($queryFilter['key'], $queryFilter['value']);

return $advancedFilter->resolve($request, $dto = new AdvancedFilterPayloadDataObject(
key: data_get($queryFilter, 'key'),
value: data_get($queryFilter, 'value'),
))->validatePayload($request, $dto);
$key,
$value,
$queryFilter,
))
->withMeta($queryFilter['meta'] ?? [])
->validatePayload($request, $dto);
})
->filter();
}
Expand Down
46 changes: 43 additions & 3 deletions tests/Feature/Filters/AdvancedFilterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use Binaryk\LaravelRestify\Tests\Fixtures\Post\Post;
use Binaryk\LaravelRestify\Tests\Fixtures\Post\PostRepository;
use Binaryk\LaravelRestify\Tests\Fixtures\Post\SelectCategoryFilter;
use Binaryk\LaravelRestify\Tests\Fixtures\Post\ValueFilter;
use Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository;
use Binaryk\LaravelRestify\Tests\IntegrationTestCase;
use Illuminate\Testing\Fluent\AssertableJson;
Expand Down Expand Up @@ -37,7 +38,7 @@ public function test_filters_can_have_definition(): void
$this->getJson(PostRepository::route('filters', query: [
'only' => 'matches,searchables,sortables',
]))->assertJson(
fn (AssertableJson $json) => $json
fn(AssertableJson $json) => $json
->where('data.1.repository.key', 'users')
->where('data.1.repository.label', 'Users')
->where('data.1.repository.display_key', 'id')
Expand Down Expand Up @@ -72,7 +73,7 @@ public function test_value_filter_doesnt_require_value(): void
'filters' => $filters,
]))
->assertJson(
fn (AssertableJson $json) => $json
fn(AssertableJson $json) => $json
->where('data.0.attributes.title', $expectedTitle)
->etc()
)
Expand Down Expand Up @@ -196,10 +197,49 @@ public function test_the_timestamp_filter_is_applied(): void
]))
->assertOk()
->assertJson(
fn (AssertableJson $json) => $json
fn(AssertableJson $json) => $json
->where('data.0.attributes.title', 'Valid post')
->count('data', 1)
->etc()
);
}

public function test_filter_can_send_meta(): void
{
Post::factory()->create([
'title' => 'Valid post',
'description' => 'Zoo bar post',
]);

Post::factory()->create([
'title' => 'Active post',
'description' => 'Foo bar post',
]);

$filters = base64_encode(json_encode([
[
'key' => ValueFilter::uriKey(),
'value' => 'Valid%',
'operator' => 'like',
'column' => 'title',
],
], JSON_THROW_ON_ERROR));

$this->getJson(PostRepository::route(query: [
'filters' => $filters,
]))->assertJsonCount(1, 'data');

$filters = base64_encode(json_encode([
[
'key' => ValueFilter::uriKey(),
'value' => 'Valid%',
'operator' => 'like',
'column' => 'description',
],
], JSON_THROW_ON_ERROR));

$this->getJson(PostRepository::route(query: [
'filters' => $filters,
]))->assertJsonCount(0, 'data');
}
}
1 change: 1 addition & 0 deletions tests/Fixtures/Post/PostRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ public function filters(RestifyRequest $request): array
SelectCategoryFilter::new(),
CreatedAfterDateFilter::new(),
InactiveFilter::new(),
ValueFilter::new(),
];
}

Expand Down
27 changes: 27 additions & 0 deletions tests/Fixtures/Post/ValueFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace Binaryk\LaravelRestify\Tests\Fixtures\Post;

use Binaryk\LaravelRestify\Filters\AdvancedFilter;
use Binaryk\LaravelRestify\Http\Requests\RestifyRequest;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Http\Request;

class ValueFilter extends AdvancedFilter
{
public function filter(RestifyRequest $request, Builder|Relation $query, $value)
{
$operator = $this->rest('operator');
$column = $this->rest('column');

$query->where($column, $operator, $value);
}

public function rules(Request $request): array
{
return [
'is_active' => 'required|boolean',
];
}
}

0 comments on commit 066450a

Please sign in to comment.