From 210043c53aa26de935b99eff0aeb3a254332b161 Mon Sep 17 00:00:00 2001 From: Davy Beauzil Date: Tue, 4 Oct 2022 12:23:06 +0200 Subject: [PATCH 1/7] fix: remove ApiSubresource attribute with upgrade command --- src/Core/Upgrade/UpgradeApiResourceVisitor.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/Core/Upgrade/UpgradeApiResourceVisitor.php b/src/Core/Upgrade/UpgradeApiResourceVisitor.php index e36d85e0916..0528cabddc9 100644 --- a/src/Core/Upgrade/UpgradeApiResourceVisitor.php +++ b/src/Core/Upgrade/UpgradeApiResourceVisitor.php @@ -361,6 +361,16 @@ private function removeAttribute(Node\Stmt\Class_|Node\Stmt\Interface_ $node) } } } + foreach ($node->stmts as $k => $stmts) { + foreach ($stmts->attrGroups as $i => $attrGroups) { + foreach ($attrGroups->attrs as $j => $attrs) { + if (str_ends_with(implode('\\', $attrs->name->parts), 'ApiSubresource')) { + unset($node->stmts[$k]->attrGroups[$i]); + break; + } + } + } + } } private function removeAnnotation(Node\Stmt\Class_|Node\Stmt\Interface_ $node) From 1d83f25558d031a6d01fb37ed77fe5ce8c9e18a5 Mon Sep 17 00:00:00 2001 From: Davy Beauzil Date: Wed, 5 Oct 2022 15:19:22 +0200 Subject: [PATCH 2/7] fix: delete all ApiResource or ApiSubresource attributes/annotations --- src/Core/Upgrade/UpgradeApiResourceVisitor.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Core/Upgrade/UpgradeApiResourceVisitor.php b/src/Core/Upgrade/UpgradeApiResourceVisitor.php index 0528cabddc9..ead9a207f01 100644 --- a/src/Core/Upgrade/UpgradeApiResourceVisitor.php +++ b/src/Core/Upgrade/UpgradeApiResourceVisitor.php @@ -125,11 +125,8 @@ public function enterNode(Node $node) } if ($node instanceof Node\Stmt\Class_ || $node instanceof Node\Stmt\Interface_) { - if ($this->isAnnotation) { - $this->removeAnnotation($node); - } else { - $this->removeAttribute($node); - } + $this->removeAnnotation($node); + $this->removeAttribute($node); $arguments = []; $operations = null === $this->resourceAnnotation->itemOperations && null === $this->resourceAnnotation->collectionOperations ? null : array_merge( @@ -377,7 +374,7 @@ private function removeAnnotation(Node\Stmt\Class_|Node\Stmt\Interface_ $node) { $comment = $node->getDocComment(); - if (preg_match('/@ApiResource/', $comment->getText())) { + if ($comment && preg_match('/@ApiResource/', $comment->getText())) { $node->setDocComment($this->removeAnnotationByTag($comment, 'ApiResource')); } } From ed515ba55331ae5e0ce46f0b4e1197eae4a2820f Mon Sep 17 00:00:00 2001 From: Davy Beauzil Date: Thu, 6 Oct 2022 12:19:05 +0200 Subject: [PATCH 3/7] test: adding of tests for upgrade command --- .../Command/UpgradeApiResourceCommandTest.php | 171 ++++++++++---- .../TestBundle/Entity/OnlyAnnotation.php | 54 +++++ .../TestBundle/Entity/OnlyAttribute.php | 45 ++++ .../TestBundle/Entity/RelatedDummy.php | 210 ------------------ ...ourceAnnotationAndSubresourceAttribute.php | 47 ++++ ...ourceAttributeAndSubresourceAnnotation.php | 53 +++++ 6 files changed, 323 insertions(+), 257 deletions(-) create mode 100644 tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php create mode 100644 tests/Fixtures/TestBundle/Entity/OnlyAttribute.php delete mode 100644 tests/Fixtures/TestBundle/Entity/RelatedDummy.php create mode 100644 tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php create mode 100644 tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php diff --git a/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php b/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php index baf9c3e103f..e19397e78fd 100644 --- a/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php +++ b/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php @@ -22,7 +22,10 @@ use ApiPlatform\Core\Upgrade\SubresourceTransformer; use ApiPlatform\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface; use ApiPlatform\Metadata\Resource\ResourceNameCollection; -use ApiPlatform\Tests\Fixtures\TestBundle\Entity\RelatedDummy; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\OnlyAnnotation; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\OnlyAttribute; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\ResourceAnnotationAndSubresourceAttribute; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\ResourceAttributeAndSubresourceAnnotation; use Doctrine\Common\Annotations\AnnotationReader; use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Application; @@ -49,47 +52,19 @@ private function getCommandTester(ResourceNameCollectionFactoryInterface $resour /** * @requires PHP 8.1 + * + * @dataProvider debugResourceProvider */ - public function testDebugResource() + public function testDebugResource(string $entityClass, array $subresourceOperationFactoryReturn, array $expectedStrings) { $resourceNameCollectionFactoryProphecy = $this->prophesize(ResourceNameCollectionFactoryInterface::class); - $resourceNameCollectionFactoryProphecy->create()->willReturn(new ResourceNameCollection([RelatedDummy::class])); + $resourceNameCollectionFactoryProphecy->create()->willReturn(new ResourceNameCollection([$entityClass])); $resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class); - $resourceMetadataFactoryProphecy->create(RelatedDummy::class)->willReturn(new ResourceMetadata()); + $resourceMetadataFactoryProphecy->create($entityClass)->willReturn(new ResourceMetadata()); $subresourceOperationFactoryProphecy = $this->prophesize(SubresourceOperationFactoryInterface::class); - $subresourceOperationFactoryProphecy->create(RelatedDummy::class)->willReturn([[ - 'property' => 'id', - 'collection' => false, - 'resource_class' => RelatedDummy::class, - 'shortNames' => [ - 'RelatedDummy', - ], - 'legacy_filters' => [ - 'related_dummy.friends', - 'related_dummy.complex_sub_query', - ], - 'legacy_normalization_context' => [ - 'groups' => [ - 'friends', - ], - ], - 'legacy_type' => 'https://schema.org/Product', - 'identifiers' => [ - 'id' => [ - RelatedDummy::class, - 'id', - true, - ], - ], - 'operation_name' => 'id_get_subresource', - 'route_name' => 'api_related_dummies_id_get_subresource', - 'path' => '/related_dummies/{id}/id.{_format}', - ]]); - - $commandTester = $this->getCommandTester($resourceNameCollectionFactoryProphecy->reveal(), $resourceMetadataFactoryProphecy->reveal(), $subresourceOperationFactoryProphecy->reveal()); - $commandTester->execute([]); + $subresourceOperationFactoryProphecy->create($entityClass)->willReturn($subresourceOperationFactoryReturn); - $expectedStrings = [ + $expectedStrings = array_merge($expectedStrings, [ '-use ApiPlatform\\Core\\Annotation\\ApiSubresource', '-use ApiPlatform\\Core\\Annotation\\ApiProperty', '-use ApiPlatform\\Core\\Annotation\\ApiResource', @@ -103,21 +78,123 @@ public function testDebugResource() '+use ApiPlatform\\Doctrine\\Orm\\Filter\\SearchFilter', '+use ApiPlatform\\Doctrine\\Orm\\Filter\\ExistsFilter', '+use ApiPlatform\\Doctrine\\Orm\\Filter\\DateFilter', - '+use ApiPlatform\\Metadata\\Get', - "+#[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'])]", - "#[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()])]", - "+#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])]", - '+ #[ApiFilter(filterClass: SearchFilter::class)]', - '+ #[ApiFilter(filterClass: ExistsFilter::class)]', - '+ #[ApiFilter(filterClass: DateFilter::class)]', - '+ #[ApiProperty(writable: false)]', - "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", - "+ #[ApiProperty(deprecationReason: 'This property is deprecated for upgrade test')]", - ]; + '+use ApiPlatform\\Metadata\\Get', ] + ); + $commandTester = $this->getCommandTester($resourceNameCollectionFactoryProphecy->reveal(), $resourceMetadataFactoryProphecy->reveal(), $subresourceOperationFactoryProphecy->reveal()); + $commandTester->execute([]); $display = $commandTester->getDisplay(); foreach ($expectedStrings as $expectedString) { $this->assertStringContainsString($expectedString, $display); } } + + public function debugResourceProvider(): array + { + $entityClasses = [ + 'only_annotation' => OnlyAnnotation::class, + 'only_attribute' => OnlyAttribute::class, + 'resource_attribute_and_subresource_annotation' => ResourceAttributeAndSubresourceAnnotation::class, + 'resource_annotation_and_subresource_attribute' => ResourceAnnotationAndSubresourceAttribute::class, + ]; + + return array_map(function ($key, $entityClass) { + $expectedStrings = [ + '+#[ApiResource]', + sprintf("#[ApiResource(uriTemplate: '/%s/{id}/name.{_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()])]", $key), + '+ #[ApiFilter(filterClass: SearchFilter::class)]', + '+ #[ApiFilter(filterClass: ExistsFilter::class)]', + '+ #[ApiFilter(filterClass: DateFilter::class)]', + ]; + if (OnlyAnnotation::class === $entityClass) { + array_push($expectedStrings, + '- * @ApiResource', + '- * @ApiFilter(SearchFilter::class, properties={"id"})', + "+#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])]", + '- * @ApiProperty(writable=false)', + '+ #[ApiProperty(writable: false)]', + '- * @ApiSubresource', + '- * @ApiFilter(DateFilter::class)', + '- * @ApiProperty(iri="RelatedDummy.name")', + "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", + '- * @ApiFilter(SearchFilter::class)', + '- * @ApiFilter(ExistsFilter::class)', + ); + } + if (OnlyAttribute::class === $entityClass) { + array_push($expectedStrings, + '-#[ApiResource()]', + "+#[ApiResource(uriTemplate: '/only_attribute/{id}/name.{_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()])]", + '- #[ApiFilter(DateFilter::class)]', + '- #[ApiSubresource]', + "- #[ApiProperty(iri: 'RelatedDummy.name')]", + "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", + '- #[ApiFilter(SearchFilter::class)]', + '- #[ApiFilter(ExistsFilter::class)]', + ); + } + if (ResourceAnnotationAndSubresourceAttribute::class === $entityClass) { + array_push($expectedStrings, + '- * @ApiResource', + "+#[ApiResource(uriTemplate: '/resource_annotation_and_subresource_attribute/{id}/name.{_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()])]", + '- #[ApiFilter(DateFilter::class)]', + '- #[ApiSubresource]', + "- #[ApiProperty(iri: 'RelatedDummy.name')]", + "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", + '- #[ApiFilter(SearchFilter::class)]', + '- #[ApiFilter(ExistsFilter::class)]', + ); + } + if (ResourceAttributeAndSubresourceAnnotation::class === $entityClass) { + array_push($expectedStrings, + '-#[ApiResource()]', + '- * @ApiFilter(SearchFilter::class, properties={"id"})', + "+#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])]", + '- * @ApiProperty(writable=false)', + '+ #[ApiProperty(writable: false)]', + '- * @ApiFilter(DateFilter::class)', + '- * @ApiSubresource', + "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", + '- * @ApiProperty(iri="RelatedDummy.name")', + '- * @ApiFilter(SearchFilter::class)', + '- * @ApiFilter(ExistsFilter::class)', + ); + } + + return [ + $entityClass, + [ + [ + 'property' => 'id', + 'collection' => false, + 'resource_class' => $entityClass, + 'shortNames' => [ + substr($entityClass, (\strlen($entityClass) - strrpos($entityClass, '\\') - 1) * (-1)), + ], + 'legacy_filters' => [ + 'related_dummy.friends', + 'related_dummy.complex_sub_query', + ], + 'legacy_normalization_context' => [ + 'groups' => [ + 'friends', + ], + ], + 'legacy_type' => 'https://schema.org/Product', + 'identifiers' => [ + 'id' => [ + $entityClass, + 'id', + true, + ], + ], + 'operation_name' => 'name_get_subresource', + 'route_name' => sprintf('api_%s_name_get_subresource', $key), + 'path' => sprintf('/%s/{id}/name.{_format}', $key), + ], + ], + array_merge($expectedStrings), + ]; + }, array_keys($entityClasses), array_values($entityClasses)); + } } diff --git a/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php b/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php new file mode 100644 index 00000000000..404d9247b7a --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php @@ -0,0 +1,54 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; + +use ApiPlatform\Core\Annotation\ApiFilter; +use ApiPlatform\Core\Annotation\ApiProperty; +use ApiPlatform\Core\Annotation\ApiResource; +use ApiPlatform\Core\Annotation\ApiSubresource; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; + +/** + * @ApiResource + * + * @ApiFilter(SearchFilter::class, properties={"id"}) + */ +class OnlyAnnotation +{ + /** + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + * @Groups({"chicago", "friends"}) + * @ApiProperty(writable=false) + * @ApiFilter(DateFilter::class) + */ + private $id; + + /** + * @ORM\Column(type="string") + * @Groups({"barcelona", "chicago", "friends"}) + * + * @ApiSubresource + * + * @ApiProperty(iri="RelatedDummy.name") + * @ApiFilter(SearchFilter::class) + * @ApiFilter(ExistsFilter::class) + */ + private $name; +} diff --git a/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php b/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php new file mode 100644 index 00000000000..439c705ed03 --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; + +use ApiPlatform\Core\Annotation\ApiFilter; +use ApiPlatform\Core\Annotation\ApiProperty; +use ApiPlatform\Core\Annotation\ApiResource; +use ApiPlatform\Core\Annotation\ApiSubresource; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; + +#[ApiResource()] +#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])] +class OnlyAttribute +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: 'integer')] + #[Groups(['chicago', 'friends'])] + #[ApiProperty(writable: false)] + #[ApiFilter(DateFilter::class)] + private $id; + + #[ORM\Column(type: 'string')] + #[Groups(['barcelona', 'chicago', 'friends'])] + #[ApiSubresource] + #[ApiProperty(iri: 'RelatedDummy.name')] + #[ApiFilter(SearchFilter::class)] + #[ApiFilter(ExistsFilter::class)] + private $name; +} diff --git a/tests/Fixtures/TestBundle/Entity/RelatedDummy.php b/tests/Fixtures/TestBundle/Entity/RelatedDummy.php deleted file mode 100644 index 786a23e40a6..00000000000 --- a/tests/Fixtures/TestBundle/Entity/RelatedDummy.php +++ /dev/null @@ -1,210 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; - -use ApiPlatform\Core\Annotation\ApiFilter; -use ApiPlatform\Core\Annotation\ApiProperty; -use ApiPlatform\Core\Annotation\ApiResource; -use ApiPlatform\Core\Annotation\ApiSubresource; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; -use Doctrine\Common\Collections\ArrayCollection; -use Doctrine\Common\Collections\Collection; -use Doctrine\ORM\Mapping as ORM; -use Symfony\Component\Serializer\Annotation\Groups; -use Symfony\Component\Validator\Constraints as Assert; - -/** - * Related Dummy. - * - * @author Kévin Dunglas - * - * @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"}}) - * @ORM\Entity - * @ApiFilter(SearchFilter::class, properties={"id"}) - */ -class RelatedDummy extends ParentDummy -{ - /** - * @ApiProperty(writable=false) - * - * @ApiSubresource - * - * @ORM\Column(type="integer") - * @ORM\Id - * @ORM\GeneratedValue(strategy="AUTO") - * @Groups({"chicago", "friends"}) - */ - private $id; - - /** - * @var string|null A name - * - * @ApiProperty(iri="RelatedDummy.name") - * @ORM\Column(nullable=true) - * @Groups({"friends"}) - */ - public $name; - - /** - * @ApiProperty(attributes={"deprecation_reason"="This property is deprecated for upgrade test"}) - * @ORM\Column - * @Groups({"barcelona", "chicago", "friends"}) - * @ApiFilter(SearchFilter::class) - * @ApiFilter(ExistsFilter::class) - */ - protected $symfony = 'symfony'; - - /** - * @var \DateTime|null A dummy date - * - * @ORM\Column(type="datetime", nullable=true) - * @Assert\DateTime - * @Groups({"friends"}) - * @ApiFilter(DateFilter::class) - */ - public $dummyDate; - - /** - * @ApiSubresource - * - * @ORM\ManyToOne(targetEntity="ThirdLevel", cascade={"persist"}) - * @Groups({"barcelona", "chicago", "friends"}) - */ - public $thirdLevel; - - /** - * @ApiSubresource - * - * @ORM\OneToMany(targetEntity="RelatedToDummyFriend", cascade={"persist"}, mappedBy="relatedDummy") - * @Groups({"fakemanytomany", "friends"}) - */ - public $relatedToDummyFriend; - - /** - * @var bool|null A dummy bool - * - * @ORM\Column(type="boolean", nullable=true) - * @Groups({"friends"}) - */ - public $dummyBoolean; - - /** - * @var EmbeddableDummy - * - * @ORM\Embedded(class="EmbeddableDummy") - * @Groups({"friends"}) - */ - public $embeddedDummy; - - public function __construct() - { - $this->relatedToDummyFriend = new ArrayCollection(); - $this->embeddedDummy = new EmbeddableDummy(); - } - - public function getId() - { - return $this->id; - } - - public function setId($id) - { - $this->id = $id; - } - - public function setName($name) - { - $this->name = $name; - } - - public function getName() - { - return $this->name; - } - - public function getSymfony() - { - return $this->symfony; - } - - public function setSymfony($symfony) - { - $this->symfony = $symfony; - } - - public function setDummyDate(\DateTime $dummyDate) - { - $this->dummyDate = $dummyDate; - } - - public function getDummyDate() - { - return $this->dummyDate; - } - - public function isDummyBoolean(): ?bool - { - return $this->dummyBoolean; - } - - /** - * @param bool $dummyBoolean - */ - public function setDummyBoolean($dummyBoolean) - { - $this->dummyBoolean = $dummyBoolean; - } - - public function getThirdLevel(): ?ThirdLevel - { - return $this->thirdLevel; - } - - public function setThirdLevel(ThirdLevel $thirdLevel = null) - { - $this->thirdLevel = $thirdLevel; - } - - /** - * Get relatedToDummyFriend. - * - * @return Collection - */ - public function getRelatedToDummyFriend(): Collection - { - return $this->relatedToDummyFriend; - } - - /** - * Set relatedToDummyFriend. - * - * @param RelatedToDummyFriend $relatedToDummyFriend the value to set - */ - public function addRelatedToDummyFriend(RelatedToDummyFriend $relatedToDummyFriend) - { - $this->relatedToDummyFriend->add($relatedToDummyFriend); - } - - public function getEmbeddedDummy(): EmbeddableDummy - { - return $this->embeddedDummy; - } - - public function setEmbeddedDummy(EmbeddableDummy $embeddedDummy) - { - $this->embeddedDummy = $embeddedDummy; - } -} diff --git a/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php b/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php new file mode 100644 index 00000000000..c7f3fb76049 --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; + +use ApiPlatform\Core\Annotation\ApiFilter; +use ApiPlatform\Core\Annotation\ApiProperty; +use ApiPlatform\Core\Annotation\ApiResource; +use ApiPlatform\Core\Annotation\ApiSubresource; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; + +/** + * @ApiResource + */ +#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])] +class ResourceAnnotationAndSubresourceAttribute +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column(type: 'integer')] + #[Groups(['chicago', 'friends'])] + #[ApiProperty(writable: false)] + #[ApiFilter(DateFilter::class)] + private $id; + + #[ORM\Column(type: 'string')] + #[Groups(['barcelona', 'chicago', 'friends'])] + #[ApiSubresource] + #[ApiProperty(iri: 'RelatedDummy.name')] + #[ApiFilter(SearchFilter::class)] + #[ApiFilter(ExistsFilter::class)] + private $name; +} diff --git a/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php b/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php new file mode 100644 index 00000000000..4107077773a --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; + +use ApiPlatform\Core\Annotation\ApiFilter; +use ApiPlatform\Core\Annotation\ApiProperty; +use ApiPlatform\Core\Annotation\ApiResource; +use ApiPlatform\Core\Annotation\ApiSubresource; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; + +/** + * @ApiFilter(SearchFilter::class, properties={"id"}) + */ +#[ApiResource()] +class ResourceAttributeAndSubresourceAnnotation +{ + /** + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + * @Groups({"chicago", "friends"}) + * @ApiProperty(writable=false) + * @ApiFilter(DateFilter::class) + */ + private $id; + + /** + * @ORM\Column(type="string") + * @Groups({"barcelona", "chicago", "friends"}) + * + * @ApiSubresource + * + * @ApiProperty(iri="RelatedDummy.name") + * @ApiFilter(SearchFilter::class) + * @ApiFilter(ExistsFilter::class) + */ + private $name; +} From bf82888f72f8b16ac866bc5ccc185608adba8066 Mon Sep 17 00:00:00 2001 From: Davy Beauzil Date: Thu, 6 Oct 2022 12:58:56 +0200 Subject: [PATCH 4/7] fix: re-adding of deleted fixture --- .../TestBundle/Entity/RelatedDummy.php | 210 ++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 tests/Fixtures/TestBundle/Entity/RelatedDummy.php diff --git a/tests/Fixtures/TestBundle/Entity/RelatedDummy.php b/tests/Fixtures/TestBundle/Entity/RelatedDummy.php new file mode 100644 index 00000000000..786a23e40a6 --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/RelatedDummy.php @@ -0,0 +1,210 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; + +use ApiPlatform\Core\Annotation\ApiFilter; +use ApiPlatform\Core\Annotation\ApiProperty; +use ApiPlatform\Core\Annotation\ApiResource; +use ApiPlatform\Core\Annotation\ApiSubresource; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; +use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; +use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; +use Symfony\Component\Validator\Constraints as Assert; + +/** + * Related Dummy. + * + * @author Kévin Dunglas + * + * @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"}}) + * @ORM\Entity + * @ApiFilter(SearchFilter::class, properties={"id"}) + */ +class RelatedDummy extends ParentDummy +{ + /** + * @ApiProperty(writable=false) + * + * @ApiSubresource + * + * @ORM\Column(type="integer") + * @ORM\Id + * @ORM\GeneratedValue(strategy="AUTO") + * @Groups({"chicago", "friends"}) + */ + private $id; + + /** + * @var string|null A name + * + * @ApiProperty(iri="RelatedDummy.name") + * @ORM\Column(nullable=true) + * @Groups({"friends"}) + */ + public $name; + + /** + * @ApiProperty(attributes={"deprecation_reason"="This property is deprecated for upgrade test"}) + * @ORM\Column + * @Groups({"barcelona", "chicago", "friends"}) + * @ApiFilter(SearchFilter::class) + * @ApiFilter(ExistsFilter::class) + */ + protected $symfony = 'symfony'; + + /** + * @var \DateTime|null A dummy date + * + * @ORM\Column(type="datetime", nullable=true) + * @Assert\DateTime + * @Groups({"friends"}) + * @ApiFilter(DateFilter::class) + */ + public $dummyDate; + + /** + * @ApiSubresource + * + * @ORM\ManyToOne(targetEntity="ThirdLevel", cascade={"persist"}) + * @Groups({"barcelona", "chicago", "friends"}) + */ + public $thirdLevel; + + /** + * @ApiSubresource + * + * @ORM\OneToMany(targetEntity="RelatedToDummyFriend", cascade={"persist"}, mappedBy="relatedDummy") + * @Groups({"fakemanytomany", "friends"}) + */ + public $relatedToDummyFriend; + + /** + * @var bool|null A dummy bool + * + * @ORM\Column(type="boolean", nullable=true) + * @Groups({"friends"}) + */ + public $dummyBoolean; + + /** + * @var EmbeddableDummy + * + * @ORM\Embedded(class="EmbeddableDummy") + * @Groups({"friends"}) + */ + public $embeddedDummy; + + public function __construct() + { + $this->relatedToDummyFriend = new ArrayCollection(); + $this->embeddedDummy = new EmbeddableDummy(); + } + + public function getId() + { + return $this->id; + } + + public function setId($id) + { + $this->id = $id; + } + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function getSymfony() + { + return $this->symfony; + } + + public function setSymfony($symfony) + { + $this->symfony = $symfony; + } + + public function setDummyDate(\DateTime $dummyDate) + { + $this->dummyDate = $dummyDate; + } + + public function getDummyDate() + { + return $this->dummyDate; + } + + public function isDummyBoolean(): ?bool + { + return $this->dummyBoolean; + } + + /** + * @param bool $dummyBoolean + */ + public function setDummyBoolean($dummyBoolean) + { + $this->dummyBoolean = $dummyBoolean; + } + + public function getThirdLevel(): ?ThirdLevel + { + return $this->thirdLevel; + } + + public function setThirdLevel(ThirdLevel $thirdLevel = null) + { + $this->thirdLevel = $thirdLevel; + } + + /** + * Get relatedToDummyFriend. + * + * @return Collection + */ + public function getRelatedToDummyFriend(): Collection + { + return $this->relatedToDummyFriend; + } + + /** + * Set relatedToDummyFriend. + * + * @param RelatedToDummyFriend $relatedToDummyFriend the value to set + */ + public function addRelatedToDummyFriend(RelatedToDummyFriend $relatedToDummyFriend) + { + $this->relatedToDummyFriend->add($relatedToDummyFriend); + } + + public function getEmbeddedDummy(): EmbeddableDummy + { + return $this->embeddedDummy; + } + + public function setEmbeddedDummy(EmbeddableDummy $embeddedDummy) + { + $this->embeddedDummy = $embeddedDummy; + } +} From 3ad1f531af7b0b1c378599b6679b6ee04fe5a827 Mon Sep 17 00:00:00 2001 From: Davy Beauzil Date: Thu, 6 Oct 2022 15:33:43 +0200 Subject: [PATCH 5/7] chore: corrections to pass CI tests --- .../Command/UpgradeApiResourceCommandTest.php | 8 +++--- .../TestBundle/Entity/OnlyAnnotation.php | 24 +++++++++++++++++ .../TestBundle/Entity/OnlyAttribute.php | 26 +++++++++++++++++++ ...ourceAnnotationAndSubresourceAttribute.php | 26 +++++++++++++++++++ ...ourceAttributeAndSubresourceAnnotation.php | 24 +++++++++++++++++ 5 files changed, 104 insertions(+), 4 deletions(-) diff --git a/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php b/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php index e19397e78fd..4c5d4bbede6 100644 --- a/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php +++ b/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php @@ -118,7 +118,7 @@ public function debugResourceProvider(): array '- * @ApiProperty(iri="RelatedDummy.name")', "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", '- * @ApiFilter(SearchFilter::class)', - '- * @ApiFilter(ExistsFilter::class)', + '- * @ApiFilter(ExistsFilter::class)' ); } if (OnlyAttribute::class === $entityClass) { @@ -130,7 +130,7 @@ public function debugResourceProvider(): array "- #[ApiProperty(iri: 'RelatedDummy.name')]", "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", '- #[ApiFilter(SearchFilter::class)]', - '- #[ApiFilter(ExistsFilter::class)]', + '- #[ApiFilter(ExistsFilter::class)]' ); } if (ResourceAnnotationAndSubresourceAttribute::class === $entityClass) { @@ -142,7 +142,7 @@ public function debugResourceProvider(): array "- #[ApiProperty(iri: 'RelatedDummy.name')]", "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", '- #[ApiFilter(SearchFilter::class)]', - '- #[ApiFilter(ExistsFilter::class)]', + '- #[ApiFilter(ExistsFilter::class)]' ); } if (ResourceAttributeAndSubresourceAnnotation::class === $entityClass) { @@ -157,7 +157,7 @@ public function debugResourceProvider(): array "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", '- * @ApiProperty(iri="RelatedDummy.name")', '- * @ApiFilter(SearchFilter::class)', - '- * @ApiFilter(ExistsFilter::class)', + '- * @ApiFilter(ExistsFilter::class)' ); } diff --git a/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php b/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php index 404d9247b7a..7a2e026c05a 100644 --- a/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php +++ b/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php @@ -31,6 +31,8 @@ class OnlyAnnotation { /** + * @var int + * * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") @@ -41,6 +43,8 @@ class OnlyAnnotation private $id; /** + * @var RelatedDummy + * * @ORM\Column(type="string") * @Groups({"barcelona", "chicago", "friends"}) * @@ -51,4 +55,24 @@ class OnlyAnnotation * @ApiFilter(ExistsFilter::class) */ private $name; + + public function getId(): int + { + return $this->id; + } + + public function setId(int $id): void + { + $this->id = $id; + } + + public function getName(): RelatedDummy + { + return $this->name; + } + + public function setName(RelatedDummy $name): void + { + $this->name = $name; + } } diff --git a/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php b/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php index 439c705ed03..402cb70e3cf 100644 --- a/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php +++ b/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php @@ -27,6 +27,9 @@ #[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])] class OnlyAttribute { + /** + * @var int + */ #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] @@ -35,6 +38,9 @@ class OnlyAttribute #[ApiFilter(DateFilter::class)] private $id; + /** + * @var RelatedDummy + */ #[ORM\Column(type: 'string')] #[Groups(['barcelona', 'chicago', 'friends'])] #[ApiSubresource] @@ -42,4 +48,24 @@ class OnlyAttribute #[ApiFilter(SearchFilter::class)] #[ApiFilter(ExistsFilter::class)] private $name; + + public function getId(): int + { + return $this->id; + } + + public function setId(int $id): void + { + $this->id = $id; + } + + public function getName(): RelatedDummy + { + return $this->name; + } + + public function setName(RelatedDummy $name): void + { + $this->name = $name; + } } diff --git a/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php b/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php index c7f3fb76049..54bd4ec6db7 100644 --- a/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php +++ b/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php @@ -29,6 +29,9 @@ #[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])] class ResourceAnnotationAndSubresourceAttribute { + /** + * @var int + */ #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] @@ -37,6 +40,9 @@ class ResourceAnnotationAndSubresourceAttribute #[ApiFilter(DateFilter::class)] private $id; + /** + * @var RelatedDummy + */ #[ORM\Column(type: 'string')] #[Groups(['barcelona', 'chicago', 'friends'])] #[ApiSubresource] @@ -44,4 +50,24 @@ class ResourceAnnotationAndSubresourceAttribute #[ApiFilter(SearchFilter::class)] #[ApiFilter(ExistsFilter::class)] private $name; + + public function getId(): int + { + return $this->id; + } + + public function setId(int $id): void + { + $this->id = $id; + } + + public function getName(): RelatedDummy + { + return $this->name; + } + + public function setName(RelatedDummy $name): void + { + $this->name = $name; + } } diff --git a/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php b/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php index 4107077773a..5f94063aac9 100644 --- a/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php +++ b/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php @@ -30,6 +30,8 @@ class ResourceAttributeAndSubresourceAnnotation { /** + * @var int + * * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") @@ -40,6 +42,8 @@ class ResourceAttributeAndSubresourceAnnotation private $id; /** + * @var RelatedDummy + * * @ORM\Column(type="string") * @Groups({"barcelona", "chicago", "friends"}) * @@ -50,4 +54,24 @@ class ResourceAttributeAndSubresourceAnnotation * @ApiFilter(ExistsFilter::class) */ private $name; + + public function getId(): int + { + return $this->id; + } + + public function setId(int $id): void + { + $this->id = $id; + } + + public function getName(): RelatedDummy + { + return $this->name; + } + + public function setName(RelatedDummy $name): void + { + $this->name = $name; + } } From d4516ccb1b931de3163562497b897133cf2c2221 Mon Sep 17 00:00:00 2001 From: Davy Beauzil Date: Wed, 19 Oct 2022 15:19:53 +0200 Subject: [PATCH 6/7] chore: corrections to pass CI tests --- .../Command/UpgradeApiResourceCommandTest.php | 94 ++++++------------- .../Entity/DummyToUpgradeProduct.php | 46 +++++++++ ...p => DummyToUpgradeWithOnlyAnnotation.php} | 36 ++----- .../DummyToUpgradeWithOnlyAttribute.php | 47 ++++++++++ .../TestBundle/Entity/OnlyAttribute.php | 71 -------------- ...ourceAnnotationAndSubresourceAttribute.php | 73 -------------- ...ourceAttributeAndSubresourceAnnotation.php | 77 --------------- 7 files changed, 130 insertions(+), 314 deletions(-) create mode 100644 tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php rename tests/Fixtures/TestBundle/Entity/{OnlyAnnotation.php => DummyToUpgradeWithOnlyAnnotation.php} (71%) create mode 100644 tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php delete mode 100644 tests/Fixtures/TestBundle/Entity/OnlyAttribute.php delete mode 100644 tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php delete mode 100644 tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php diff --git a/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php b/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php index 4c5d4bbede6..6e54aa91755 100644 --- a/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php +++ b/tests/Core/Bridge/Symfony/Bundle/Command/UpgradeApiResourceCommandTest.php @@ -22,10 +22,8 @@ use ApiPlatform\Core\Upgrade\SubresourceTransformer; use ApiPlatform\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface; use ApiPlatform\Metadata\Resource\ResourceNameCollection; -use ApiPlatform\Tests\Fixtures\TestBundle\Entity\OnlyAnnotation; -use ApiPlatform\Tests\Fixtures\TestBundle\Entity\OnlyAttribute; -use ApiPlatform\Tests\Fixtures\TestBundle\Entity\ResourceAnnotationAndSubresourceAttribute; -use ApiPlatform\Tests\Fixtures\TestBundle\Entity\ResourceAttributeAndSubresourceAnnotation; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyToUpgradeWithOnlyAnnotation; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyToUpgradeWithOnlyAttribute; use Doctrine\Common\Annotations\AnnotationReader; use PHPUnit\Framework\TestCase; use Symfony\Component\Console\Application; @@ -64,22 +62,6 @@ public function testDebugResource(string $entityClass, array $subresourceOperati $subresourceOperationFactoryProphecy = $this->prophesize(SubresourceOperationFactoryInterface::class); $subresourceOperationFactoryProphecy->create($entityClass)->willReturn($subresourceOperationFactoryReturn); - $expectedStrings = array_merge($expectedStrings, [ - '-use ApiPlatform\\Core\\Annotation\\ApiSubresource', - '-use ApiPlatform\\Core\\Annotation\\ApiProperty', - '-use ApiPlatform\\Core\\Annotation\\ApiResource', - '-use ApiPlatform\\Core\\Annotation\\ApiFilter', - '-use ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Filter\\SearchFilter;', - '-use ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Filter\\ExistsFilter;', - '-use ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Filter\\DateFilter;', - '+use ApiPlatform\\Metadata\\ApiProperty', - '+use ApiPlatform\\Metadata\\ApiResource', - '+use ApiPlatform\\Metadata\\ApiFilter', - '+use ApiPlatform\\Doctrine\\Orm\\Filter\\SearchFilter', - '+use ApiPlatform\\Doctrine\\Orm\\Filter\\ExistsFilter', - '+use ApiPlatform\\Doctrine\\Orm\\Filter\\DateFilter', - '+use ApiPlatform\\Metadata\\Get', ] - ); $commandTester = $this->getCommandTester($resourceNameCollectionFactoryProphecy->reveal(), $resourceMetadataFactoryProphecy->reveal(), $subresourceOperationFactoryProphecy->reveal()); $commandTester->execute([]); @@ -92,22 +74,32 @@ public function testDebugResource(string $entityClass, array $subresourceOperati public function debugResourceProvider(): array { $entityClasses = [ - 'only_annotation' => OnlyAnnotation::class, - 'only_attribute' => OnlyAttribute::class, - 'resource_attribute_and_subresource_annotation' => ResourceAttributeAndSubresourceAnnotation::class, - 'resource_annotation_and_subresource_attribute' => ResourceAnnotationAndSubresourceAttribute::class, + 'only_annotation' => DummyToUpgradeWithOnlyAnnotation::class, + 'only_attribute' => DummyToUpgradeWithOnlyAttribute::class, ]; return array_map(function ($key, $entityClass) { $expectedStrings = [ '+#[ApiResource]', + '-use ApiPlatform\\Core\\Annotation\\ApiSubresource', + '-use ApiPlatform\\Core\\Annotation\\ApiProperty', + '-use ApiPlatform\\Core\\Annotation\\ApiResource', + '+use ApiPlatform\\Metadata\\ApiProperty', + '+use ApiPlatform\\Metadata\\ApiResource', + '+use ApiPlatform\\Metadata\\ApiFilter', + '+use ApiPlatform\\Metadata\\Get', sprintf("#[ApiResource(uriTemplate: '/%s/{id}/name.{_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()])]", $key), - '+ #[ApiFilter(filterClass: SearchFilter::class)]', - '+ #[ApiFilter(filterClass: ExistsFilter::class)]', - '+ #[ApiFilter(filterClass: DateFilter::class)]', ]; - if (OnlyAnnotation::class === $entityClass) { + + if (DummyToUpgradeWithOnlyAnnotation::class === $entityClass) { array_push($expectedStrings, + '+use ApiPlatform\\Doctrine\\Orm\\Filter\\SearchFilter', + '+use ApiPlatform\\Doctrine\\Orm\\Filter\\ExistsFilter', + '+use ApiPlatform\\Doctrine\\Orm\\Filter\\DateFilter', + '-use ApiPlatform\\Core\\Annotation\\ApiFilter', + '-use ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Filter\\SearchFilter;', + '-use ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Filter\\ExistsFilter;', + '-use ApiPlatform\\Core\\Bridge\\Doctrine\\Orm\\Filter\\DateFilter;', '- * @ApiResource', '- * @ApiFilter(SearchFilter::class, properties={"id"})', "+#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])]", @@ -115,49 +107,23 @@ public function debugResourceProvider(): array '+ #[ApiProperty(writable: false)]', '- * @ApiSubresource', '- * @ApiFilter(DateFilter::class)', - '- * @ApiProperty(iri="RelatedDummy.name")', - "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", + '- * @ApiProperty(iri="DummyToUpgradeWithOnlyAnnotation.dummyToUpgradeProduct")', + "+ #[ApiProperty(iris: ['DummyToUpgradeWithOnlyAnnotation.dummyToUpgradeProduct'])]", '- * @ApiFilter(SearchFilter::class)', - '- * @ApiFilter(ExistsFilter::class)' + '- * @ApiFilter(ExistsFilter::class)', + '+ #[ApiFilter(filterClass: SearchFilter::class)]', + '+ #[ApiFilter(filterClass: ExistsFilter::class)]', + '+ #[ApiFilter(filterClass: DateFilter::class)]' ); } - if (OnlyAttribute::class === $entityClass) { + + if (DummyToUpgradeWithOnlyAttribute::class === $entityClass) { array_push($expectedStrings, '-#[ApiResource()]', "+#[ApiResource(uriTemplate: '/only_attribute/{id}/name.{_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()])]", - '- #[ApiFilter(DateFilter::class)]', '- #[ApiSubresource]', - "- #[ApiProperty(iri: 'RelatedDummy.name')]", - "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", - '- #[ApiFilter(SearchFilter::class)]', - '- #[ApiFilter(ExistsFilter::class)]' - ); - } - if (ResourceAnnotationAndSubresourceAttribute::class === $entityClass) { - array_push($expectedStrings, - '- * @ApiResource', - "+#[ApiResource(uriTemplate: '/resource_annotation_and_subresource_attribute/{id}/name.{_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()])]", - '- #[ApiFilter(DateFilter::class)]', - '- #[ApiSubresource]', - "- #[ApiProperty(iri: 'RelatedDummy.name')]", - "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", - '- #[ApiFilter(SearchFilter::class)]', - '- #[ApiFilter(ExistsFilter::class)]' - ); - } - if (ResourceAttributeAndSubresourceAnnotation::class === $entityClass) { - array_push($expectedStrings, - '-#[ApiResource()]', - '- * @ApiFilter(SearchFilter::class, properties={"id"})', - "+#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])]", - '- * @ApiProperty(writable=false)', - '+ #[ApiProperty(writable: false)]', - '- * @ApiFilter(DateFilter::class)', - '- * @ApiSubresource', - "+ #[ApiProperty(iris: ['RelatedDummy.name'])]", - '- * @ApiProperty(iri="RelatedDummy.name")', - '- * @ApiFilter(SearchFilter::class)', - '- * @ApiFilter(ExistsFilter::class)' + "- #[ApiProperty(iri: 'DummyToUpgradeWithOnlyAttribute.dummyToUpgradeProduct')]", + "+ #[ApiProperty(iris: ['DummyToUpgradeWithOnlyAttribute.dummyToUpgradeProduct'])]" ); } diff --git a/tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php new file mode 100644 index 00000000000..caed0c42795 --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; + +use ApiPlatform\Core\Annotation\ApiResource; +use Doctrine\Common\Collections\Collection; +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Entity + * @ApiResource + */ +class DummyToUpgradeProduct +{ + /** + * @var int + * + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + private $id; + + /** + * @var Collection + * @ORM\OneToMany(mappedBy="dummyToUpgradeProduct", targetEntity=DummyToUpgradeWithOnlyAnnotation::class) + */ + private $dummysToUpgradeWithOnlyAnnotation; + + /** + * @var Collection + * @ORM\OneToMany(mappedBy="dummyToUpgradeProduct", targetEntity=DummyToUpgradeWithOnlyAttribute::class) + */ + private $dummysToUpgradeWithOnlyAttribute; +} diff --git a/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAnnotation.php similarity index 71% rename from tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php rename to tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAnnotation.php index 7a2e026c05a..134fe123fef 100644 --- a/tests/Fixtures/TestBundle/Entity/OnlyAnnotation.php +++ b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAnnotation.php @@ -24,11 +24,11 @@ use Symfony\Component\Serializer\Annotation\Groups; /** + * @ORM\Entity * @ApiResource - * * @ApiFilter(SearchFilter::class, properties={"id"}) */ -class OnlyAnnotation +class DummyToUpgradeWithOnlyAnnotation { /** * @var int @@ -43,36 +43,14 @@ class OnlyAnnotation private $id; /** - * @var RelatedDummy - * - * @ORM\Column(type="string") + * @var DummyToUpgradeProduct + * @ORM\ManyToOne(targetEntity="DummyToUpgradeProduct", cascade={"persist"}, inversedBy="dummysToUpgradeWithOnlyAnnotation") + * @ORM\JoinColumn(nullable=false) * @Groups({"barcelona", "chicago", "friends"}) - * * @ApiSubresource - * - * @ApiProperty(iri="RelatedDummy.name") + * @ApiProperty(iri="DummyToUpgradeWithOnlyAnnotation.dummyToUpgradeProduct") * @ApiFilter(SearchFilter::class) * @ApiFilter(ExistsFilter::class) */ - private $name; - - public function getId(): int - { - return $this->id; - } - - public function setId(int $id): void - { - $this->id = $id; - } - - public function getName(): RelatedDummy - { - return $this->name; - } - - public function setName(RelatedDummy $name): void - { - $this->name = $name; - } + private $dummyToUpgradeProduct; } diff --git a/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php new file mode 100644 index 00000000000..3047f80d8d9 --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; + +use ApiPlatform\Core\Annotation\ApiProperty; +use ApiPlatform\Core\Annotation\ApiResource; +use ApiPlatform\Core\Annotation\ApiSubresource; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Serializer\Annotation\Groups; + +/** + * @ORM\Entity + */ +#[ApiResource()] +class DummyToUpgradeWithOnlyAttribute +{ + /** + * @var int + * @ORM\Id + * @ORM\GeneratedValue + * @ORM\Column(type="integer") + */ + #[Groups(['chicago', 'friends'])] + #[ApiProperty(writable: false)] + private $id; + + /** + * @var DummyToUpgradeProduct + * @ORM\ManyToOne(targetEntity="DummyToUpgradeProduct", inversedBy="dummysToUpgradeWithOnlyAttribute") + * @ORM\JoinColumn(nullable=false) + */ + #[Groups(['barcelona', 'chicago', 'friends'])] + #[ApiSubresource] + #[ApiProperty(iri: 'DummyToUpgradeWithOnlyAttribute.dummyToUpgradeProduct')] + private $dummyToUpgradeProduct; +} diff --git a/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php b/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php deleted file mode 100644 index 402cb70e3cf..00000000000 --- a/tests/Fixtures/TestBundle/Entity/OnlyAttribute.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; - -use ApiPlatform\Core\Annotation\ApiFilter; -use ApiPlatform\Core\Annotation\ApiProperty; -use ApiPlatform\Core\Annotation\ApiResource; -use ApiPlatform\Core\Annotation\ApiSubresource; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; -use Doctrine\ORM\Mapping as ORM; -use Symfony\Component\Serializer\Annotation\Groups; - -#[ApiResource()] -#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])] -class OnlyAttribute -{ - /** - * @var int - */ - #[ORM\Id] - #[ORM\GeneratedValue] - #[ORM\Column(type: 'integer')] - #[Groups(['chicago', 'friends'])] - #[ApiProperty(writable: false)] - #[ApiFilter(DateFilter::class)] - private $id; - - /** - * @var RelatedDummy - */ - #[ORM\Column(type: 'string')] - #[Groups(['barcelona', 'chicago', 'friends'])] - #[ApiSubresource] - #[ApiProperty(iri: 'RelatedDummy.name')] - #[ApiFilter(SearchFilter::class)] - #[ApiFilter(ExistsFilter::class)] - private $name; - - public function getId(): int - { - return $this->id; - } - - public function setId(int $id): void - { - $this->id = $id; - } - - public function getName(): RelatedDummy - { - return $this->name; - } - - public function setName(RelatedDummy $name): void - { - $this->name = $name; - } -} diff --git a/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php b/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php deleted file mode 100644 index 54bd4ec6db7..00000000000 --- a/tests/Fixtures/TestBundle/Entity/ResourceAnnotationAndSubresourceAttribute.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; - -use ApiPlatform\Core\Annotation\ApiFilter; -use ApiPlatform\Core\Annotation\ApiProperty; -use ApiPlatform\Core\Annotation\ApiResource; -use ApiPlatform\Core\Annotation\ApiSubresource; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; -use Doctrine\ORM\Mapping as ORM; -use Symfony\Component\Serializer\Annotation\Groups; - -/** - * @ApiResource - */ -#[ApiFilter(filterClass: SearchFilter::class, properties: ['id'])] -class ResourceAnnotationAndSubresourceAttribute -{ - /** - * @var int - */ - #[ORM\Id] - #[ORM\GeneratedValue] - #[ORM\Column(type: 'integer')] - #[Groups(['chicago', 'friends'])] - #[ApiProperty(writable: false)] - #[ApiFilter(DateFilter::class)] - private $id; - - /** - * @var RelatedDummy - */ - #[ORM\Column(type: 'string')] - #[Groups(['barcelona', 'chicago', 'friends'])] - #[ApiSubresource] - #[ApiProperty(iri: 'RelatedDummy.name')] - #[ApiFilter(SearchFilter::class)] - #[ApiFilter(ExistsFilter::class)] - private $name; - - public function getId(): int - { - return $this->id; - } - - public function setId(int $id): void - { - $this->id = $id; - } - - public function getName(): RelatedDummy - { - return $this->name; - } - - public function setName(RelatedDummy $name): void - { - $this->name = $name; - } -} diff --git a/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php b/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php deleted file mode 100644 index 5f94063aac9..00000000000 --- a/tests/Fixtures/TestBundle/Entity/ResourceAttributeAndSubresourceAnnotation.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -declare(strict_types=1); - -namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; - -use ApiPlatform\Core\Annotation\ApiFilter; -use ApiPlatform\Core\Annotation\ApiProperty; -use ApiPlatform\Core\Annotation\ApiResource; -use ApiPlatform\Core\Annotation\ApiSubresource; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\ExistsFilter; -use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter; -use Doctrine\ORM\Mapping as ORM; -use Symfony\Component\Serializer\Annotation\Groups; - -/** - * @ApiFilter(SearchFilter::class, properties={"id"}) - */ -#[ApiResource()] -class ResourceAttributeAndSubresourceAnnotation -{ - /** - * @var int - * - * @ORM\Id - * @ORM\GeneratedValue - * @ORM\Column(type="integer") - * @Groups({"chicago", "friends"}) - * @ApiProperty(writable=false) - * @ApiFilter(DateFilter::class) - */ - private $id; - - /** - * @var RelatedDummy - * - * @ORM\Column(type="string") - * @Groups({"barcelona", "chicago", "friends"}) - * - * @ApiSubresource - * - * @ApiProperty(iri="RelatedDummy.name") - * @ApiFilter(SearchFilter::class) - * @ApiFilter(ExistsFilter::class) - */ - private $name; - - public function getId(): int - { - return $this->id; - } - - public function setId(int $id): void - { - $this->id = $id; - } - - public function getName(): RelatedDummy - { - return $this->name; - } - - public function setName(RelatedDummy $name): void - { - $this->name = $name; - } -} From c2e204c7b5387537a25dec2d51d7ede92a303543 Mon Sep 17 00:00:00 2001 From: Davy Beauzil Date: Wed, 19 Oct 2022 16:09:34 +0200 Subject: [PATCH 7/7] chore: run php-cs-fixer --- tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php | 3 +++ .../TestBundle/Entity/DummyToUpgradeWithOnlyAnnotation.php | 5 +++++ .../TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php | 2 ++ 3 files changed, 10 insertions(+) diff --git a/tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php index caed0c42795..cabc7a4352c 100644 --- a/tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php +++ b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeProduct.php @@ -19,6 +19,7 @@ /** * @ORM\Entity + * * @ApiResource */ class DummyToUpgradeProduct @@ -34,12 +35,14 @@ class DummyToUpgradeProduct /** * @var Collection + * * @ORM\OneToMany(mappedBy="dummyToUpgradeProduct", targetEntity=DummyToUpgradeWithOnlyAnnotation::class) */ private $dummysToUpgradeWithOnlyAnnotation; /** * @var Collection + * * @ORM\OneToMany(mappedBy="dummyToUpgradeProduct", targetEntity=DummyToUpgradeWithOnlyAttribute::class) */ private $dummysToUpgradeWithOnlyAttribute; diff --git a/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAnnotation.php b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAnnotation.php index 134fe123fef..576ca2a55f0 100644 --- a/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAnnotation.php +++ b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAnnotation.php @@ -25,7 +25,9 @@ /** * @ORM\Entity + * * @ApiResource + * * @ApiFilter(SearchFilter::class, properties={"id"}) */ class DummyToUpgradeWithOnlyAnnotation @@ -44,10 +46,13 @@ class DummyToUpgradeWithOnlyAnnotation /** * @var DummyToUpgradeProduct + * * @ORM\ManyToOne(targetEntity="DummyToUpgradeProduct", cascade={"persist"}, inversedBy="dummysToUpgradeWithOnlyAnnotation") * @ORM\JoinColumn(nullable=false) * @Groups({"barcelona", "chicago", "friends"}) + * * @ApiSubresource + * * @ApiProperty(iri="DummyToUpgradeWithOnlyAnnotation.dummyToUpgradeProduct") * @ApiFilter(SearchFilter::class) * @ApiFilter(ExistsFilter::class) diff --git a/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php index 3047f80d8d9..f9a1fd1f592 100644 --- a/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php +++ b/tests/Fixtures/TestBundle/Entity/DummyToUpgradeWithOnlyAttribute.php @@ -27,6 +27,7 @@ class DummyToUpgradeWithOnlyAttribute { /** * @var int + * * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") @@ -37,6 +38,7 @@ class DummyToUpgradeWithOnlyAttribute /** * @var DummyToUpgradeProduct + * * @ORM\ManyToOne(targetEntity="DummyToUpgradeProduct", inversedBy="dummysToUpgradeWithOnlyAttribute") * @ORM\JoinColumn(nullable=false) */