Browse Source

Merge branch 'feature/freemium-final' into develop

Vincent 4 months ago
parent
commit
4f0b31b3db

+ 0 - 0
public/.htaccess


+ 0 - 0
public/fonts/CaviarDreams/CaviarDreams.ttf


+ 0 - 0
public/fonts/CaviarDreams/CaviarDreams_Bold.ttf


+ 0 - 0
public/fonts/CaviarDreams/CaviarDreams_BoldItalic.ttf


+ 0 - 0
public/fonts/CaviarDreams/CaviarDreams_Italic.ttf


+ 0 - 0
public/images/missing-file.png


+ 0 - 0
public/index.php


+ 1 - 1
src/ApiResources/Freemium/FreemiumEvent.php

@@ -63,7 +63,7 @@ use App\Validator\Constraints as OpentalentAssert;
 #[ApiFilter(filterClass: DateFilter::class, properties: ['datetimeStart'])]
 #[ApiFilter(filterClass: OrderFilter::class, properties: ['datetimeStart'], arguments: ['orderParameterName' => 'order'])]
 #[Map(source: Event::class)]
-#[OpentalentAssert\LessThanField(field: 'datetimeStart', comparedTo: 'datetimeEnd')]
+#[OpentalentAssert\FieldLesserThan(field: 'datetimeStart', comparedTo: 'datetimeEnd')]
 class FreemiumEvent implements ApiResourcesInterface
 {
     #[ApiProperty(identifier: true)]

+ 8 - 2
src/Entity/Booking/Event.php

@@ -93,11 +93,17 @@ class Event extends AbstractBooking
     protected ?string $description;
 
     #[ORM\Column]
-    #[Assert\Regex("/^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/", "url-error")]
+    #[Assert\Url(
+        message: 'url-error',
+        protocols: ['http', 'https']
+    )]
     protected ?string $url = null;
 
     #[ORM\Column]
-    #[Assert\Regex("/^(http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/", "url-ticket-error")]
+    #[Assert\Url(
+        message: 'url-ticket-error',
+        protocols: ['http', 'https']
+    )]
     protected ?string $urlTicket = null;
 
     #[ORM\Column(length: 255, nullable: true, enumType: PricingEventEnum::class)]

+ 5 - 3
src/Service/ApiResourceBuilder/Freemium/FreemiumEventBuilder.php → src/Service/ApiResourceBuilder/Freemium/EventMappingBuilder.php

@@ -10,7 +10,10 @@ use App\Entity\Core\AddressPostal;
 use App\Entity\Place\Place;
 use Doctrine\ORM\EntityManagerInterface;
 
-class FreemiumEventBuilder
+/**
+ * Mapping des informations d'un Event avec comme source un FreemiumEvent
+ */
+class EventMappingBuilder
 {
     public function __construct(
         private EntityManagerInterface $em
@@ -23,11 +26,10 @@ class FreemiumEventBuilder
      * @param Event $event : objet target
      * @param FreemiumEvent $freemiumEvent : objet source
      */
-    public function mapInformations(Event $event, FreemiumEvent $freemiumEvent): FreemiumEvent
+    public function mapInformations(Event $event, FreemiumEvent $freemiumEvent)
     {
         $this->mapEventInformations( $event, $freemiumEvent);
         $this->mapEventPlaceInformations( $event, $freemiumEvent);
-        return $freemiumEvent;
     }
 
     /**

+ 4 - 1
src/Service/ApiResourceBuilder/Freemium/FreemiumOrganizationBuilder.php → src/Service/ApiResourceBuilder/Freemium/OrganizationMappingBuilder.php

@@ -12,7 +12,10 @@ use App\Entity\Organization\OrganizationAddressPostal;
 use App\Enum\Core\ContactPointTypeEnum;
 use App\Enum\Organization\AddressPostalOrganizationTypeEnum;
 
-class FreemiumOrganizationBuilder
+/**
+ * Mapping des informations d'une Organization avec comme source un FreemiumOrganization
+ */
+class OrganizationMappingBuilder
 {
     /**
      * Mapping des informations.

+ 4 - 4
src/State/Provider/ProviderUtils.php → src/Service/State/Provider/ProviderUtils.php

@@ -2,7 +2,7 @@
 
 declare(strict_types=1);
 
-namespace App\State\Provider;
+namespace App\Service\State\Provider;
 
 use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
 use ApiPlatform\Doctrine\Orm\Util\QueryNameGenerator;
@@ -31,9 +31,9 @@ class ProviderUtils
      *
      * @param array<mixed> $context
      */
-    public function applyCollectionExtensionsAndPagination(string $class, Operation $operation, array $context = []): TraversablePaginator
+    public function applyCollectionExtensionsAndPagination(string $entityClass, Operation $operation, array $context = []): TraversablePaginator
     {
-        $qb = $this->em->getRepository($class)->createQueryBuilder('o');
+        $qb = $this->em->getRepository($entityClass)->createQueryBuilder('o');
 
         $queryNameGenerator = new QueryNameGenerator();
 
@@ -42,7 +42,7 @@ class ProviderUtils
                 $extension->applyToCollection(
                     $qb,
                     $queryNameGenerator,
-                    $class,
+                    $entityClass,
                     $operation,
                     $context
                 );

+ 4 - 2
src/State/Processor/Freemium/FreemiumEventProcessor.php

@@ -10,6 +10,7 @@ use ApiPlatform\Metadata\Post;
 use App\ApiResources\Freemium\FreemiumEvent;
 use App\Entity\Booking\Event;
 use App\Repository\Booking\EventRepository;
+use App\Service\ApiResourceBuilder\Freemium\EventMappingBuilder;
 use App\Service\ApiResourceBuilder\Freemium\FreemiumEventBuilder;
 use App\State\Processor\EntityProcessor;
 use Doctrine\Common\Collections\ArrayCollection;
@@ -22,7 +23,7 @@ class FreemiumEventProcessor extends EntityProcessor
 {
     public function __construct(
         private EntityManagerInterface $entityManager,
-        private FreemiumEventBuilder $freemiumEventBuilder,
+        private EventMappingBuilder $eventMappingBuilder,
         private EventRepository $eventRepository,
     ) {
     }
@@ -46,8 +47,9 @@ class FreemiumEventProcessor extends EntityProcessor
             $this->entityManager->remove($event);
             $freemiumEvent = new FreemiumEvent();
         }else{
-            $freemiumEvent = $this->freemiumEventBuilder->mapInformations($event, $data);
+            $this->eventMappingBuilder->mapInformations($event, $data);
             $this->entityManager->persist($event);
+            $freemiumEvent = $data;
         }
 
         $this->entityManager->flush();

+ 3 - 2
src/State/Processor/Freemium/FreemiumOrganizationProcessor.php

@@ -9,6 +9,7 @@ use ApiPlatform\Metadata\Operation;
 use App\ApiResources\Freemium\FreemiumOrganization;
 use App\Entity\Access\Access;
 use App\Service\ApiResourceBuilder\Freemium\FreemiumOrganizationBuilder;
+use App\Service\ApiResourceBuilder\Freemium\OrganizationMappingBuilder;
 use App\State\Processor\EntityProcessor;
 use Doctrine\ORM\EntityManagerInterface;
 use Symfony\Bundle\SecurityBundle\Security;
@@ -22,7 +23,7 @@ class FreemiumOrganizationProcessor extends EntityProcessor
     public function __construct(
         private Security $security,
         private EntityManagerInterface $entityManager,
-        private FreemiumOrganizationBuilder $freemiumOrganizationBuilder,
+        private OrganizationMappingBuilder $organizationMappingBuilder,
     ) {
     }
 
@@ -45,7 +46,7 @@ class FreemiumOrganizationProcessor extends EntityProcessor
         $access = $this->security->getUser();
         $organization = $access->getOrganization();
 
-        $this->freemiumOrganizationBuilder->mapInformations($organization, $organizationFreemiumRequest);
+        $this->organizationMappingBuilder->mapInformations($organization, $organizationFreemiumRequest);
 
         $this->entityManager->persist($organization);
         $this->entityManager->flush();

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

@@ -12,7 +12,7 @@ use App\ApiResources\Freemium\FreemiumEvent;
 use App\Entity\Booking\Event;
 use App\Repository\Booking\EventRepository;
 use App\Service\Doctrine\FiltersConfigurationService;
-use App\State\Provider\ProviderUtils;
+use App\Service\State\Provider\ProviderUtils;
 use Doctrine\Common\Collections\ArrayCollection;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\ObjectMapper\ObjectMapperInterface;
@@ -75,7 +75,8 @@ final class FreemiumEventProvider implements ProviderInterface
     {
         $this->filtersConfigurationService->suspendTimeConstraintFilters();
         /** @var Event $event */
-        if(empty($event = $this->eventRepository->find($uriVariables['id']))){
+        $event = $this->eventRepository->find($uriVariables['id']);
+        if(empty($event)){
             throw new NotFoundHttpException('event not found');
         }
         $this->filtersConfigurationService->restoreTimeConstraintFilters();

+ 2 - 1
src/State/Provider/Freemium/FreemiumPlaceProvider.php

@@ -51,7 +51,8 @@ final class FreemiumPlaceProvider implements ProviderInterface
     private function provideItem(array $uriVariables, array $context): ?FreemiumPlace
     {
         /** @var Place $place */
-        if(empty($place = $this->placeRepository->find($uriVariables['id']))){
+        $place = $this->placeRepository->find($uriVariables['id']);
+        if(empty($place)){
             throw new NotFoundHttpException('place not found');
         }
 

+ 1 - 1
src/State/Provider/Search/PlaceSearchItemProvider.php

@@ -12,7 +12,7 @@ use App\ApiResources\Search\PlaceSearchItem;
 use App\Entity\Booking\Event;
 use App\Entity\Place\Place;
 use App\Repository\Place\PlaceRepository;
-use App\State\Provider\ProviderUtils;
+use App\Service\State\Provider\ProviderUtils;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\ObjectMapper\ObjectMapperInterface;
 

+ 1 - 1
src/Validator/Constraints/LessThanField.php → src/Validator/Constraints/FieldLesserThan.php

@@ -8,7 +8,7 @@ use Symfony\Component\Validator\Constraint;
 use Symfony\Component\Validator\Attribute\HasNamedArguments;
 
 #[Attribute(Attribute::TARGET_CLASS)]
-class LessThanField extends Constraint
+class FieldLesserThan extends Constraint
 {
     public string $message = 'The value of "{{ field }}" must be less than "{{ comparedTo }}"';
 

+ 10 - 6
src/Validator/Constraints/LessThanFieldValidator.php → src/Validator/Constraints/FieldLesserThanValidator.php

@@ -7,12 +7,12 @@ use Symfony\Component\Validator\Constraint;
 use Symfony\Component\Validator\ConstraintValidator;
 use Symfony\Component\Validator\Exception\UnexpectedTypeException;
 
-class LessThanFieldValidator extends ConstraintValidator
+class FieldLesserThanValidator extends ConstraintValidator
 {
     public function validate(mixed $object, Constraint $constraint): void
     {
-        if (!$constraint instanceof LessThanField) {
-            throw new UnexpectedTypeException($constraint, LessThanField::class);
+        if (!$constraint instanceof FieldLesserThan) {
+            throw new UnexpectedTypeException($constraint, FieldLesserThan::class);
         }
 
         if (!is_object($object)) {
@@ -26,11 +26,15 @@ class LessThanFieldValidator extends ConstraintValidator
             return; // Skip if either value is null
         }
 
-        if (!$fieldValue instanceof \DateTimeInterface || !$comparedValue instanceof \DateTimeInterface) {
-            return;
+        if ($fieldValue instanceof \DateTimeInterface && $comparedValue instanceof \DateTimeInterface) {
+            $test = $fieldValue->getTimestamp() >= $comparedValue->getTimestamp();
+        }else if(is_numeric($fieldValue) && is_numeric($comparedValue)){
+            $test = $fieldValue>= $comparedValue;
+        }else{
+            return; // Skip if isn't date or numeric value
         }
 
-        if ($fieldValue->getTimestamp() >= $comparedValue->getTimestamp()) {
+        if ($test) {
             $this->context
                 ->buildViolation($constraint->message)
                 ->setParameter('{{ field }}', $constraint->field)