Skip to content

Commit 77bd78d

Browse files
fix: CI
1 parent 755e1e0 commit 77bd78d

File tree

6 files changed

+82
-94
lines changed

6 files changed

+82
-94
lines changed

features/main/subresource.feature

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ Feature: Subresource support
108108
"hydra:totalItems": 2,
109109
"hydra:search": {
110110
"@type": "hydra:IriTemplate",
111-
"hydra:template": "/dummies/1/related_dummies{?relatedToDummyFriend.dummyFriend,relatedToDummyFriend.dummyFriend[],name,age,age[],id,id[],name,name[],symfony,symfony[],dummyDate[before],dummyDate[strictly_before],dummyDate[after],dummyDate[strictly_after]}",
111+
"hydra:template": "/dummies/1/related_dummies{?relatedToDummyFriend.dummyFriend,relatedToDummyFriend.dummyFriend[],name,age,age[],id,id[],symfony,symfony[],dummyDate[before],dummyDate[strictly_before],dummyDate[after],dummyDate[strictly_after]}",
112112
"hydra:variableRepresentation": "BasicRepresentation",
113113
"hydra:mapping": [
114114
{
@@ -153,18 +153,6 @@ Feature: Subresource support
153153
"property": "id",
154154
"required": false
155155
},
156-
{
157-
"@type": "IriTemplateMapping",
158-
"variable": "name",
159-
"property": "name",
160-
"required": false
161-
},
162-
{
163-
"@type": "IriTemplateMapping",
164-
"variable": "name[]",
165-
"property": "name",
166-
"required": false
167-
},
168156
{
169157
"@type": "IriTemplateMapping",
170158
"variable": "symfony",
@@ -245,7 +233,7 @@ Feature: Subresource support
245233
},
246234
"hydra:search": {
247235
"@type": "hydra:IriTemplate",
248-
"hydra:template": "/dummies/1/related_dummies{?relatedToDummyFriend.dummyFriend,relatedToDummyFriend.dummyFriend[],name,age,age[]}",
236+
"hydra:template": "/dummies/1/related_dummies{?relatedToDummyFriend.dummyFriend,relatedToDummyFriend.dummyFriend[],name,age,age[],id,id[],symfony,symfony[],dummyDate[before],dummyDate[strictly_before],dummyDate[after],dummyDate[strictly_after]}",
249237
"hydra:variableRepresentation": "BasicRepresentation",
250238
"hydra:mapping": [
251239
{
@@ -290,18 +278,6 @@ Feature: Subresource support
290278
"property": "id",
291279
"required": false
292280
},
293-
{
294-
"@type": "IriTemplateMapping",
295-
"variable": "name",
296-
"property": "name",
297-
"required": false
298-
},
299-
{
300-
"@type": "IriTemplateMapping",
301-
"variable": "name[]",
302-
"property": "name",
303-
"required": false
304-
},
305281
{
306282
"@type": "IriTemplateMapping",
307283
"variable": "symfony",

src/Core/Upgrade/UpgradeApiFilterVisitor.php

Lines changed: 67 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -14,36 +14,40 @@
1414
namespace ApiPlatform\Core\Upgrade;
1515

1616
use ApiPlatform\Core\Annotation\ApiFilter as LegacyApiFilter;
17-
use ApiPlatform\Core\Bridge\Doctrine\Odm\Filter\BooleanFilter as LegacyOdmBooleanFilter;
18-
use ApiPlatform\Core\Bridge\Doctrine\Odm\Filter\DateFilter as LegacyOdmDateFilter;
19-
use ApiPlatform\Core\Bridge\Doctrine\Odm\Filter\ExistsFilter as LegacyOdmExistsFilter;
20-
use ApiPlatform\Core\Bridge\Doctrine\Odm\Filter\NumericFilter as LegacyOdmNumericFilter;
21-
use ApiPlatform\Core\Bridge\Doctrine\Odm\Filter\OrderFilter as LegacyOdmOrderFilter;
22-
use ApiPlatform\Core\Bridge\Doctrine\Odm\Filter\RangeFilter as LegacyOdmRangeFilter;
23-
use ApiPlatform\Core\Bridge\Doctrine\Odm\Filter\SearchFilter as LegacyOdmSearchFilter;
17+
use ApiPlatform\Core\Bridge\Doctrine\MongoDbOdm\Filter\BooleanFilter as LegacyOdmBooleanFilter;
18+
use ApiPlatform\Core\Bridge\Doctrine\MongoDbOdm\Filter\DateFilter as LegacyOdmDateFilter;
19+
use ApiPlatform\Core\Bridge\Doctrine\MongoDbOdm\Filter\ExistsFilter as LegacyOdmExistsFilter;
20+
use ApiPlatform\Core\Bridge\Doctrine\MongoDbOdm\Filter\NumericFilter as LegacyOdmNumericFilter;
21+
use ApiPlatform\Core\Bridge\Doctrine\MongoDbOdm\Filter\OrderFilter as LegacyOdmOrderFilter;
22+
use ApiPlatform\Core\Bridge\Doctrine\MongoDbOdm\Filter\RangeFilter as LegacyOdmRangeFilter;
23+
use ApiPlatform\Core\Bridge\Doctrine\MongoDbOdm\Filter\SearchFilter as LegacyOdmSearchFilter;
2424
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\BooleanFilter as LegacyOrmBooleanFilter;
2525
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter as LegacyOrmDateFilter;
2626
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter as LegacyOrmExistsFilter;
2727
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\NumericFilter as LegacyOrmNumericFilter;
2828
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter as LegacyOrmOrderFilter;
2929
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\RangeFilter as LegacyOrmRangeFilter;
3030
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter as LegacyOrmSearchFilter;
31-
use ApiPlatform\Doctrine\Odm\Filter\BooleanFilter as OdmBooleanFilter;;
32-
use ApiPlatform\Doctrine\Odm\Filter\DateFilter as OdmDateFilter;;
33-
use ApiPlatform\Doctrine\Odm\Filter\ExistsFilter as OdmExistsFilter;;
34-
use ApiPlatform\Doctrine\Odm\Filter\NumericFilter as OdmNumericFilter;;
35-
use ApiPlatform\Doctrine\Odm\Filter\OrderFilter as OdmOrderFilter;;
36-
use ApiPlatform\Doctrine\Odm\Filter\RangeFilter as OdmRangeFilter;;
37-
use ApiPlatform\Doctrine\Odm\Filter\SearchFilter as OdmSearchFilter;;
38-
use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter as OrmBooleanFilter;;
39-
use ApiPlatform\Doctrine\Orm\Filter\DateFilter as OrmDateFilter;;
40-
use ApiPlatform\Doctrine\Orm\Filter\ExistsFilter as OrmExistsFilter;;
41-
use ApiPlatform\Doctrine\Orm\Filter\NumericFilter as OrmNumericFilter;;
42-
use ApiPlatform\Doctrine\Orm\Filter\OrderFilter as OrmOrderFilter;;
43-
use ApiPlatform\Doctrine\Orm\Filter\RangeFilter as OrmRangeFilter;;
44-
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter as OrmSearchFilter;;
31+
use ApiPlatform\Core\Serializer\Filter\GroupFilter as LegacyGroupFilter;
32+
use ApiPlatform\Core\Serializer\Filter\PropertyFilter as LegacyPropertyFilter;
33+
use ApiPlatform\Doctrine\Odm\Filter\BooleanFilter as OdmBooleanFilter;
34+
use ApiPlatform\Doctrine\Odm\Filter\DateFilter as OdmDateFilter;
35+
use ApiPlatform\Doctrine\Odm\Filter\ExistsFilter as OdmExistsFilter;
36+
use ApiPlatform\Doctrine\Odm\Filter\NumericFilter as OdmNumericFilter;
37+
use ApiPlatform\Doctrine\Odm\Filter\OrderFilter as OdmOrderFilter;
38+
use ApiPlatform\Doctrine\Odm\Filter\RangeFilter as OdmRangeFilter;
39+
use ApiPlatform\Doctrine\Odm\Filter\SearchFilter as OdmSearchFilter;
40+
use ApiPlatform\Doctrine\Orm\Filter\BooleanFilter as OrmBooleanFilter;
41+
use ApiPlatform\Doctrine\Orm\Filter\DateFilter as OrmDateFilter;
42+
use ApiPlatform\Doctrine\Orm\Filter\ExistsFilter as OrmExistsFilter;
43+
use ApiPlatform\Doctrine\Orm\Filter\NumericFilter as OrmNumericFilter;
44+
use ApiPlatform\Doctrine\Orm\Filter\OrderFilter as OrmOrderFilter;
45+
use ApiPlatform\Doctrine\Orm\Filter\RangeFilter as OrmRangeFilter;
46+
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter as OrmSearchFilter;
4547
use ApiPlatform\Metadata\ApiFilter;
4648
use ApiPlatform\Metadata\Resource\DeprecationMetadataTrait;
49+
use ApiPlatform\Serializer\Filter\GroupFilter;
50+
use ApiPlatform\Serializer\Filter\PropertyFilter;
4751
use Doctrine\Common\Annotations\AnnotationReader;
4852
use PhpParser\Node;
4953
use PhpParser\NodeVisitorAbstract;
@@ -68,55 +72,59 @@ public function __construct(?AnnotationReader $reader, string $resourceClass)
6872
public function enterNode(Node $node)
6973
{
7074
if ($node instanceof Node\Stmt\Namespace_) {
71-
$namespaces = [
72-
ApiFilter::class,
73-
OdmSearchFilter::class,
74-
OdmExistsFilter::class,
75-
OdmDateFilter::class,
76-
OdmBooleanFilter::class,
77-
OdmNumericFilter::class,
78-
OdmOrderFilter::class,
79-
OdmRangeFilter::class,
80-
OrmSearchFilter::class,
81-
OrmExistsFilter::class,
82-
OrmDateFilter::class,
83-
OrmBooleanFilter::class,
84-
OrmNumericFilter::class,
85-
OrmOrderFilter::class,
86-
OrmRangeFilter::class,
87-
];
75+
$namespaces = [ApiFilter::class];
8876

8977
$legacyNamespaces = [
90-
LegacyApiFilter::class,
91-
LegacyOdmSearchFilter::class,
92-
LegacyOdmExistsFilter::class,
93-
LegacyOdmDateFilter::class,
94-
LegacyOdmBooleanFilter::class,
95-
LegacyOdmNumericFilter::class,
96-
LegacyOdmOrderFilter::class,
97-
LegacyOdmRangeFilter::class,
98-
LegacyOrmSearchFilter::class,
99-
LegacyOrmExistsFilter::class,
100-
LegacyOrmDateFilter::class,
101-
LegacyOrmBooleanFilter::class,
102-
LegacyOrmNumericFilter::class,
103-
LegacyOrmOrderFilter::class,
104-
LegacyOrmRangeFilter::class,
78+
LegacyApiFilter::class => ApiFilter::class,
79+
LegacyOdmSearchFilter::class => OdmSearchFilter::class,
80+
LegacyOdmExistsFilter::class => OdmExistsFilter::class,
81+
LegacyOdmDateFilter::class => OdmDateFilter::class,
82+
LegacyOdmBooleanFilter::class => OdmBooleanFilter::class,
83+
LegacyOdmNumericFilter::class => OdmNumericFilter::class,
84+
LegacyOdmOrderFilter::class => OdmOrderFilter::class,
85+
LegacyOdmRangeFilter::class => OdmRangeFilter::class,
86+
LegacyOrmSearchFilter::class => OrmSearchFilter::class,
87+
LegacyOrmExistsFilter::class => OrmExistsFilter::class,
88+
LegacyOrmDateFilter::class => OrmDateFilter::class,
89+
LegacyOrmBooleanFilter::class => OrmBooleanFilter::class,
90+
LegacyOrmNumericFilter::class => OrmNumericFilter::class,
91+
LegacyOrmOrderFilter::class => OrmOrderFilter::class,
92+
LegacyOrmRangeFilter::class => OrmRangeFilter::class,
93+
LegacyPropertyFilter::class => PropertyFilter::class,
94+
LegacyGroupFilter::class => GroupFilter::class,
10595
];
10696

97+
foreach ($this->readApiFilters($this->reflectionClass) as $annotation) {
98+
[$filterAnnotation,] = $annotation;
99+
if (isset($legacyNamespaces[$filterAnnotation->filterClass])) {
100+
$namespaces[] = $legacyNamespaces[$filterAnnotation->filterClass];
101+
}
102+
}
103+
104+
foreach ($this->reflectionClass->getProperties() as $reflectionProperty) {
105+
foreach ($this->readApiFilters($reflectionProperty) as $annotation) {
106+
[$filterAnnotation,] = $annotation;
107+
if (isset($legacyNamespaces[$filterAnnotation->filterClass])) {
108+
$namespaces[] = $legacyNamespaces[$filterAnnotation->filterClass];
109+
}
110+
}
111+
}
112+
113+
$namespaces = array_unique($namespaces);
114+
107115
foreach ($node->stmts as $k => $stmt) {
108116
if (!$stmt instanceof Node\Stmt\Use_) {
109117
break;
110118
}
111119

112120
$useStatement = implode('\\', $stmt->uses[0]->name->parts);
113121

114-
foreach($legacyNamespaces as $legacyNamespace) {
122+
foreach (array_keys($legacyNamespaces) as $legacyNamespace) {
115123
if ($legacyNamespace === $useStatement) {
116124
unset($node->stmts[$k]);
117-
continue;
118125
}
119126
}
127+
120128
if (false !== ($key = array_search($useStatement, $namespaces, true))) {
121129
unset($namespaces[$key]);
122130
}
@@ -134,10 +142,9 @@ public function enterNode(Node $node)
134142
}
135143

136144
if ($node instanceof Node\Stmt\Property || $node instanceof Node\Stmt\Class_ || $node instanceof Node\Stmt\Interface_) {
145+
$reflection = $this->reflectionClass;
137146
if ($node instanceof Node\Stmt\Property) {
138147
$reflection = $this->reflectionClass->getProperty($node->props[0]->name->__toString());
139-
} else {
140-
$reflection = $this->reflectionClass;
141148
}
142149

143150
foreach ($this->readApiFilters($reflection) as $annotation) {
@@ -151,6 +158,7 @@ public function enterNode(Node $node)
151158
$arguments = [];
152159

153160
foreach ([
161+
'id',
154162
'strategy',
155163
'filterClass',
156164
'properties',
@@ -164,12 +172,12 @@ public function enterNode(Node $node)
164172
$arguments[$key] = $this->valueToNode($value);
165173
}
166174

167-
array_unshift($node->attrGroups, new Node\AttributeGroup([
175+
$node->attrGroups[] = new Node\AttributeGroup([
168176
new Node\Attribute(
169177
new Node\Name('ApiFilter'),
170178
$this->arrayToArguments($arguments),
171179
),
172-
]));
180+
]);
173181
}
174182
}
175183
}

src/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -962,11 +962,7 @@ private function registerLegacyServices(ContainerBuilder $container, array $conf
962962

963963
if (!$config['metadata_backward_compatibility_layer']) {
964964
$loader->load('symfony.xml');
965-
966-
return;
967965
}
968-
969-
$loader->load('legacy/api.xml');
970966
}
971967

972968
private function registerUpgradeCommandConfiguration(ContainerBuilder $container, XmlFileLoader $loader, array $config): void

tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,13 @@ public function testDebugResource()
9898
'-use ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Filter\\DateFilter;',
9999
'+use ApiPlatform\\Metadata\\ApiResource',
100100
'+use ApiPlatform\\Metadata\\ApiFilter',
101-
'+use ApiPlatform\Doctrine\Orm\Filter\SearchFilter',
102-
'+use ApiPlatform\Doctrine\Orm\Filter\ExistsFilter',
103-
'+use ApiPlatform\Doctrine\Orm\Filter\DateFilter',
101+
'+use ApiPlatform\\Doctrine\\Orm\\Filter\\SearchFilter',
102+
'+use ApiPlatform\\Doctrine\\Orm\\Filter\\ExistsFilter',
103+
'+use ApiPlatform\\Doctrine\\Orm\\Filter\\DateFilter',
104104
'+use ApiPlatform\\Metadata\\Get',
105105
"+#[ApiResource(graphQlOperations: [new Query(name: 'item_query'), new Mutation(name: 'update', normalizationContext: ['groups' => ['chicago', 'fakemanytomany']], denormalizationContext: ['groups' => ['friends']])], types: ['https://schema.org/Product'], normalizationContext: ['groups' => ['friends']], filters: ['related_dummy.friends', 'related_dummy.complex_sub_query'])]",
106106
"#[ApiResource(uriTemplate: '/related_dummies/{id}/id.{_format}', uriVariables: ['id' => new Link(fromClass: self::class, identifiers: ['id'])], status: 200, types: ['https://schema.org/Product'], filters: ['related_dummy.friends', 'related_dummy.complex_sub_query'], normalizationContext: ['groups' => ['friends']], operations: [new Get()])]",
107-
"+#[ApiFilter(filterClass: SearchFilter::class, properties: ['id', 'name'])]",
107+
"+#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])]",
108108
'+ #[ApiFilter(filterClass: SearchFilter::class)]',
109109
'+ #[ApiFilter(filterClass: ExistsFilter::class)]',
110110
'+ #[ApiFilter(filterClass: DateFilter::class)]',

tests/Fixtures/TestBundle/Document/RelatedDummy.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@
1313

1414
namespace ApiPlatform\Tests\Fixtures\TestBundle\Document;
1515

16+
use ApiPlatform\Core\Annotation\ApiFilter;
1617
use ApiPlatform\Core\Annotation\ApiProperty;
1718
use ApiPlatform\Core\Annotation\ApiResource;
1819
use ApiPlatform\Core\Annotation\ApiSubresource;
20+
use ApiPlatform\Doctrine\Odm\Filter\DateFilter;
21+
use ApiPlatform\Doctrine\Odm\Filter\ExistsFilter;
22+
use ApiPlatform\Doctrine\Odm\Filter\SearchFilter;
1923
use Doctrine\Common\Collections\ArrayCollection;
2024
use Doctrine\Common\Collections\Collection;
2125
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
@@ -30,6 +34,7 @@
3034
*
3135
* @ApiResource(graphql={"item_query", "update"={"normalization_context"={"groups"={"chicago", "fakemanytomany"}}, "denormalization_context"={"groups"={"friends"}}}}, iri="https://schema.org/Product", attributes={"normalization_context"={"groups"={"friends"}}, "filters"={"related_dummy.mongodb.friends"}})
3236
* @ODM\Document
37+
* @ApiFilter(SearchFilter::class, properties={"id"})
3338
*/
3439
class RelatedDummy extends ParentDummy
3540
{
@@ -52,6 +57,8 @@ class RelatedDummy extends ParentDummy
5257
/**
5358
* @ODM\Field(type="string")
5459
* @Groups({"barcelona", "chicago", "friends"})
60+
* @ApiFilter(SearchFilter::class)
61+
* @ApiFilter(ExistsFilter::class)
5562
*/
5663
protected $symfony = 'symfony';
5764

@@ -61,6 +68,7 @@ class RelatedDummy extends ParentDummy
6168
* @ODM\Field(type="date", nullable=true)
6269
* @Assert\DateTime
6370
* @Groups({"friends"})
71+
* @ApiFilter(DateFilter::class)
6472
*/
6573
public $dummyDate;
6674

tests/Fixtures/TestBundle/Entity/RelatedDummy.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
*
3434
* @ApiResource(graphql={"item_query", "update"={"normalization_context"={"groups"={"chicago", "fakemanytomany"}}, "denormalization_context"={"groups"={"friends"}}}}, iri="https://schema.org/Product", attributes={"normalization_context"={"groups"={"friends"}}, "filters"={"related_dummy.friends", "related_dummy.complex_sub_query"}})
3535
* @ORM\Entity
36-
* @ApiFilter(SearchFilter::class, properties={"id", "name"})
36+
* @ApiFilter(SearchFilter::class, properties={"id"})
3737
*/
3838
class RelatedDummy extends ParentDummy
3939
{

0 commit comments

Comments
 (0)