Skip to content

Commit 885bda2

Browse files
authored
Merge pull request #1861 from IonBazan/exists-fix
fix exists filter
2 parents 35e48c8 + 3e04020 commit 885bda2

File tree

5 files changed

+47
-6
lines changed

5 files changed

+47
-6
lines changed

features/doctrine/date_filter.feature

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ Feature: Date filter on collections
404404
},
405405
"hydra:search": {
406406
"@type": "hydra:IriTemplate",
407-
"hydra:template": "/dummies{?dummyBoolean,relatedDummy.embeddedDummy.dummyBoolean,dummyDate[before],dummyDate[strictly_before],dummyDate[after],dummyDate[strictly_after],relatedDummy.dummyDate[before],relatedDummy.dummyDate[strictly_before],relatedDummy.dummyDate[after],relatedDummy.dummyDate[strictly_after],description[exists],relatedDummy.name[exists],dummyBoolean[exists],dummyFloat,dummyPrice,order[id],order[name],order[description],order[relatedDummy.name],order[relatedDummy.symfony],order[dummyDate],dummyFloat[between],dummyFloat[gt],dummyFloat[gte],dummyFloat[lt],dummyFloat[lte],dummyPrice[between],dummyPrice[gt],dummyPrice[gte],dummyPrice[lt],dummyPrice[lte],id,id[],name,alias,description,relatedDummy.name,relatedDummy.name[],relatedDummies,relatedDummies[],dummy,relatedDummies.name,properties[]}",
407+
"hydra:template": "/dummies{?dummyBoolean,relatedDummy.embeddedDummy.dummyBoolean,dummyDate[before],dummyDate[strictly_before],dummyDate[after],dummyDate[strictly_after],relatedDummy.dummyDate[before],relatedDummy.dummyDate[strictly_before],relatedDummy.dummyDate[after],relatedDummy.dummyDate[strictly_after],description[exists],relatedDummy.name[exists],dummyBoolean[exists],relatedDummy[exists],dummyFloat,dummyPrice,order[id],order[name],order[description],order[relatedDummy.name],order[relatedDummy.symfony],order[dummyDate],dummyFloat[between],dummyFloat[gt],dummyFloat[gte],dummyFloat[lt],dummyFloat[lte],dummyPrice[between],dummyPrice[gt],dummyPrice[gte],dummyPrice[lt],dummyPrice[lte],id,id[],name,alias,description,relatedDummy.name,relatedDummy.name[],relatedDummies,relatedDummies[],dummy,relatedDummies.name,properties[]}",
408408
"hydra:variableRepresentation": "BasicRepresentation",
409409
"hydra:mapping": [
410410
{
@@ -485,6 +485,12 @@ Feature: Date filter on collections
485485
"property": "dummyBoolean",
486486
"required": false
487487
},
488+
{
489+
"@type": "IriTemplateMapping",
490+
"variable": "relatedDummy[exists]",
491+
"property": "relatedDummy",
492+
"required": false
493+
},
488494
{
489495
"@type": "IriTemplateMapping",
490496
"variable": "dummyFloat",
@@ -716,7 +722,7 @@ Feature: Date filter on collections
716722
},
717723
"hydra:search": {
718724
"@type": "hydra:IriTemplate",
719-
"hydra:template": "/dummies{?dummyBoolean,dummyDate[before],dummyDate[after],relatedDummy.dummyDate[before],relatedDummy.dummyDate[strictly_before],relatedDummy.dummyDate[after],relatedDummy.dummyDate[strictly_after],description[exists],relatedDummy.name[exists],dummyBoolean[exists],dummyFloat,dummyPrice,order[id],order[name],order[relatedDummy.symfony],dummyFloat[between],dummyFloat[gt],dummyFloat[gte],dummyFloat[lt],dummyFloat[lte],dummyPrice[between],dummyPrice[gt],dummyPrice[gte],dummyPrice[lt],dummyPrice[lte],id,id[],name,alias,description,relatedDummy.name,relatedDummy.name[],relatedDummies,relatedDummies[],dummy,relatedDummies.name}",
725+
"hydra:template": "/dummies{?dummyBoolean,dummyDate[before],dummyDate[after],relatedDummy.dummyDate[before],relatedDummy.dummyDate[strictly_before],relatedDummy.dummyDate[after],relatedDummy.dummyDate[strictly_after],description[exists],relatedDummy.name[exists],dummyBoolean[exists],relatedDummy[exists],dummyFloat,dummyPrice,order[id],order[name],order[relatedDummy.symfony],dummyFloat[between],dummyFloat[gt],dummyFloat[gte],dummyFloat[lt],dummyFloat[lte],dummyPrice[between],dummyPrice[gt],dummyPrice[gte],dummyPrice[lt],dummyPrice[lte],id,id[],name,alias,description,relatedDummy.name,relatedDummy.name[],relatedDummies,relatedDummies[],dummy,relatedDummies.name}",
720726
"hydra:variableRepresentation": "BasicRepresentation",
721727
"hydra:mapping": [
722728
{
@@ -785,6 +791,12 @@ Feature: Date filter on collections
785791
"property": "relatedDummy.name",
786792
"required": false
787793
},
794+
{
795+
"@type": "IriTemplateMapping",
796+
"variable": "relatedDummy[exists]",
797+
"property": "relatedDummy",
798+
"required": false
799+
},
788800
{
789801
"@type": "IriTemplateMapping",
790802
"variable": "dummyBoolean[exists]",

features/graphql/filters.feature

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,29 @@ Feature: Collections filtering
2323
Then the JSON node "data.dummies.edges" should have 1 element
2424
And the JSON node "data.dummies.edges[0].node.dummyBoolean" should be false
2525

26+
@createSchema
27+
Scenario: Retrieve a collection filtered using the exists filter
28+
Given there are 3 dummy objects
29+
And there are 2 dummy objects with relatedDummy
30+
When I send the following GraphQL request:
31+
"""
32+
{
33+
dummies(relatedDummy: {exists: true}) {
34+
edges {
35+
node {
36+
id
37+
relatedDummy {
38+
name
39+
}
40+
}
41+
}
42+
}
43+
}
44+
"""
45+
Then the response status code should be 200
46+
And the JSON node "data.dummies.edges" should have 2 elements
47+
And the JSON node "data.dummies.edges[0].node.relatedDummy" should have 1 element
48+
2649
@createSchema
2750
Scenario: Retrieve a collection filtered using the date filter
2851
Given there are 3 dummy objects with dummyDate

features/main/crud.feature

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ Feature: Create-Retrieve-Update-Delete
129129
"hydra:totalItems": 1,
130130
"hydra:search": {
131131
"@type": "hydra:IriTemplate",
132-
"hydra:template": "/dummies{?dummyBoolean,relatedDummy.embeddedDummy.dummyBoolean,dummyDate[before],dummyDate[strictly_before],dummyDate[after],dummyDate[strictly_after],relatedDummy.dummyDate[before],relatedDummy.dummyDate[strictly_before],relatedDummy.dummyDate[after],relatedDummy.dummyDate[strictly_after],description[exists],relatedDummy.name[exists],dummyBoolean[exists],dummyFloat,dummyPrice,order[id],order[name],order[description],order[relatedDummy.name],order[relatedDummy.symfony],order[dummyDate],dummyFloat[between],dummyFloat[gt],dummyFloat[gte],dummyFloat[lt],dummyFloat[lte],dummyPrice[between],dummyPrice[gt],dummyPrice[gte],dummyPrice[lt],dummyPrice[lte],id,id[],name,alias,description,relatedDummy.name,relatedDummy.name[],relatedDummies,relatedDummies[],dummy,relatedDummies.name,properties[]}",
132+
"hydra:template": "/dummies{?dummyBoolean,relatedDummy.embeddedDummy.dummyBoolean,dummyDate[before],dummyDate[strictly_before],dummyDate[after],dummyDate[strictly_after],relatedDummy.dummyDate[before],relatedDummy.dummyDate[strictly_before],relatedDummy.dummyDate[after],relatedDummy.dummyDate[strictly_after],description[exists],relatedDummy.name[exists],dummyBoolean[exists],relatedDummy[exists],dummyFloat,dummyPrice,order[id],order[name],order[description],order[relatedDummy.name],order[relatedDummy.symfony],order[dummyDate],dummyFloat[between],dummyFloat[gt],dummyFloat[gte],dummyFloat[lt],dummyFloat[lte],dummyPrice[between],dummyPrice[gt],dummyPrice[gte],dummyPrice[lt],dummyPrice[lte],id,id[],name,alias,description,relatedDummy.name,relatedDummy.name[],relatedDummies,relatedDummies[],dummy,relatedDummies.name,properties[]}",
133133
"hydra:variableRepresentation": "BasicRepresentation",
134134
"hydra:mapping": [
135135
{
@@ -210,6 +210,12 @@ Feature: Create-Retrieve-Update-Delete
210210
"property": "dummyBoolean",
211211
"required": false
212212
},
213+
{
214+
"@type": "IriTemplateMapping",
215+
"variable": "relatedDummy[exists]",
216+
"property": "relatedDummy",
217+
"required": false
218+
},
213219
{
214220
"@type": "IriTemplateMapping",
215221
"variable": "dummyFloat",

src/Bridge/Doctrine/Orm/Filter/ExistsFilter.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ protected function filterProperty(string $property, $value, QueryBuilder $queryB
7575
return;
7676
}
7777

78-
if (\in_array($value[self::QUERY_PARAMETER_KEY], ['true', '1', '', null], true)) {
78+
if (\in_array($value[self::QUERY_PARAMETER_KEY], [true, 'true', '1', '', null], true)) {
7979
$value = true;
80-
} elseif (\in_array($value[self::QUERY_PARAMETER_KEY], ['false', '0'], true)) {
80+
} elseif (\in_array($value[self::QUERY_PARAMETER_KEY], [false, 'false', '0'], true)) {
8181
$value = false;
8282
} else {
8383
$this->logger->notice('Invalid filter ignored', [

tests/Fixtures/app/config/config_test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ services:
154154

155155
app.my_dummy_resource.exists_filter:
156156
parent: 'api_platform.doctrine.orm.exists_filter'
157-
arguments: [ { 'description': ~, 'relatedDummy.name': ~, 'dummyBoolean': ~ } ]
157+
arguments: [ { 'description': ~, 'relatedDummy.name': ~, 'dummyBoolean': ~, 'relatedDummy': ~ } ]
158158
tags: [ { name: 'api_platform.filter', id: 'my_dummy.exists' } ]
159159

160160
app.my_dummy_resource.property_filter:

0 commit comments

Comments
 (0)