src/EventListener/PostValidate/CreateStripeSubscriptionPostValidateTransformer.php line 81

Open in your IDE?
  1. <?php
  2. namespace App\EventListener\PostValidate;
  3. use App\DTO\StripeSubscription\StripeSubscription;
  4. use App\Repository\DiscountRepository;
  5. use App\Repository\SiteRepository;
  6. use App\Repository\StripeSubscriptionRepository;
  7. use App\Repository\SubscriptionPriceRepository;
  8. use App\Stripe\Service\StripeApi;
  9. use App\Service\Manager\StripeSubscriptionManager;
  10. use App\Service\UserProvider;
  11. use Stripe\Exception\ApiErrorException;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. use Symfony\Component\HttpKernel\Event\ViewEvent;
  16. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  17. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  18. use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. class CreateStripeSubscriptionPostValidateTransformer implements EventSubscriberInterface
  21. {
  22.     private $userProvider;
  23.     private $siteRepository;
  24.     private $stripeSubscriptionRepository;
  25.     private $translator;
  26.     private $priceRepository;
  27.     private $discountRepository;
  28.     private $stripeApi;
  29.     private $manager;
  30.     private $normalizer;
  31.     private $request;
  32.     public function __construct(
  33.         UserProvider $userProvider,
  34.         SiteRepository $siteRepository,
  35.         StripeSubscriptionRepository $stripeSubscriptionRepository,
  36.         TranslatorInterface $translator,
  37.         SubscriptionPriceRepository $priceRepository,
  38.         DiscountRepository $discountRepository,
  39.         StripeApi $stripeApi,
  40.         StripeSubscriptionManager $stripeSubscriptionManager,
  41.         NormalizerInterface $normalizer,
  42.         RequestStack $requestStack
  43.     ) {
  44.         $this->userProvider $userProvider;
  45.         $this->siteRepository $siteRepository;
  46.         $this->stripeSubscriptionRepository $stripeSubscriptionRepository;
  47.         $this->translator $translator;
  48.         $this->priceRepository $priceRepository;
  49.         $this->discountRepository $discountRepository;
  50.         $this->stripeApi $stripeApi;
  51.         $this->manager $stripeSubscriptionManager;
  52.         $this->normalizer $normalizer;
  53.         $this->request $requestStack->getCurrentRequest();
  54.     }
  55.     public static function getSubscribedEvents()
  56.     {
  57.         return [
  58.             PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
  59.         ];
  60.     }
  61.     public function supportTransformation($payload)
  62.     {
  63.         return $payload instanceof StripeSubscription;
  64.     }
  65.     public function transform(ViewEvent $event)
  66.     {
  67.         /** @var StripeSubscription $payload */
  68.         $payload $event->getControllerResult();
  69.         if (!$this->supportTransformation($payload)) {
  70.             return;
  71.         }
  72.         $site $this->siteRepository->find($this->request->get('id'));
  73.         if (null === $site) {
  74.             throw new NotFoundHttpException();
  75.         }
  76.         if (null !== $this->stripeSubscriptionRepository->findOneBy([
  77.             'site' => $site,
  78.             'isActive' => true,
  79.         ])) {
  80.             throw new BadRequestHttpException($this->translator->trans('stripe_subscription.exist'));
  81.         }
  82.         $user $this->userProvider->getUser();
  83.         $subscriptionPrice $this->priceRepository->find($payload->price);
  84.         $discount $payload->discount $this->discountRepository->find($payload->discount) : null;
  85.         try {
  86.             $customer $this->stripeApi->createCustomer($user->getEmail(), $payload->token);
  87.             $subscription $this->stripeApi->createSubscription(
  88.                 $customer,
  89.                 $subscriptionPrice->getStripeId(),
  90.                 $discount $discount->getUtm() : null
  91.             );
  92.         } catch (ApiErrorException $exception) {
  93.             throw new BadRequestHttpException($exception->getMessage());
  94.         }
  95.         $stripeSubscription $this->manager->create($site$subscriptionPrice->getCurrency(), $user$subscription->id);
  96.         $event->setResponse(new JsonResponse($this->normalizer->normalize($stripeSubscription)));
  97.     }
  98. }