From 315253589ef3f43bdc0b0be2edbe02cfac5e85a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 29 Sep 2021 11:32:23 +0200 Subject: [PATCH] create api endpoint for duplciating address --- .../Controller/AddressApiController.php | 38 ++++++++++++++ .../ChillMainExtension.php | 2 + src/Bundle/ChillMainBundle/Entity/Address.php | 18 +++++-- .../Repository/AddressRepository.php | 6 +++ .../Controller/AddressControllerTest.php | 49 +++++++++++++++++++ .../ChillMainBundle/chill.api.specs.yaml | 26 ++++++++++ 6 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 src/Bundle/ChillMainBundle/Controller/AddressApiController.php create mode 100644 src/Bundle/ChillMainBundle/Tests/Controller/AddressControllerTest.php diff --git a/src/Bundle/ChillMainBundle/Controller/AddressApiController.php b/src/Bundle/ChillMainBundle/Controller/AddressApiController.php new file mode 100644 index 000000000..5c90cc9a7 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Controller/AddressApiController.php @@ -0,0 +1,38 @@ +denyAccessUnlessGranted('ROLE_USER'); + $new = Address::createFromAddress($address); + + $em = $this->getDoctrine()->getManager(); + + $em->persist($new); + $em->flush(); + + return $this->json($new, Response::HTTP_OK, [], [ + AbstractNormalizer::GROUPS => ['read'] + ]); + + } + +} diff --git a/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php b/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php index f196b8a2b..21217c80e 100644 --- a/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php +++ b/src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php @@ -19,6 +19,7 @@ namespace Chill\MainBundle\DependencyInjection; +use Chill\MainBundle\Controller\AddressApiController; use Chill\MainBundle\Controller\UserController; use Chill\MainBundle\Doctrine\DQL\STContains; use Chill\MainBundle\Doctrine\DQL\StrictWordSimilarityOPS; @@ -319,6 +320,7 @@ class ChillMainExtension extends Extension implements PrependExtensionInterface, 'apis' => [ [ 'class' => \Chill\MainBundle\Entity\Address::class, + 'controller' => AddressApiController::class, 'name' => 'address', 'base_path' => '/api/1.0/main/address', 'base_role' => 'ROLE_USER', diff --git a/src/Bundle/ChillMainBundle/Entity/Address.php b/src/Bundle/ChillMainBundle/Entity/Address.php index 22e4848bf..4cc5c37ba 100644 --- a/src/Bundle/ChillMainBundle/Entity/Address.php +++ b/src/Bundle/ChillMainBundle/Entity/Address.php @@ -376,10 +376,22 @@ class Address public static function createFromAddress(Address $original) : Address { return (new Address()) + ->setBuildingName($original->getBuildingName()) + ->setCorridor($original->getCorridor()) + ->setCustoms($original->getCustoms()) + ->setDistribution($original->getDistribution()) + ->setExtra($original->getExtra()) + ->setFlat($original->getFlat()) + ->setFloor($original->getFloor()) + ->setIsNoAddress($original->getIsNoAddress()) + ->setLinkedToThirdParty($original->getLinkedToThirdParty()) + ->setPoint($original->getPoint()) ->setPostcode($original->getPostcode()) - ->setStreetAddress1($original->getStreetAddress1()) - ->setStreetAddress2($original->getStreetAddress2()) + ->setSteps($original->getSteps()) + ->setStreet($original->getStreet()) + ->setStreetNumber($original->getStreetNumber()) ->setValidFrom($original->getValidFrom()) + ->setValidTo($original->getValidTo()) ; } @@ -506,7 +518,7 @@ class Address return $this->validTo; } - public function setValidTo(\DateTimeInterface $validTo): self + public function setValidTo(?\DateTimeInterface $validTo = null): self { $this->validTo = $validTo; diff --git a/src/Bundle/ChillMainBundle/Repository/AddressRepository.php b/src/Bundle/ChillMainBundle/Repository/AddressRepository.php index 76f6c93bb..08e2da708 100644 --- a/src/Bundle/ChillMainBundle/Repository/AddressRepository.php +++ b/src/Bundle/ChillMainBundle/Repository/AddressRepository.php @@ -7,6 +7,7 @@ namespace Chill\MainBundle\Repository; use Chill\MainBundle\Entity\Address; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; +use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ObjectRepository; final class AddressRepository implements ObjectRepository @@ -47,4 +48,9 @@ final class AddressRepository implements ObjectRepository public function getClassName() { return Address::class; } + + public function createQueryBuilder(string $alias, ?string $indexBy = null): QueryBuilder + { + return $this->repository->createQueryBuilder($alias, $indexBy); + } } diff --git a/src/Bundle/ChillMainBundle/Tests/Controller/AddressControllerTest.php b/src/Bundle/ChillMainBundle/Tests/Controller/AddressControllerTest.php new file mode 100644 index 000000000..2000a05bf --- /dev/null +++ b/src/Bundle/ChillMainBundle/Tests/Controller/AddressControllerTest.php @@ -0,0 +1,49 @@ +client = $this->getClientAuthenticated(); + } + + /** + * @dataProvider generateAddressIds + * @param int $addressId + */ + public function testDuplicate(int $addressId) + { + $this->client->request('POST', "/api/1.0/main/address/$addressId/duplicate.json"); + + $this->assertResponseIsSuccessful('test that duplicate is successful'); + } + + public function generateAddressIds() + { + self::bootKernel(); + $em = self::$container->get(EntityManagerInterface::class); + + $qb = $em->createQueryBuilder(); + $addresses = $qb->select('a')->from(Address::class, 'a') + ->setMaxResults(2) + ->getQuery() + ->getResult(); + + foreach ($addresses as $a) { + yield [ $a->getId() ]; + } + } +} diff --git a/src/Bundle/ChillMainBundle/chill.api.specs.yaml b/src/Bundle/ChillMainBundle/chill.api.specs.yaml index 8ee69e96d..874ae669b 100644 --- a/src/Bundle/ChillMainBundle/chill.api.specs.yaml +++ b/src/Bundle/ChillMainBundle/chill.api.specs.yaml @@ -293,6 +293,32 @@ paths: 401: description: "Unauthorized" + /1.0/main/address/{id}/duplicate.json: + post: + tags: + - address + summary: Duplicate an existing address + parameters: + - name: id + in: path + required: true + description: The address id that will be duplicated + schema: + type: integer + format: integer + minimum: 1 + responses: + 200: + description: "ok" + content: + application/json: + schema: + $ref: '#/components/schemas/Address' + 404: + description: "not found" + 401: + description: "Unauthorized" + /1.0/main/address-reference.json: get: tags: