mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-10-31 09:18:24 +00:00 
			
		
		
		
	create api endpoint for duplciating address
This commit is contained in:
		| @@ -0,0 +1,38 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Chill\MainBundle\Controller; | ||||
|  | ||||
| use Chill\MainBundle\CRUD\Controller\ApiController; | ||||
| use Chill\MainBundle\Entity\Address; | ||||
| use Symfony\Component\HttpFoundation\JsonResponse; | ||||
| use Symfony\Component\HttpFoundation\Response; | ||||
| use Symfony\Component\Routing\Annotation\Route; | ||||
| use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; | ||||
|  | ||||
| class AddressApiController extends ApiController | ||||
| { | ||||
|     /** | ||||
|      * Duplicate an existing address | ||||
|      * | ||||
|      * @Route("/api/1.0/main/address/{id}/duplicate.json", name="chill_api_main_address_duplicate", | ||||
|      *  methods={"POST"}) | ||||
|      * | ||||
|      * @param Address $address | ||||
|      */ | ||||
|     public function duplicate(Address $address): JsonResponse | ||||
|     { | ||||
|         $this->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'] | ||||
|         ]); | ||||
|  | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -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', | ||||
|   | ||||
| @@ -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; | ||||
|  | ||||
|   | ||||
| @@ -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); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,49 @@ | ||||
| <?php | ||||
|  | ||||
| namespace Controller; | ||||
|  | ||||
| use Chill\MainBundle\Entity\Address; | ||||
| use Chill\MainBundle\Repository\AddressRepository; | ||||
| use Chill\MainBundle\Test\PrepareClientTrait; | ||||
| use Doctrine\ORM\EntityManagerInterface; | ||||
| use Symfony\Bundle\FrameworkBundle\KernelBrowser; | ||||
|  | ||||
| class AddressControllerTest extends \Symfony\Bundle\FrameworkBundle\Test\WebTestCase | ||||
| { | ||||
|     private KernelBrowser $client; | ||||
|  | ||||
|     use PrepareClientTrait; | ||||
|  | ||||
|     public function setUp() | ||||
|     { | ||||
|         self::bootKernel(); | ||||
|         $this->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() ]; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -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: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user