Skip to content

Commit f296d6f

Browse files
authored
Merge pull request #16 from LIQRGV/add-relation-filter
Add function to ignore or only take some filter
2 parents 5a1d48c + 5cea72a commit f296d6f

File tree

2 files changed

+157
-2
lines changed

2 files changed

+157
-2
lines changed

src/RequestParser.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ class RequestParser
4040
* @var Request
4141
*/
4242
private $request;
43+
/**
44+
* @var array
45+
*/
46+
private $ignoredFilters = [];
47+
/**
48+
* @var array
49+
*/
50+
private $allowedFilters = [];
4351

4452
public function __construct(Request $request)
4553
{
@@ -60,6 +68,16 @@ public function setModel(string $modelName): RequestParser
6068
return $this;
6169
}
6270

71+
public function setIgnoredFilters(array $array)
72+
{
73+
$this->ignoredFilters = $array;
74+
}
75+
76+
public function setAllowedFilters(array $array)
77+
{
78+
$this->allowedFilters = $array;
79+
}
80+
6381
public function getBuilder(): Builder
6482
{
6583
$modelBuilderStruct = $this->createModelBuilderStruct($this->request);
@@ -137,6 +155,14 @@ private function parseFilter(array $filterQuery = []): array
137155
{
138156
$filters = [];
139157

158+
$filterQuery = !empty($this->allowedFilters) ? array_filter($filterQuery, function ($key) {
159+
return in_array($key, $this->allowedFilters);
160+
}, ARRAY_FILTER_USE_KEY) : $filterQuery;
161+
162+
$filterQuery = array_filter($filterQuery, function ($key) {
163+
return !in_array($key, $this->ignoredFilters);
164+
}, ARRAY_FILTER_USE_KEY);
165+
140166
if (is_array($filterQuery)) {
141167
foreach ($filterQuery as $key => $operatorValuePairs) {
142168
if (is_array($operatorValuePairs)) {

tests/RequestParserTest.php

Lines changed: 131 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use LIQRGV\QueryFilter\Mocks\MockModelController;
1313
use LIQRGV\QueryFilter\RequestParser;
1414
use Symfony\Component\HttpFoundation\ParameterBag;
15+
use function foo\func;
1516

1617
class RequestParserTest extends TestCase
1718
{
@@ -455,7 +456,8 @@ function testPagination()
455456
$this->assertEquals(50, $query->offset);
456457
}
457458

458-
function testPaginationIgnoreOffset(){
459+
function testPaginationIgnoreOffset()
460+
{
459461
$uri = 'some_model';
460462
$controllerClass = MockModelController::class;
461463
$query = new ParameterBag([
@@ -478,7 +480,8 @@ function testPaginationIgnoreOffset(){
478480
$this->assertNull($query->offset);
479481
}
480482

481-
function testPaginationUsingZeroAsDefaultOffset(){
483+
function testPaginationUsingZeroAsDefaultOffset()
484+
{
482485
$uri = 'some_model';
483486
$controllerClass = MockModelController::class;
484487
$query = new ParameterBag([
@@ -500,4 +503,130 @@ function testPaginationUsingZeroAsDefaultOffset(){
500503
$this->assertEquals(50, $query->limit);
501504
$this->assertEquals(0, $query->offset);
502505
}
506+
507+
function testFilterOnlyAllowedFilter()
508+
{
509+
$uri = 'some_model';
510+
$controllerClass = MockModelController::class;
511+
$ignoredKey = "ignored_key";
512+
$nameKey = "name";
513+
$valueKey = "value";
514+
$query = new ParameterBag([
515+
"filter" => [
516+
$nameKey => [
517+
"in" => "2,3,4"
518+
],
519+
$valueKey => [
520+
"is" => "5"
521+
],
522+
$ignoredKey => [
523+
"is" => "6"
524+
],
525+
],
526+
]);
527+
$requestParserOptions = [
528+
'model_namespaces' => [
529+
'LIQRGV\QueryFilter\Mocks',
530+
]
531+
];
532+
533+
$request = $this->createControllerRequest($uri, $controllerClass, $query, $requestParserOptions);
534+
535+
$requestParser = new RequestParser($request);
536+
$requestParser->setAllowedFilters(["name", "value"]);
537+
$builder = $requestParser->getBuilder();
538+
539+
$query = $builder->getQuery();
540+
541+
$this->assertEmpty(array_filter($query->wheres, function ($where) use ($ignoredKey) {
542+
return $where["column"] == $ignoredKey;
543+
}));
544+
545+
$nameAndValueColumn = array_filter($query->wheres, function ($where) use ($nameKey, $valueKey) {
546+
return in_array($where["column"], [$nameKey, $valueKey]);
547+
});
548+
$this->assertEquals(2, count($nameAndValueColumn));
549+
}
550+
551+
function testFilterIgnoreIgnoredFilter()
552+
{
553+
$uri = 'some_model';
554+
$controllerClass = MockModelController::class;
555+
$ignoredKey = "omnisearch";
556+
$notIgnoredKey = "selected_value";
557+
$query = new ParameterBag([
558+
"filter" => [
559+
$notIgnoredKey => [
560+
"is" => "6"
561+
],
562+
$ignoredKey => [
563+
"is" => "something"
564+
],
565+
],
566+
]);
567+
$requestParserOptions = [
568+
'model_namespaces' => [
569+
'LIQRGV\QueryFilter\Mocks',
570+
]
571+
];
572+
573+
$request = $this->createControllerRequest($uri, $controllerClass, $query, $requestParserOptions);
574+
575+
$requestParser = new RequestParser($request);
576+
$requestParser->setIgnoredFilters([$ignoredKey]);
577+
$builder = $requestParser->getBuilder();
578+
579+
$query = $builder->getQuery();
580+
581+
$this->assertEmpty(array_filter($query->wheres, function ($where) use ($ignoredKey) {
582+
return $where["column"] == $ignoredKey;
583+
}));
584+
$this->assertNotEmpty(array_filter($query->wheres, function ($where) use ($notIgnoredKey) {
585+
return $where["column"] == $notIgnoredKey;
586+
}));
587+
}
588+
589+
function testFilterIgnoredFilterShouldTakePrecedenceOverAllowedFilter()
590+
{
591+
$uri = 'some_model';
592+
$controllerClass = MockModelController::class;
593+
$ignoredKey = "ignored_key";
594+
$nameKey = "name";
595+
$valueKey = "value";
596+
$query = new ParameterBag([
597+
"filter" => [
598+
$nameKey => [
599+
"in" => "2,3,4"
600+
],
601+
$valueKey => [
602+
"is" => "5"
603+
],
604+
$ignoredKey => [
605+
"is" => "6"
606+
],
607+
],
608+
]);
609+
$requestParserOptions = [
610+
'model_namespaces' => [
611+
'LIQRGV\QueryFilter\Mocks',
612+
]
613+
];
614+
615+
$request = $this->createControllerRequest($uri, $controllerClass, $query, $requestParserOptions);
616+
617+
$requestParser = new RequestParser($request);
618+
$requestParser->setIgnoredFilters([$ignoredKey]);
619+
$requestParser->setAllowedFilters([$nameKey, $valueKey, $ignoredKey]);
620+
$builder = $requestParser->getBuilder();
621+
622+
$query = $builder->getQuery();
623+
624+
$nameAndValueColumn = array_filter($query->wheres, function ($where) use ($nameKey, $valueKey) {
625+
return in_array($where["column"], [$nameKey, $valueKey]);
626+
});
627+
$this->assertEquals(2, count($nameAndValueColumn));
628+
$this->assertEmpty(array_filter($query->wheres, function ($where) use ($ignoredKey) {
629+
return $where["column"] == $ignoredKey;
630+
}));
631+
}
503632
}

0 commit comments

Comments
 (0)