Vincent преди 4 месеца
родител
ревизия
df8df21551

+ 1 - 0
config/opentalent/products.yaml

@@ -19,6 +19,7 @@ parameters:
           - FreemiumOrganization
           - FreemiumProfile
           - FreemiumEvent
+          - FreemiumPlace
           - AccessProfile
           - EventCategory
           - PlaceSearchItem

+ 62 - 0
src/ApiResources/Freemium/FreemiumPlace.php

@@ -0,0 +1,62 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\ApiResources\Freemium;
+
+use ApiPlatform\Metadata\ApiProperty;
+use ApiPlatform\Metadata\ApiResource;
+use ApiPlatform\Metadata\Get;
+use App\ApiResources\ApiResourcesInterface;
+use App\Entity\Core\Country;
+use App\Entity\Organization\Organization;
+use App\Entity\Place\Place;
+use App\State\Provider\Freemium\FreemiumPlaceProvider;
+use Symfony\Component\ObjectMapper\Attribute\Map;
+
+/**
+ * Classe resource contient tous les champs pour la gestion d'une place pour un profile Freemium.
+ */
+#[ApiResource(
+    operations: [
+        new Get(
+            uriTemplate: '/freemium/places/{id}',
+            security: '(is_granted("ROLE_USER_FREEMIUM") and (object.organization == user.getOrganization()))',
+        )
+    ],
+    provider: FreemiumPlaceProvider::class,
+)]
+#[Map(source: Place::class)]
+class FreemiumPlace implements ApiResourcesInterface
+{
+    #[ApiProperty(identifier: true)]
+    public ?int $id = null;
+
+    public Organization $organization;
+
+    public string $name;
+
+    #[Map(source: 'addressPostal?.streetAddress')]
+    public ?string $streetAddress = null;
+
+    #[Map(source: 'addressPostal?.streetAddressSecond')]
+    public ?string $streetAddressSecond = null;
+
+    #[Map(source: 'addressPostal?.streetAddressThird')]
+    public ?string $streetAddressThird = null;
+
+    #[Map(source: 'addressPostal?.postalCode')]
+    public ?string $postalCode = null;
+
+    #[Map(source: 'addressPostal?.addressCity')]
+    public ?string $addressCity = null;
+
+    #[Map(source: 'addressPostal?.addressCountry')]
+    public ?Country $addressCountry = null;
+
+    #[Map(source: 'addressPostal?.latitude')]
+    public ?float $latitude = null;
+
+    #[Map(source: 'addressPostal?.longitude')]
+    public ?float $longitude = null;
+}

+ 1 - 5
src/Entity/Place/Place.php

@@ -23,11 +23,7 @@ use Doctrine\ORM\Mapping as ORM;
  * Lieu physique, bâtiment.
  */
 // #[Auditable]
-#[ApiResource(operations: [
-    new GetCollection(
-        security: 'is_granted(\'ROLE_PLACE\', \'ROLE_USER_FREEMIUM\')'
-    )
-])]
+#[ApiResource(operations: [])]
 #[ORM\Entity(repositoryClass: PlaceRepository::class)]
 class Place extends AbstractPlace
 {

+ 77 - 27
src/Service/ApiResourceBuilder/Freemium/FreemiumEventBuilder.php

@@ -15,17 +15,29 @@ class FreemiumEventBuilder
     public function __construct(
         private EntityManagerInterface $em
     )
-    {
-    }
+    {}
 
     /**
      * Mapping des informations.
      *
-     * @param Event         $event         : objet target
+     * @param Event $event : objet target
      * @param FreemiumEvent $freemiumEvent : objet source
      */
     public function mapInformations(Event $event, FreemiumEvent $freemiumEvent): void
     {
+        $this->mapEventInformations( $event, $freemiumEvent);
+        $this->mapEventPlaceInformations( $event, $freemiumEvent);
+    }
+
+    /**
+     * Mapping des informations générales.
+     *
+     * @param Event $event : objet target
+     * @param FreemiumEvent $freemiumEvent : objet source
+     */
+    private function mapEventInformations(Event $event, FreemiumEvent $freemiumEvent): void
+    {
+        //General informations
         $event->setName($freemiumEvent->name);
         $event->setOrganization($freemiumEvent->organization);
         $event->setDatetimeStart($freemiumEvent->datetimeStart);
@@ -38,49 +50,87 @@ class FreemiumEventBuilder
         $event->setPriceMini($freemiumEvent->priceMini);
         $event->setPriceMaxi($freemiumEvent->priceMaxi);
 
+        //Catégories
         $event->removeAllCategories();
-        foreach ($freemiumEvent->categories as $category){
+        foreach ($freemiumEvent->categories as $category) {
             $event->addCategory($category);
         }
+    }
 
-        $event->setPlace($this->getEventPlace($freemiumEvent));
+    /**
+     * Recherche et mapping du lieu de lévénement
+     * @param Event $event
+     * @param FreemiumEvent $freemiumEvent
+     * @return void
+     */
+    private function mapEventPlaceInformations(Event $event, FreemiumEvent $freemiumEvent){
+        $place = $this->getPlace($freemiumEvent);
+        if($place !== null){
+            $this->mapPlaceInformations($place, $freemiumEvent);
+            $this->em->persist($place);
+        }
+        $event->setPlace($place);
     }
 
     /**
+     * Mapping des informations du lieux et de son adresse postale
      * @param FreemiumEvent $freemiumEvent
      * @return Place|array|object[]
      */
-    private function getEventPlace(FreemiumEvent $freemiumEvent){
+    private function mapPlaceInformations(Place $place, FreemiumEvent $freemiumEvent): void
+    {
+        $addressPostal = $this->getAddressPostal($place);
+
+        //Mapping des informations de l'adresse
+        $addressPostal
+            ->setStreetAddress($freemiumEvent->streetAddress)
+            ->setStreetAddressSecond($freemiumEvent->streetAddressSecond)
+            ->setStreetAddressThird($freemiumEvent->streetAddressThird)
+            ->setPostalCode($freemiumEvent->postalCode)
+            ->setAddressCity($freemiumEvent->addressCity)
+            ->setAddressCountry($freemiumEvent->addressCountry)
+            ->setLatitude($freemiumEvent->latitude)
+            ->setLongitude($freemiumEvent->longitude);
+
+        //Mapping des informations du lieu
+        $place
+            ->setName($freemiumEvent->placeName)
+            ->setOrganization($freemiumEvent->organization)
+            ->setAddressPostal($addressPostal);
+    }
 
-        if($freemiumEvent->place){
+    /**
+     * Récupération de la place si définie, sinon on en créer une si un minimum d'information est fournies
+     * @param FreemiumEvent $freemiumEvent
+     * @return Place|null
+     */
+    private function getPlace(FreemiumEvent $freemiumEvent): ?Place
+    {
+        if ($freemiumEvent->place) {
             return $freemiumEvent->place;
-        }else if(
+        } else if (
             $freemiumEvent->placeName ||
             $freemiumEvent->streetAddress ||
             $freemiumEvent->streetAddressSecond ||
             $freemiumEvent->streetAddressThird ||
             $freemiumEvent->postalCode ||
             $freemiumEvent->addressCity
-        )
-        {
-            $place = new Place();
-            $addressPostal = new AddressPostal();
-            $addressPostal
-                ->setStreetAddress($freemiumEvent->streetAddress)
-                ->setStreetAddressSecond($freemiumEvent->streetAddressSecond)
-                ->setStreetAddressThird($freemiumEvent->streetAddressThird)
-                ->setPostalCode($freemiumEvent->postalCode)
-                ->setAddressCity($freemiumEvent->addressCity)
-                ->setAddressCountry($freemiumEvent->addressCountry)
-                ->setLatitude($freemiumEvent->latitude)
-                ->setLongitude($freemiumEvent->longitude)
-            ;
-            $place
-                ->setName($freemiumEvent->placeName)
-                ->setAddressPostal($addressPostal);
+        ) {
+            return new Place();
+        }
+        return null;
+    }
 
-            $this->em->persist($place);
-            return $place;
+    /**
+     * Récupération de l'adresse postale si définie, sinon on en créer une nouvelle.
+     * @param Place $place
+     * @return AddressPostal
+     */
+    private function getAddressPostal(Place $place): AddressPostal
+    {
+        if ($place->getAddressPostal()) {
+            return $place->getAddressPostal();
         }
+        return new AddressPostal();
     }
 }

+ 0 - 5
src/State/Processor/Freemium/FreemiumEventProcessor.php

@@ -6,17 +6,13 @@ namespace App\State\Processor\Freemium;
 
 use ApiPlatform\Metadata\Delete;
 use ApiPlatform\Metadata\Operation;
-use ApiPlatform\Metadata\Patch;
 use ApiPlatform\Metadata\Post;
 use App\ApiResources\Freemium\FreemiumEvent;
-use App\Entity\Access\Access;
 use App\Entity\Booking\Event;
 use App\Repository\Booking\EventRepository;
 use App\Service\ApiResourceBuilder\Freemium\FreemiumEventBuilder;
 use App\State\Processor\EntityProcessor;
 use Doctrine\ORM\EntityManagerInterface;
-use Symfony\Bundle\SecurityBundle\Security;
-use Symfony\Component\HttpFoundation\Response;
 
 /**
  * Classe FreemiumEventProcessor qui est un custom dataPersister gérant la resource FreemiumEvent.
@@ -24,7 +20,6 @@ use Symfony\Component\HttpFoundation\Response;
 class FreemiumEventProcessor extends EntityProcessor
 {
     public function __construct(
-        private Security $security,
         private EntityManagerInterface $entityManager,
         private FreemiumEventBuilder $freemiumEventBuilder,
         private EventRepository $eventRepository,

+ 2 - 2
src/State/Provider/Freemium/FreemiumEventProvider.php

@@ -11,6 +11,7 @@ use ApiPlatform\State\Pagination\TraversablePaginator;
 use ApiPlatform\State\ProviderInterface;
 use ApiPlatform\Metadata\IriConverterInterface;
 use App\ApiResources\Freemium\FreemiumEvent;
+use App\ApiResources\Freemium\FreemiumPlace;
 use App\Entity\Booking\Event;
 use App\Entity\Core\Categories;
 use App\Repository\Booking\EventRepository;
@@ -28,8 +29,7 @@ final class FreemiumEventProvider implements ProviderInterface
         private ProviderUtils $providerUtils,
         private ObjectMapperInterface $objectMapper,
         private EventRepository $eventRepository,
-        private FiltersConfigurationService $filtersConfigurationService,
-        private IriConverterInterface $iriConverter
+        private FiltersConfigurationService $filtersConfigurationService
     ) {
     }
 

+ 60 - 0
src/State/Provider/Freemium/FreemiumPlaceProvider.php

@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\State\Provider\Freemium;
+
+use ApiPlatform\Metadata\GetCollection;
+use ApiPlatform\Metadata\Operation;
+use ApiPlatform\State\Pagination\TraversablePaginator;
+use ApiPlatform\State\ProviderInterface;
+use App\ApiResources\Freemium\FreemiumPlace;
+use App\Entity\Place\Place;
+use App\Repository\Place\PlaceRepository;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\ObjectMapper\ObjectMapperInterface;
+
+/**
+ * Class FreemiumPlaceProvider : custom provider pour assurer l'alimentation de la réponse du GET freemium/places/{id}.
+ */
+final class FreemiumPlaceProvider implements ProviderInterface
+{
+    public function __construct(
+        private ObjectMapperInterface $objectMapper,
+        private PlaceRepository $placeRepository
+    ) {
+    }
+
+    /**
+     * @param array<mixed> $uriVariables
+     * @param array<mixed> $context
+     *
+     * @throws \Doctrine\ORM\Exception\ORMException
+     * @throws \Doctrine\ORM\OptimisticLockException
+     */
+    public function provide(Operation $operation, array $uriVariables = [], array $context = []): TraversablePaginator|FreemiumPlace|null
+    {
+        if ($operation instanceof GetCollection) {
+            throw new \RuntimeException('not supported', Response::HTTP_METHOD_NOT_ALLOWED);
+        }
+        return $this->provideItem($uriVariables, $context);
+    }
+
+    /**
+     * @param array<mixed> $uriVariables
+     * @param array<mixed> $context
+     *
+     * @throws \Doctrine\ORM\Exception\ORMException
+     * @throws \Doctrine\ORM\OptimisticLockException
+     */
+    private function provideItem(array $uriVariables, array $context): ?FreemiumPlace
+    {
+        /** @var Place $place */
+        if(empty($place = $this->placeRepository->find($uriVariables['id']))){
+            throw new NotFoundHttpException('place not found');
+        }
+
+        return $this->objectMapper->map($place, FreemiumPlace::class);
+    }
+}