diff --git a/docs-v2/content/en/search/advanced-filters.md b/docs-v2/content/en/search/advanced-filters.md index b80f061c..0e9279f7 100644 --- a/docs-v2/content/en/search/advanced-filters.md +++ b/docs-v2/content/en/search/advanced-filters.md @@ -364,8 +364,18 @@ The response will look like this: "key": "created-after-date-filter", "type": "timestamp", "options": [] + }, + { + "key": "email", + "type": "value", + "description": "Email", + "label": "Email", + "meta": { + "operator": "like" + } } ] +} ``` Along with custom filters, you can also include in the response the primary filters (as matches), by using `?include` query param: @@ -374,3 +384,47 @@ Along with custom filters, you can also include in the response the primary filt /api/restify/posts/filters?include=matches,searchables,sortables ``` +## Handling Additional Payload Data in Advanced Filters + +In some scenarios, you might want to send additional data beyond the standard key and value in your filter payload. For instance, you may need to specify an operator or a column to apply more complex filtering logic. Laravel Restify Advanced Filters provide a way to handle these additional payload fields using the `$this->rest()` method. + +**Example Payload** + +Consider the following payload: +```json +const filters = btoa(JSON.stringify([ + { + 'key': ValueFilter::uriKey(), + 'value': 'Valid%', + 'operator' => 'like', + 'column' => 'description', + } +])); + +const response = await axios.get(`api/restify/posts?filters=${filters}`); +``` + +In this payload, besides the standard key and value, we are also sending operator and column. The operator specifies the type of SQL operation, and the column specifies the database column to filter. + +Using `$this->rest()` to Access Additional Data + +To handle these additional fields in your filter class, you need to ensure they are accessible via the `$this->rest()` method. Here is how you can achieve that: + +```php +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 []; + } +} +``` + diff --git a/src/Actions/DestructiveAction.php b/src/Actions/DestructiveAction.php index 09b440ac..bea3d9e2 100644 --- a/src/Actions/DestructiveAction.php +++ b/src/Actions/DestructiveAction.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Actions; -abstract class DestructiveAction extends Action -{ -} +abstract class DestructiveAction extends Action {} diff --git a/src/Bootstrap/Boot.php b/src/Bootstrap/Boot.php index 2e37f419..6b7cfd9d 100644 --- a/src/Bootstrap/Boot.php +++ b/src/Bootstrap/Boot.php @@ -10,8 +10,7 @@ class Boot public function __construct( private Request $request, private RoutesBoot $routesBoot, - ) { - } + ) {} public function boot(): void { diff --git a/src/Bootstrap/BootRepository.php b/src/Bootstrap/BootRepository.php index e91a59d7..bd4de815 100644 --- a/src/Bootstrap/BootRepository.php +++ b/src/Bootstrap/BootRepository.php @@ -9,8 +9,7 @@ class BootRepository /** * @var Repository */ public function __construct( private string $repository - ) { - } + ) {} public function boot(): void { diff --git a/src/Events/AdvancedFiltersApplied.php b/src/Events/AdvancedFiltersApplied.php index 9063c290..bb1fd041 100644 --- a/src/Events/AdvancedFiltersApplied.php +++ b/src/Events/AdvancedFiltersApplied.php @@ -11,6 +11,5 @@ public function __construct( public Repository $repository, public AdvancedFiltersCollection $advancedFiltersCollection, public ?string $rawFilters = null, - ) { - } + ) {} } diff --git a/src/Exceptions/CredentialsDoesntMatch.php b/src/Exceptions/CredentialsDoesntMatch.php index c0c44b21..a726287f 100644 --- a/src/Exceptions/CredentialsDoesntMatch.php +++ b/src/Exceptions/CredentialsDoesntMatch.php @@ -7,6 +7,4 @@ /** * @author Eduard Lupacescu */ -class CredentialsDoesntMatch extends Exception -{ -} +class CredentialsDoesntMatch extends Exception {} diff --git a/src/Exceptions/Eloquent/EntityNotFoundException.php b/src/Exceptions/Eloquent/EntityNotFoundException.php index e73e3020..3f2d6583 100644 --- a/src/Exceptions/Eloquent/EntityNotFoundException.php +++ b/src/Exceptions/Eloquent/EntityNotFoundException.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Exceptions\Eloquent; -class EntityNotFoundException extends \Exception -{ -} +class EntityNotFoundException extends \Exception {} diff --git a/src/Exceptions/PasswordResetException.php b/src/Exceptions/PasswordResetException.php index 337f9d67..40a5ac30 100644 --- a/src/Exceptions/PasswordResetException.php +++ b/src/Exceptions/PasswordResetException.php @@ -7,6 +7,4 @@ /** * @author Eduard Lupacescu */ -class PasswordResetException extends Exception -{ -} +class PasswordResetException extends Exception {} diff --git a/src/Exceptions/PasswordResetInvalidTokenException.php b/src/Exceptions/PasswordResetInvalidTokenException.php index a5aee4a6..ab5be9f8 100644 --- a/src/Exceptions/PasswordResetInvalidTokenException.php +++ b/src/Exceptions/PasswordResetInvalidTokenException.php @@ -7,6 +7,4 @@ /** * @author Eduard Lupacescu */ -class PasswordResetInvalidTokenException extends Exception -{ -} +class PasswordResetInvalidTokenException extends Exception {} diff --git a/src/Exceptions/UnauthenticateException.php b/src/Exceptions/UnauthenticateException.php index 343051fb..144a0a40 100644 --- a/src/Exceptions/UnauthenticateException.php +++ b/src/Exceptions/UnauthenticateException.php @@ -7,6 +7,4 @@ /** * @author Eduard Lupacescu */ -class UnauthenticateException extends Exception -{ -} +class UnauthenticateException extends Exception {} diff --git a/src/Exceptions/UnverifiedUser.php b/src/Exceptions/UnverifiedUser.php index 47a73fa2..25414505 100644 --- a/src/Exceptions/UnverifiedUser.php +++ b/src/Exceptions/UnverifiedUser.php @@ -7,6 +7,4 @@ /** * @author Eduard Lupacescu */ -class UnverifiedUser extends Exception -{ -} +class UnverifiedUser extends Exception {} diff --git a/src/Fields/BaseField.php b/src/Fields/BaseField.php index 366ce3db..8ca22291 100644 --- a/src/Fields/BaseField.php +++ b/src/Fields/BaseField.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Fields; -abstract class BaseField -{ -} +abstract class BaseField {} diff --git a/src/Fields/HasField.php b/src/Fields/HasField.php index f943b4e0..fbee7f41 100644 --- a/src/Fields/HasField.php +++ b/src/Fields/HasField.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Fields; -class HasField extends EagerField -{ -} +class HasField extends EagerField {} diff --git a/src/Fields/MorphMany.php b/src/Fields/MorphMany.php index 4aa3b5b9..2f301fa4 100644 --- a/src/Fields/MorphMany.php +++ b/src/Fields/MorphMany.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Fields; -class MorphMany extends HasMany -{ -} +class MorphMany extends HasMany {} diff --git a/src/Fields/MorphOne.php b/src/Fields/MorphOne.php index 7ebef946..18cbeec6 100644 --- a/src/Fields/MorphOne.php +++ b/src/Fields/MorphOne.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Fields; -class MorphOne extends BelongsTo -{ -} +class MorphOne extends BelongsTo {} diff --git a/src/Fields/MorphToMany.php b/src/Fields/MorphToMany.php index 94cd7bb9..bfd48de2 100644 --- a/src/Fields/MorphToMany.php +++ b/src/Fields/MorphToMany.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Fields; -class MorphToMany extends BelongsToMany -{ -} +class MorphToMany extends BelongsToMany {} diff --git a/src/Filters/AdvancedFilter.php b/src/Filters/AdvancedFilter.php index e6339750..ef97d173 100644 --- a/src/Filters/AdvancedFilter.php +++ b/src/Filters/AdvancedFilter.php @@ -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; } diff --git a/src/Filters/AdvancedFilterPayloadDataObject.php b/src/Filters/AdvancedFilterPayloadDataObject.php index 7d87821e..640cd61c 100644 --- a/src/Filters/AdvancedFilterPayloadDataObject.php +++ b/src/Filters/AdvancedFilterPayloadDataObject.php @@ -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; } } diff --git a/src/Filters/AdvancedFiltersCollection.php b/src/Filters/AdvancedFiltersCollection.php index 597f62e3..bd276142 100644 --- a/src/Filters/AdvancedFiltersCollection.php +++ b/src/Filters/AdvancedFiltersCollection.php @@ -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(); } diff --git a/src/Filters/Filter.php b/src/Filters/Filter.php index 94391815..8cf9d34f 100644 --- a/src/Filters/Filter.php +++ b/src/Filters/Filter.php @@ -259,9 +259,7 @@ public function dd(): self return $this; } - protected function booted() - { - } + protected function booted() {} protected function getType(): string { diff --git a/src/Filters/FilterPayload.php b/src/Filters/FilterPayload.php index f029d489..ed43c372 100644 --- a/src/Filters/FilterPayload.php +++ b/src/Filters/FilterPayload.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Filters; -interface FilterPayload -{ -} +interface FilterPayload {} diff --git a/src/Filters/FiltersCollection.php b/src/Filters/FiltersCollection.php index c4602ff3..5b84fad5 100644 --- a/src/Filters/FiltersCollection.php +++ b/src/Filters/FiltersCollection.php @@ -10,6 +10,4 @@ * * @extends \Illuminate\Support\Collection */ -class FiltersCollection extends Collection -{ -} +class FiltersCollection extends Collection {} diff --git a/src/Filters/PaginationDataObject.php b/src/Filters/PaginationDataObject.php index a23f2e23..1fc9d078 100644 --- a/src/Filters/PaginationDataObject.php +++ b/src/Filters/PaginationDataObject.php @@ -9,6 +9,5 @@ class PaginationDataObject extends Data public function __construct( public int|string|null $perPage, public int|string|null $page, - ) { - } + ) {} } diff --git a/src/Filters/RelatedQueryCollection.php b/src/Filters/RelatedQueryCollection.php index 0c9dc4f0..c3cc1104 100644 --- a/src/Filters/RelatedQueryCollection.php +++ b/src/Filters/RelatedQueryCollection.php @@ -10,6 +10,4 @@ * * @extends \Illuminate\Support\Collection */ -class RelatedQueryCollection extends Collection -{ -} +class RelatedQueryCollection extends Collection {} diff --git a/src/Http/Controllers/RepositoryController.php b/src/Http/Controllers/RepositoryController.php index 78d07c11..c2ef1990 100644 --- a/src/Http/Controllers/RepositoryController.php +++ b/src/Http/Controllers/RepositoryController.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Controllers; -class RepositoryController extends RestController -{ -} +class RepositoryController extends RestController {} diff --git a/src/Http/Requests/GlobalSearchRequest.php b/src/Http/Requests/GlobalSearchRequest.php index d35e9769..8ca3c80a 100644 --- a/src/Http/Requests/GlobalSearchRequest.php +++ b/src/Http/Requests/GlobalSearchRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class GlobalSearchRequest extends RestifyRequest -{ -} +class GlobalSearchRequest extends RestifyRequest {} diff --git a/src/Http/Requests/IndexRepositoryActionRequest.php b/src/Http/Requests/IndexRepositoryActionRequest.php index 3dee6dd2..f5da23b0 100644 --- a/src/Http/Requests/IndexRepositoryActionRequest.php +++ b/src/Http/Requests/IndexRepositoryActionRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class IndexRepositoryActionRequest extends ActionRequest -{ -} +class IndexRepositoryActionRequest extends ActionRequest {} diff --git a/src/Http/Requests/ProfileRequestRequest.php b/src/Http/Requests/ProfileRequestRequest.php index 369563cf..c1c8ca82 100644 --- a/src/Http/Requests/ProfileRequestRequest.php +++ b/src/Http/Requests/ProfileRequestRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class ProfileRequestRequest extends RepositoryShowRequest -{ -} +class ProfileRequestRequest extends RepositoryShowRequest {} diff --git a/src/Http/Requests/RepositoryActionRequest.php b/src/Http/Requests/RepositoryActionRequest.php index b8501175..5dd4f078 100644 --- a/src/Http/Requests/RepositoryActionRequest.php +++ b/src/Http/Requests/RepositoryActionRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryActionRequest extends ActionRequest -{ -} +class RepositoryActionRequest extends ActionRequest {} diff --git a/src/Http/Requests/RepositoryDestroyBulkRequest.php b/src/Http/Requests/RepositoryDestroyBulkRequest.php index 58950dfe..930517cf 100644 --- a/src/Http/Requests/RepositoryDestroyBulkRequest.php +++ b/src/Http/Requests/RepositoryDestroyBulkRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryDestroyBulkRequest extends RestifyRequest -{ -} +class RepositoryDestroyBulkRequest extends RestifyRequest {} diff --git a/src/Http/Requests/RepositoryDestroyRequest.php b/src/Http/Requests/RepositoryDestroyRequest.php index 266fbc41..18300e33 100644 --- a/src/Http/Requests/RepositoryDestroyRequest.php +++ b/src/Http/Requests/RepositoryDestroyRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryDestroyRequest extends RestifyRequest -{ -} +class RepositoryDestroyRequest extends RestifyRequest {} diff --git a/src/Http/Requests/RepositoryFiltersRequest.php b/src/Http/Requests/RepositoryFiltersRequest.php index 9e07896f..a2a438f5 100644 --- a/src/Http/Requests/RepositoryFiltersRequest.php +++ b/src/Http/Requests/RepositoryFiltersRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryFiltersRequest extends RestifyRequest -{ -} +class RepositoryFiltersRequest extends RestifyRequest {} diff --git a/src/Http/Requests/RepositoryGetterRequest.php b/src/Http/Requests/RepositoryGetterRequest.php index a553d487..96a81fa0 100644 --- a/src/Http/Requests/RepositoryGetterRequest.php +++ b/src/Http/Requests/RepositoryGetterRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryGetterRequest extends GetterRequest -{ -} +class RepositoryGetterRequest extends GetterRequest {} diff --git a/src/Http/Requests/RepositoryIndexRequest.php b/src/Http/Requests/RepositoryIndexRequest.php index bc610741..b898c232 100644 --- a/src/Http/Requests/RepositoryIndexRequest.php +++ b/src/Http/Requests/RepositoryIndexRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryIndexRequest extends RestifyRequest -{ -} +class RepositoryIndexRequest extends RestifyRequest {} diff --git a/src/Http/Requests/RepositoryPatchRequest.php b/src/Http/Requests/RepositoryPatchRequest.php index 813daf33..e99dc00b 100644 --- a/src/Http/Requests/RepositoryPatchRequest.php +++ b/src/Http/Requests/RepositoryPatchRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryPatchRequest extends RepositoryUpdateRequest -{ -} +class RepositoryPatchRequest extends RepositoryUpdateRequest {} diff --git a/src/Http/Requests/RepositoryShowRequest.php b/src/Http/Requests/RepositoryShowRequest.php index c5285fda..6b3b0bfa 100644 --- a/src/Http/Requests/RepositoryShowRequest.php +++ b/src/Http/Requests/RepositoryShowRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryShowRequest extends RestifyRequest -{ -} +class RepositoryShowRequest extends RestifyRequest {} diff --git a/src/Http/Requests/RepositoryStoreRequest.php b/src/Http/Requests/RepositoryStoreRequest.php index fd2d6ef0..6645c03f 100644 --- a/src/Http/Requests/RepositoryStoreRequest.php +++ b/src/Http/Requests/RepositoryStoreRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryStoreRequest extends RestifyRequest -{ -} +class RepositoryStoreRequest extends RestifyRequest {} diff --git a/src/Http/Requests/RepositoryUpdateRequest.php b/src/Http/Requests/RepositoryUpdateRequest.php index af97906d..f53eb7fc 100644 --- a/src/Http/Requests/RepositoryUpdateRequest.php +++ b/src/Http/Requests/RepositoryUpdateRequest.php @@ -2,6 +2,4 @@ namespace Binaryk\LaravelRestify\Http\Requests; -class RepositoryUpdateRequest extends RestifyRequest -{ -} +class RepositoryUpdateRequest extends RestifyRequest {} diff --git a/src/Models/LaravelRestifyModel.php b/src/Models/LaravelRestifyModel.php index e63fbf4c..6925a47a 100644 --- a/src/Models/LaravelRestifyModel.php +++ b/src/Models/LaravelRestifyModel.php @@ -9,6 +9,4 @@ * * @author Eduard Lupacescu */ -abstract class LaravelRestifyModel extends EloquentModel -{ -} +abstract class LaravelRestifyModel extends EloquentModel {} diff --git a/src/Notifications/ForgotPasswordNotification.php b/src/Notifications/ForgotPasswordNotification.php index baaf18f9..7ffc79f4 100644 --- a/src/Notifications/ForgotPasswordNotification.php +++ b/src/Notifications/ForgotPasswordNotification.php @@ -13,8 +13,7 @@ class ForgotPasswordNotification extends Notification implements ShouldQueue public function __construct( public string $url, - ) { - } + ) {} public function via($notifiable): array { diff --git a/src/Repositories/Mergeable.php b/src/Repositories/Mergeable.php index dcdd6043..4d64cd8a 100644 --- a/src/Repositories/Mergeable.php +++ b/src/Repositories/Mergeable.php @@ -6,6 +6,4 @@ * Interface Mergeable * Determine whatever should or not to merge the model attributes. */ -interface Mergeable -{ -} +interface Mergeable {} diff --git a/src/Repositories/NullModel.php b/src/Repositories/NullModel.php index 0f5ffc4d..5251ffb1 100644 --- a/src/Repositories/NullModel.php +++ b/src/Repositories/NullModel.php @@ -4,6 +4,4 @@ use Illuminate\Database\Eloquent\Model; -class NullModel extends Model -{ -} +class NullModel extends Model {} diff --git a/src/Repositories/RepositoryInstance.php b/src/Repositories/RepositoryInstance.php index 2a3c2344..5dfe1ea5 100644 --- a/src/Repositories/RepositoryInstance.php +++ b/src/Repositories/RepositoryInstance.php @@ -6,8 +6,7 @@ class RepositoryInstance { public function __construct( public Repository $repository, - ) { - } + ) {} public function current(): Repository { diff --git a/src/Repositories/ValidatingTrait.php b/src/Repositories/ValidatingTrait.php index 45c990ee..5f7c9d46 100644 --- a/src/Repositories/ValidatingTrait.php +++ b/src/Repositories/ValidatingTrait.php @@ -191,21 +191,13 @@ protected static function afterValidation(RestifyRequest $request, $validator) // } - protected static function afterStoringValidation(RestifyRequest $request, $validator) - { - } + protected static function afterStoringValidation(RestifyRequest $request, $validator) {} - protected static function afterStoringBulkValidation(RestifyRequest $request, $validator) - { - } + protected static function afterStoringBulkValidation(RestifyRequest $request, $validator) {} - protected static function afterUpdatingValidation(RestifyRequest $request, $validator) - { - } + protected static function afterUpdatingValidation(RestifyRequest $request, $validator) {} - protected static function afterUpdatingBulkValidation(RestifyRequest $request, $validator) - { - } + protected static function afterUpdatingBulkValidation(RestifyRequest $request, $validator) {} /** * @return array diff --git a/src/Traits/PerformsRequestValidation.php b/src/Traits/PerformsRequestValidation.php index ab447041..8e6ff435 100644 --- a/src/Traits/PerformsRequestValidation.php +++ b/src/Traits/PerformsRequestValidation.php @@ -5,6 +5,4 @@ /** * @author Eduard Lupacescu */ -trait PerformsRequestValidation -{ -} +trait PerformsRequestValidation {} diff --git a/tests/Assertables/AssertableModel.php b/tests/Assertables/AssertableModel.php index 6b20b2d4..943832bd 100644 --- a/tests/Assertables/AssertableModel.php +++ b/tests/Assertables/AssertableModel.php @@ -27,8 +27,7 @@ abstract class AssertableModel public function __construct( protected Model $model, - ) { - } + ) {} public function first(?Closure $callback = null): Model { diff --git a/tests/Controllers/RepositoryFilterControllerTest.php b/tests/Controllers/RepositoryFilterControllerTest.php index 68e26370..a0f63cd7 100644 --- a/tests/Controllers/RepositoryFilterControllerTest.php +++ b/tests/Controllers/RepositoryFilterControllerTest.php @@ -36,15 +36,15 @@ public function test_available_filters_contains_matches_sortables_searches(): vo ->assertJson( fn (AssertableJson $json) => $json ->where('data.0.rules.is_active', 'bool') - ->where('data.4.type', 'text') - ->where('data.4.column', 'title') - ->where('data.5.type', 'value') + ->where('data.5.type', 'text') ->where('data.5.column', 'title') ->where('data.6.type', 'value') - ->where('data.6.column', 'id') + ->where('data.6.column', 'title') + ->where('data.7.type', 'value') + ->where('data.7.column', 'id') ->etc() ) - ->assertJsonCount(8, 'data'); + ->assertJsonCount(9, 'data'); } public function test_available_filters_returns_only_matches_sortables_searches(): void diff --git a/tests/Feature/Filters/AdvancedFilterTest.php b/tests/Feature/Filters/AdvancedFilterTest.php index e9cfdb13..bb46986b 100644 --- a/tests/Feature/Filters/AdvancedFilterTest.php +++ b/tests/Feature/Filters/AdvancedFilterTest.php @@ -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; @@ -202,4 +203,43 @@ public function test_the_timestamp_filter_is_applied(): void ->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'); + } } diff --git a/tests/Fields/FieldTest.php b/tests/Fields/FieldTest.php index d92dece7..f0e4545c 100644 --- a/tests/Fields/FieldTest.php +++ b/tests/Fields/FieldTest.php @@ -183,8 +183,7 @@ public function test_field_fill_from_request() $request = new RepositoryStoreRequest([], []); $request->setRouteResolver(function () use ($request) { - return tap(new Route('POST', '/{repository}', function () { - }), function (Route $route) use ($request) { + return tap(new Route('POST', '/{repository}', function () {}), function (Route $route) use ($request) { $route->bind($request); $route->setParameter('repository', PostRepository::uriKey()); }); @@ -212,8 +211,7 @@ public function test_append_overwrite_the_request_value() $request = new RepositoryStoreRequest([], []); $request->setRouteResolver(function () use ($request) { - return tap(new Route('POST', '/{repository}', function () { - }), function (Route $route) use ($request) { + return tap(new Route('POST', '/{repository}', function () {}), function (Route $route) use ($request) { $route->bind($request); $route->setParameter('repository', PostRepository::uriKey()); }); @@ -241,8 +239,7 @@ public function test_field_after_store_called(): void $request = new RepositoryStoreRequest([], []); $request->setRouteResolver(function () use ($request) { - return tap(new Route('POST', '/{repository}', function () { - }), function (Route $route) use ($request) { + return tap(new Route('POST', '/{repository}', function () {}), function (Route $route) use ($request) { $route->bind($request); $route->setParameter('repository', PostRepository::uriKey()); }); @@ -284,8 +281,7 @@ public function test_field_after_update_called() $request = new RepositoryUpdateRequest([], []); $request->setRouteResolver(function () use ($request, $model) { - return tap(new Route('PUT', "/{repository}/{$model->id}", function () { - }), function (Route $route) use ($request) { + return tap(new Route('PUT', "/{repository}/{$model->id}", function () {}), function (Route $route) use ($request) { $route->bind($request); $route->setParameter('repository', PostRepository::uriKey()); }); @@ -324,8 +320,7 @@ public function test_fill_field_using_label_key() $request = new RepositoryStoreRequest([], []); $request->setRouteResolver(function () use ($request) { - return tap(new Route('POST', '/{repository}', function () { - }), function (Route $route) use ($request) { + return tap(new Route('POST', '/{repository}', function () {}), function (Route $route) use ($request) { $route->bind($request); $route->setParameter('repository', PostRepository::uriKey()); }); diff --git a/tests/Fixtures/App/User.php b/tests/Fixtures/App/User.php index c4b36a92..7a6900e5 100644 --- a/tests/Fixtures/App/User.php +++ b/tests/Fixtures/App/User.php @@ -2,6 +2,4 @@ namespace App; -class User extends \Binaryk\LaravelRestify\Tests\Fixtures\User\User -{ -} +class User extends \Binaryk\LaravelRestify\Tests\Fixtures\User\User {} diff --git a/tests/Fixtures/CustomNamespace/PackageA/Restify/UserRepository.php b/tests/Fixtures/CustomNamespace/PackageA/Restify/UserRepository.php index f62079fb..9760bf5f 100644 --- a/tests/Fixtures/CustomNamespace/PackageA/Restify/UserRepository.php +++ b/tests/Fixtures/CustomNamespace/PackageA/Restify/UserRepository.php @@ -2,6 +2,4 @@ namespace CustomNamespace\PackageA\Restify; -class UserRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository -{ -} +class UserRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository {} diff --git a/tests/Fixtures/CustomNamespace/PackageB/Restify/CompanyRepository.php b/tests/Fixtures/CustomNamespace/PackageB/Restify/CompanyRepository.php index 1a509c3d..d5c47102 100644 --- a/tests/Fixtures/CustomNamespace/PackageB/Restify/CompanyRepository.php +++ b/tests/Fixtures/CustomNamespace/PackageB/Restify/CompanyRepository.php @@ -2,6 +2,4 @@ namespace CustomNamespace\PackageB\Restify; -class CompanyRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\Company\CompanyRepository -{ -} +class CompanyRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\Company\CompanyRepository {} diff --git a/tests/Fixtures/CustomNamespace/PackageB/Restify/UserRepository.php b/tests/Fixtures/CustomNamespace/PackageB/Restify/UserRepository.php index 4a0e4154..2b502ed1 100644 --- a/tests/Fixtures/CustomNamespace/PackageB/Restify/UserRepository.php +++ b/tests/Fixtures/CustomNamespace/PackageB/Restify/UserRepository.php @@ -2,6 +2,4 @@ namespace CustomNamespace\PackageB\Restify; -class UserRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository -{ -} +class UserRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository {} diff --git a/tests/Fixtures/CustomNamespace/PackageC/Restify/CommentRepository.php b/tests/Fixtures/CustomNamespace/PackageC/Restify/CommentRepository.php index ab6d7df4..21068c82 100644 --- a/tests/Fixtures/CustomNamespace/PackageC/Restify/CommentRepository.php +++ b/tests/Fixtures/CustomNamespace/PackageC/Restify/CommentRepository.php @@ -2,6 +2,4 @@ namespace CustomNamespace\PackageC\Restify; -class CommentRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\Comment\CommentRepository -{ -} +class CommentRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\Comment\CommentRepository {} diff --git a/tests/Fixtures/CustomNamespace/PackageC/Restify/PostRepository.php b/tests/Fixtures/CustomNamespace/PackageC/Restify/PostRepository.php index e3b66eb3..366a7c05 100644 --- a/tests/Fixtures/CustomNamespace/PackageC/Restify/PostRepository.php +++ b/tests/Fixtures/CustomNamespace/PackageC/Restify/PostRepository.php @@ -2,6 +2,4 @@ namespace CustomNamespace\PackageC\Restify; -class PostRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\Post\PostRepository -{ -} +class PostRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\Post\PostRepository {} diff --git a/tests/Fixtures/CustomNamespace/PackageC/Restify/UserRepository.php b/tests/Fixtures/CustomNamespace/PackageC/Restify/UserRepository.php index 0f4535cd..ac53add1 100644 --- a/tests/Fixtures/CustomNamespace/PackageC/Restify/UserRepository.php +++ b/tests/Fixtures/CustomNamespace/PackageC/Restify/UserRepository.php @@ -2,6 +2,4 @@ namespace CustomNamespace\PackageC\Restify; -class UserRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository -{ -} +class UserRepository extends \Binaryk\LaravelRestify\Tests\Fixtures\User\UserRepository {} diff --git a/tests/Fixtures/Post/PostRepository.php b/tests/Fixtures/Post/PostRepository.php index 217ff274..ff288505 100644 --- a/tests/Fixtures/Post/PostRepository.php +++ b/tests/Fixtures/Post/PostRepository.php @@ -95,6 +95,7 @@ public function filters(RestifyRequest $request): array SelectCategoryFilter::new(), CreatedAfterDateFilter::new(), InactiveFilter::new(), + ValueFilter::new(), ]; } diff --git a/tests/Fixtures/Post/ValueFilter.php b/tests/Fixtures/Post/ValueFilter.php new file mode 100644 index 00000000..53f94725 --- /dev/null +++ b/tests/Fixtures/Post/ValueFilter.php @@ -0,0 +1,29 @@ +rest('operator'); + $column = $this->rest('column'); + + $query->where($column, $operator, $value); + } + + public function rules(Request $request): array + { + return [ + 'is_active' => 'required|boolean', + ]; + } +} diff --git a/tests/Fixtures/User/AvatarFile.php b/tests/Fixtures/User/AvatarFile.php index 2cd2c6f1..002a67f5 100644 --- a/tests/Fixtures/User/AvatarFile.php +++ b/tests/Fixtures/User/AvatarFile.php @@ -4,6 +4,4 @@ use Binaryk\LaravelRestify\Fields\File; -class AvatarFile extends File -{ -} +class AvatarFile extends File {} diff --git a/tests/Prototypes/Prototypeable.php b/tests/Prototypes/Prototypeable.php index 7feb17e3..800dced9 100644 --- a/tests/Prototypes/Prototypeable.php +++ b/tests/Prototypes/Prototypeable.php @@ -20,8 +20,7 @@ abstract class Prototypeable implements JsonSerializable public function __construct( public IntegrationTestCase $test, - ) { - } + ) {} protected array $attributes = [];