diff --git a/src/Laravel/Eloquent/Filter/RangeFilter.php b/src/Laravel/Eloquent/Filter/RangeFilter.php index bb86f7dc78..04cd0d9735 100644 --- a/src/Laravel/Eloquent/Filter/RangeFilter.php +++ b/src/Laravel/Eloquent/Filter/RangeFilter.php @@ -13,6 +13,7 @@ namespace ApiPlatform\Laravel\Eloquent\Filter; +use ApiPlatform\Metadata\Exception\InvalidArgumentException; use ApiPlatform\Metadata\JsonSchemaFilterInterface; use ApiPlatform\Metadata\OpenApiParameterFilterInterface; use ApiPlatform\Metadata\Parameter; @@ -20,6 +21,7 @@ use ApiPlatform\OpenApi\Model\Parameter as OpenApiParameter; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Psr\Log\LoggerInterface; final class RangeFilter implements FilterInterface, JsonSchemaFilterInterface, OpenApiParameterFilterInterface { @@ -32,12 +34,25 @@ final class RangeFilter implements FilterInterface, JsonSchemaFilterInterface, O 'gte' => '>=', ]; + public function __construct(private readonly ?LoggerInterface $logger = null) + { + } + /** * @param Builder $builder * @param array $context */ public function apply(Builder $builder, mixed $values, Parameter $parameter, array $context = []): Builder { + $values = \is_array($values) ? array_intersect_key($values, self::OPERATOR_VALUE) : []; + if (!$values) { + $this->logger?->notice('Invalid filter ignored', [ + 'exception' => new InvalidArgumentException(\sprintf('At least one valid operator ("%s") is required for "%s" parameter', implode('", "', array_keys(self::OPERATOR_VALUE)), $parameter->getKey())), + ]); + + return $builder; + } + $queryProperty = $this->getQueryProperty($parameter); foreach ($values as $key => $value) { diff --git a/src/Laravel/Tests/EloquentTest.php b/src/Laravel/Tests/EloquentTest.php index 30091ef78d..1b34ff89bc 100644 --- a/src/Laravel/Tests/EloquentTest.php +++ b/src/Laravel/Tests/EloquentTest.php @@ -16,6 +16,7 @@ use ApiPlatform\Laravel\Test\ApiTestAssertionsTrait; use ApiPlatform\Laravel\workbench\app\Enums\BookStatus; use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; use Orchestra\Testbench\Concerns\WithWorkbench; use Orchestra\Testbench\TestCase; @@ -427,6 +428,21 @@ public function testRangeGreaterThanEqualFilter(): void $this->assertSame($json['totalItems'], 2); } + public function testRangeFilterWithInvalidValue(): void + { + BookFactory::new()->has(AuthorFactory::new())->count(10)->create(); + $log = Log::spy(); + + $res = $this->get('/api/books?isbn_range=5', ['Accept' => ['application/ld+json']]); + $res->assertOk(); + $this->assertSame(10, $res->json()['totalItems']); + + $res = $this->get('/api/books?isbn_range[unknown]=5', ['Accept' => ['application/ld+json']]); + $res->assertOk(); + $this->assertSame(10, $res->json()['totalItems']); + $log->shouldHaveReceived('notice')->twice(); + } + public function testWrongOrderFilter(): void { BookFactory::new()->has(AuthorFactory::new())->count(10)->create();