src/Controller/Api/Product/ProductApiController.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Api\Product;
  3. use App\Dto\Authorization\AuthorizationHeaderDto;
  4. use App\Dto\Member\MemberCopecartCreatorDto;
  5. use App\Entity\Product;
  6. use App\Entity\Space;
  7. use App\EventListener\Api\TokenInterceptor\MybizTokenAuthenticatorInterface;
  8. use App\Repository\MemberRepository;
  9. use App\Service\Authorization\MybizRequestJwtChecker;
  10. use App\Service\GeoLocation\GeoLocationProvider;
  11. use App\Service\Market\MarketProvider;
  12. use App\Service\Member\Currency\MemberCurrencyProvider;
  13. use App\Service\PaymentGateway\Copecart\CopecartCheckoutGenerator;
  14. use App\Service\Product\ProductPriceProvider;
  15. use App\Service\PromoSystem\PromoSystemProvider;
  16. use App\Service\Subscription\SubscriptionProvider;
  17. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. class ProductApiController extends AbstractController implements MybizTokenAuthenticatorInterface
  23. {
  24.     /**
  25.      * @Route("/v1/product/{sku}/purchase-link", methods={"POST"}, name="api_product_purchase_link", options={"expose": "true"})
  26.      */
  27.     public function productPurchaseLink(
  28.         Request                   $request,
  29.         TranslatorInterface       $translator,
  30.         CopecartCheckoutGenerator $copecartCheckoutGenerator,
  31.         GeoLocationProvider       $geoLocationProvider,
  32.         MemberCurrencyProvider    $memberCurrencyProvider,
  33.         MybizRequestJwtChecker    $mybizRequestJwtChecker,
  34.         SubscriptionProvider      $subscriptionProvider,
  35.         MemberRepository          $memberRepository,
  36.         Product                   $product
  37.     ): Response
  38.     {
  39.         // On peut provenir ici avec un membre déjà existant, auquel cas on va utiliser son marché + savoir s'il a déjà commandé pour lui proposer un autre tarif
  40.         try {
  41.             $member $mybizRequestJwtChecker->checkJwt($request);
  42.             $hasAlreadyOrdered $subscriptionProvider->hasAlreadyOrdered($memberSpace::SPACE_FUTURES_INFINITY);
  43.         } catch (\Throwable $e) {
  44.             $member null;
  45.             // Ce endpoint d'API peut être appelé or connexion côté Futures Learn, dans ce cas là on considère le membre comme nouveau
  46.             $hasAlreadyOrdered false;
  47.         }
  48.         try {
  49.             $payload json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  50.         } catch (\Throwable $e) {
  51.             return $this->json([
  52.                 "message" => $translator->trans("validator.futures_learn.formation.parse_error", [], "validator"),
  53.                 "error" => $e->getMessage()
  54.             ], Response::HTTP_BAD_REQUEST);
  55.         }
  56.         // On créé un objet du type MemberCopecartCreatorDto pour rester dans les mêmes tuyaux sur Copecart
  57.         // Une idée pourrait être d'avoir une méthode $copecartCheckoutGenerator->generate avec les paramètres nécessaires et non un gros DTO
  58.         $memberCopecartCreatorDto = new MemberCopecartCreatorDto();
  59.         // On simule la création du DTO avec les paramètres nécessaire pour générer le lien de la page de checkout de la licence
  60.         $sponsor null;
  61.         if (isset($payload["sponsorId"])) {
  62.             $sponsor $memberRepository->find((int)$payload["sponsorId"]);
  63.             if (null === $sponsor) {
  64.                 return $this->json([
  65.                     "error" => "Sponsor ID not found : " $payload["sponsorId"]
  66.                 ], Response::HTTP_NOT_FOUND);
  67.             }
  68.         }
  69.         $memberCopecartCreatorDto->setSponsor($sponsor);
  70.         $memberCopecartCreatorDto->setPlainPassword($payload["plainPassword"]);
  71.         $memberCopecartCreatorDto->setEmail($payload["email"]);
  72.         $memberCopecartCreatorDto->setBirthday($payload["birthday"]);
  73.         $memberCopecartCreatorDto->setPhone($payload["phone"]);
  74.         $memberCopecartCreatorDto->setProduct($product);
  75.         $memberCopecartCreatorDto->setisDecreasing($payload["isDecreasing"]);
  76.         $memberCopecartCreatorDto->setIpAddress($payload["ip"]);
  77.         $memberCopecartCreatorDto->setCountry($payload["country"]);
  78.         $memberCopecartCreatorDto->setPreferredLanguage($payload["locale"]);
  79.         $memberCopecartCreatorDto->setDuration($payload["duration"]);
  80.         $memberCopecartCreatorDto->setAcceptOffers(true);
  81.         $memberCopecartCreatorDto->setAcceptTerms(true);
  82.         $memberCopecartCreatorDto->setAcceptRefunds(true);
  83.         $memberCopecartCreatorDto->setHasAlreadyOrdered($hasAlreadyOrdered);
  84.         try {
  85.             // Une fois le formulaire validé on renvoie l'utilisateur sur Copecart pour le paiement
  86.             return $this->json([
  87.                 "url" => $copecartCheckoutGenerator->generateFromMemberCopecartCreatorDto(
  88.                     $memberCopecartCreatorDto,
  89.                     $memberCurrencyProvider->getDefaultCurrency(),
  90.                     null !== $member $member->getMarket() : $geoLocationProvider->getGeoLocationDtoByCountry(
  91.                         $memberCopecartCreatorDto->getIpAddress(),
  92.                         $memberCopecartCreatorDto->getCountry()
  93.                     )->getMarket()
  94.                 )
  95.             ]);
  96.         } catch (\Throwable $e) {
  97.             return $this->json([
  98.                 "message" => $translator->trans("validator.futures_learn.formation.no_member", [], "validator"),
  99.                 "error" => $e->getMessage()
  100.             ], Response::HTTP_BAD_REQUEST);
  101.         }
  102.     }
  103.     /**
  104.      * @Route("/v1/product/informations", methods={"GET", "POST"}, name="api_product_informations", options={"expose": "true"})
  105.      */
  106.     public function productInformations(
  107.         Request                $request,
  108.         TranslatorInterface    $translator,
  109.         MemberCurrencyProvider $memberCurrencyProvider,
  110.         MybizRequestJwtChecker $mybizRequestJwtChecker,
  111.         MarketProvider         $marketProvider,
  112.         ProductPriceProvider   $productPriceProvider,
  113.         PromoSystemProvider    $promoSystemProvider,
  114.         SubscriptionProvider   $subscriptionProvider
  115.     ): Response
  116.     {
  117.         try {
  118.             $member $mybizRequestJwtChecker->checkJwt($request);
  119.             $isNewMember $subscriptionProvider->hasAlreadyOrdered($memberSpace::SPACE_FUTURES_INFINITY);
  120.         } catch (\Throwable $e) {
  121.             // Ce endpoint d'API peut être appelé or connexion côté Futures Learn, dans ce cas là on considère le membre comme nouveau
  122.             $isNewMember true;
  123.         }
  124.         try {
  125.             $payload json_decode($request->getContent(), true512JSON_THROW_ON_ERROR);
  126.         } catch (\Throwable $e) {
  127.             return $this->json([
  128.                 "message" => $translator->trans("validator.futures_learn.formation.parse_error", [], "validator"),
  129.                 "error" => $e->getMessage()
  130.             ], Response::HTTP_BAD_REQUEST);
  131.         }
  132.         $authorizationHeaderDto AuthorizationHeaderDto::generateFromRequest($request);
  133.         $spaceName $authorizationHeaderDto->getName();
  134.         $countryAlpha2 $payload["countryAlpha2"];
  135.         if (null === $countryAlpha2) {
  136.             return $this->json([
  137.                 "message" => $translator->trans("validator.futures_learn.formation.missing_information", [], "validator"),
  138.                 "error" => "spaceName or countryAlpha2 not found"
  139.             ], Response::HTTP_BAD_REQUEST);
  140.         }
  141.         $market $marketProvider->getMarketByCountryAlpha2($countryAlpha2);
  142.         $defaultCurrency $memberCurrencyProvider->getDefaultCurrency();
  143.         // On appelle le système de promo pour qu'elles se déclenchent
  144.         $date = new \DateTimeImmutable();
  145.         // TODO promo : il faudra changer ça avec l'affichage des promos côté Futures
  146.         try{
  147.             $promos $promoSystemProvider->getPromosToDisplay($authorizationHeaderDto->getName(), $date);
  148.         }catch (\Throwable $e){
  149.         }
  150.         switch ($spaceName) {
  151.             case Space::SPACE_FUTURES_INFINITY:
  152.                 $productPrices $productPriceProvider->getFuturesLearnProductPrices($market$defaultCurrency$isNewMember);
  153.                 break;
  154.             default:
  155.                 return $this->json([
  156.                     "message" => $translator->trans("validator.futures_learn.formation.space_not_found", [], "validator"),
  157.                     "error" => "Unknown space : " $spaceName
  158.                 ], Response::HTTP_BAD_REQUEST);
  159.         }
  160.         return $this->json([
  161.             "productPrices" => $productPrices,
  162.         ]);
  163.     }
  164. }