mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
create api endpoint for duplciating address
This commit is contained in:
parent
af24637dc4
commit
315253589e
@ -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;
|
namespace Chill\MainBundle\DependencyInjection;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Controller\AddressApiController;
|
||||||
use Chill\MainBundle\Controller\UserController;
|
use Chill\MainBundle\Controller\UserController;
|
||||||
use Chill\MainBundle\Doctrine\DQL\STContains;
|
use Chill\MainBundle\Doctrine\DQL\STContains;
|
||||||
use Chill\MainBundle\Doctrine\DQL\StrictWordSimilarityOPS;
|
use Chill\MainBundle\Doctrine\DQL\StrictWordSimilarityOPS;
|
||||||
@ -319,6 +320,7 @@ class ChillMainExtension extends Extension implements PrependExtensionInterface,
|
|||||||
'apis' => [
|
'apis' => [
|
||||||
[
|
[
|
||||||
'class' => \Chill\MainBundle\Entity\Address::class,
|
'class' => \Chill\MainBundle\Entity\Address::class,
|
||||||
|
'controller' => AddressApiController::class,
|
||||||
'name' => 'address',
|
'name' => 'address',
|
||||||
'base_path' => '/api/1.0/main/address',
|
'base_path' => '/api/1.0/main/address',
|
||||||
'base_role' => 'ROLE_USER',
|
'base_role' => 'ROLE_USER',
|
||||||
|
@ -376,10 +376,22 @@ class Address
|
|||||||
public static function createFromAddress(Address $original) : Address
|
public static function createFromAddress(Address $original) : Address
|
||||||
{
|
{
|
||||||
return (new 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())
|
->setPostcode($original->getPostcode())
|
||||||
->setStreetAddress1($original->getStreetAddress1())
|
->setSteps($original->getSteps())
|
||||||
->setStreetAddress2($original->getStreetAddress2())
|
->setStreet($original->getStreet())
|
||||||
|
->setStreetNumber($original->getStreetNumber())
|
||||||
->setValidFrom($original->getValidFrom())
|
->setValidFrom($original->getValidFrom())
|
||||||
|
->setValidTo($original->getValidTo())
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -506,7 +518,7 @@ class Address
|
|||||||
return $this->validTo;
|
return $this->validTo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setValidTo(\DateTimeInterface $validTo): self
|
public function setValidTo(?\DateTimeInterface $validTo = null): self
|
||||||
{
|
{
|
||||||
$this->validTo = $validTo;
|
$this->validTo = $validTo;
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ namespace Chill\MainBundle\Repository;
|
|||||||
use Chill\MainBundle\Entity\Address;
|
use Chill\MainBundle\Entity\Address;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Doctrine\ORM\EntityRepository;
|
use Doctrine\ORM\EntityRepository;
|
||||||
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Doctrine\Persistence\ObjectRepository;
|
use Doctrine\Persistence\ObjectRepository;
|
||||||
|
|
||||||
final class AddressRepository implements ObjectRepository
|
final class AddressRepository implements ObjectRepository
|
||||||
@ -47,4 +48,9 @@ final class AddressRepository implements ObjectRepository
|
|||||||
public function getClassName() {
|
public function getClassName() {
|
||||||
return Address::class;
|
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:
|
401:
|
||||||
description: "Unauthorized"
|
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:
|
/1.0/main/address-reference.json:
|
||||||
get:
|
get:
|
||||||
tags:
|
tags:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user