src/Http/Controller/User/SessionsController.php line 174

Open in your IDE?
  1. <?php
  2. namespace App\Http\Controller\User;
  3. use App\Application\CommandBus\Command\ToastSession\ShareToastSessionCommand;
  4. use App\Application\CommandBus\Command\ToastSessionLink\CreateToastSessionLinkCommand;
  5. use App\Database\Domain\Entity\Sessions\Collaborators\CollaboratedSession;
  6. use App\Database\Domain\Entity\Sessions\ToastSession;
  7. use App\Database\Domain\Entity\Sessions\ToastSessionLink;
  8. use App\Database\Domain\Entity\User\User;
  9. use App\Database\Domain\Entity\User\UserStripeMember;
  10. use App\Database\Domain\Repository\CollaboratedSessionRepository;
  11. use App\Database\Domain\Repository\ToastSessionRepository;
  12. use App\Infrastructure\Messenger\CommandBus\CommandBusInterface;
  13. use App\Infrastructure\Security\Voter\ToastSessionLinkVoter;
  14. use App\Infrastructure\Security\Voter\ToastSessionVoter;
  15. use App\Infrastructure\Service\ActionResponseHandler;
  16. use App\Infrastructure\Service\SiteParser;
  17. use App\Infrastructure\Service\StripeHelper;
  18. use App\Infrastructure\Util\ExceptionMessage;
  19. use App\Infrastructure\Util\Identifier;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\Response;
  24. use Symfony\Component\HttpFoundation\RedirectResponse;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. /**
  27.  * @Route("/user/sessions", name="user_sessions_")
  28.  */
  29. class SessionsController extends AbstractController
  30. {
  31.     /**
  32.      * @Route("", name="index")
  33.      */
  34.     public function __invoke(Request $requestCollaboratedSessionRepository $collaboratedSessionRepositoryToastSessionRepository $toastSessionRepositoryEntityManagerInterface $emStripeHelper $stripeHelper): Response
  35.     {
  36.         /** @var User $user */
  37.         $user $this->getUser();
  38.         $sessions $user->getSessions();
  39.         /** @var CollaboratedSession[] $collaboratedSessions */
  40.         $collaboratedSessions $collaboratedSessionRepository->findBy(['collaboratedUser' => $user]);
  41.         $ids = [];
  42.         foreach ($collaboratedSessions as $collaboratedSession) {
  43.             $ids[] = $collaboratedSession->getSession()->getId();
  44.         }
  45.         $notThisOwnerSessions $toastSessionRepository->findBy(['id' => $ids]);
  46.         foreach ($notThisOwnerSessions as $notThisOwnerSession) {
  47.             foreach ($collaboratedSessions as $collaboratedSession) {
  48.                 if ($collaboratedSession->getSession()->getId() === $notThisOwnerSession->getId()) {
  49.                     $notThisOwnerSession->setOrderIndex($collaboratedSession->getOrderIndex());
  50.                     $notThisOwnerSession->collaborated true;
  51.                 }
  52.             }
  53.         }
  54.         if (!is_array($sessions)) {
  55.             $sessions $sessions->toArray();
  56.         }
  57.         $sessions = [...$notThisOwnerSessions, ...$sessions];
  58.         usort($sessions, function ($a$b) {
  59.             return $a->getOrderIndex() <=> $b->getOrderIndex();
  60.         });
  61.         $isFirstView $request->query->get('source');
  62.         if ($isFirstView == 'registered') {
  63.             $isFirstView true;
  64.         } else {
  65.             $isFirstView false;
  66.         }
  67.         // Stripe subscription table
  68.         if (!$user->getStripeMember()) {
  69.             $customer $stripeHelper->registerMember($user);
  70.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  71.             $user->setStripeMember($stripeMember);
  72.             $em->persist($stripeMember);
  73.             $em->flush();
  74.         }
  75.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  76.         // Stripe subscription table
  77.         return $this->render('user/sessions.html.twig', [
  78.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  79.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  80.             'sessions' => $sessions,
  81.             'first_view' => $isFirstView,
  82.             'appleReviewMode' => true,
  83.             'secret' => $subscriptionSession->client_secret,
  84.             'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  85.             'key' => $stripeHelper->publicKey,
  86.         ]);
  87.     }
  88.     /**
  89.      * @Route("/profile", name="profile")
  90.      */
  91.     public function profile(Request $requestEntityManagerInterface $emStripeHelper $stripeHelper): Response
  92.     {
  93.         /** @var User $user */
  94.         $user $this->getUser();
  95.         // Stripe subscription table
  96.         if (!$user->getStripeMember()) {
  97.             $customer $stripeHelper->registerMember($user);
  98.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  99.             $user->setStripeMember($stripeMember);
  100.             $em->persist($stripeMember);
  101.             $em->flush();
  102.         }
  103.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  104.         // Stripe subscription table
  105.         return $this->render('user/sessions.html.twig', [
  106.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  107.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  108.             'sessions' => $user->getSessions(),
  109.             'first_view' => false,
  110.             'appleReviewMode' => true,
  111.             'secret' => $subscriptionSession->client_secret,
  112.             'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  113.             'key' => $stripeHelper->publicKey,
  114.         ]);
  115.     }
  116.     /**
  117.      * @Route("/bonus", name="bonus")
  118.      */
  119.     public function getbonus(Request $requestEntityManagerInterface $emStripeHelper $stripeHelper): Response
  120.     {
  121.         /** @var User $user */
  122.         $user $this->getUser();
  123.         // Stripe subscription table
  124.         if (!$user->getStripeMember()) {
  125.             $customer $stripeHelper->registerMember($user);
  126.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  127.             $user->setStripeMember($stripeMember);
  128.             $em->persist($stripeMember);
  129.             $em->flush();
  130.         }
  131.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  132.         // Stripe subscription table
  133.         return $this->render('user/sessions.html.twig', [
  134.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  135.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  136.             'sessions' => $user->getSessions(),
  137.             'first_view' => false,
  138.             'appleReviewMode' => true,
  139.             'secret' => $subscriptionSession->client_secret,
  140.             'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  141.             'key' => $stripeHelper->publicKey,
  142.         ]);
  143.     }
  144.     /**
  145.      * @Route("/upgrade", name="upgrade")
  146.      */
  147.     public function upgrade(Request $requestEntityManagerInterface $emStripeHelper $stripeHelper): Response
  148.     {
  149.         /** @var User $user */
  150.         $user $this->getUser();
  151.         // Stripe subscription table
  152.         if (!$user->getStripeMember()) {
  153.             $customer $stripeHelper->registerMember($user);
  154.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  155.             $user->setStripeMember($stripeMember);
  156.             $em->persist($stripeMember);
  157.             $em->flush();
  158.         }
  159.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  160.         // Stripe subscription table
  161.         return $this->render('user/sessions.html.twig', [
  162.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  163.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  164.             'sessions' => $user->getSessions(),
  165.             'first_view' => false,
  166.             'appleReviewMode' => true,
  167.             'secret' => $subscriptionSession->client_secret,
  168.             'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  169.             'key' => $stripeHelper->publicKey,
  170.         ]);
  171.     }
  172.     /**
  173.      * @Route("/synchronization", name="synchronization")
  174.      */
  175.     public function synchronization(Request $request): Response
  176.     {
  177.         /** @var User $user */
  178.         $user $this->getUser();
  179.         return $this->render('user/synchronization.html.twig', [
  180.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  181.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  182.             'sessions' => $user->getSessions(),
  183.             'first_view' => false,
  184.             'appleReviewMode' => true,
  185.             'secret' => $subscriptionSession->client_secret,
  186.             'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  187.             'key' => $stripeHelper->publicKey,
  188.         ]);
  189.     }
  190.     /**
  191.      * @Route("/subscribed", name="subscribed")
  192.      */
  193.     public function subscribed(Request $requestEntityManagerInterface $emStripeHelper $stripeHelper): Response
  194.     {
  195.         /** @var User $user */
  196.         $user $this->getUser();
  197.         // Stripe subscription table
  198.         if (!$user->getStripeMember()) {
  199.             $customer $stripeHelper->registerMember($user);
  200.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  201.             $user->setStripeMember($stripeMember);
  202.             $em->persist($stripeMember);
  203.             $em->flush();
  204.         }
  205.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  206.         // Stripe subscription table
  207.         return $this->render('user/sessions.html.twig', [
  208.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  209.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  210.             'sessions' => $user->getSessions(),
  211.             'first_view' => false,
  212.             'appleReviewMode' => true,
  213.             'secret' => $subscriptionSession->client_secret,
  214.             'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  215.             'key' => $stripeHelper->publicKey,
  216.         ]);
  217.     }
  218.     /**
  219.      * @Route("/{id}", name="show")
  220.      */
  221.     public function showSession(string $idRequest $requestToastSessionRepository $toastSessionRepositoryEntityManagerInterface $emStripeHelper $stripeHelper): Response
  222.     {
  223.         $session $toastSessionRepository->find($id);
  224.         /** @var User $user */
  225.         $user $this->getUser();
  226.         // Stripe subscription table
  227.         if (!$user->getStripeMember()) {
  228.             $customer $stripeHelper->registerMember($user);
  229.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  230.             $user->setStripeMember($stripeMember);
  231.             $em->persist($stripeMember);
  232.             $em->flush();
  233.         }
  234.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  235.         // Stripe subscription table
  236.         return $this->render('user/sessions.html.twig', [
  237.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  238.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  239.             'sessions' => $user->getSessions(),
  240.             'session' => $session,
  241.             'first_view' => false,
  242.             'appleReviewMode' => true,
  243.             'secret' => $subscriptionSession->client_secret,
  244.             'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  245.             'key' => $stripeHelper->publicKey,
  246.         ]);
  247.     }
  248.     /**
  249.      * @Route("/{id}/remove", name="remove", methods={"GET"})
  250.      */
  251.     public function removeSession(ToastSession $sessionEntityManagerInterface $em): Response
  252.     {
  253.         $this->denyAccessUnlessGranted(ToastSessionVoter::ACCESS$session);
  254.         $em->remove($session);
  255.         $em->flush();
  256.         return $this->redirectToRoute('user_sessions_index');
  257.     }
  258.     /**
  259.      * @Route("/links/{id}/remove", name="remove_link")
  260.      */
  261.     public function removeLink(ToastSessionLink $linkEntityManagerInterface $em): \Symfony\Component\HttpFoundation\RedirectResponse
  262.     {
  263.         $this->denyAccessUnlessGranted(ToastSessionLinkVoter::ACCESS$link);
  264.         $em->remove($link);
  265.         $em->flush();
  266.         return $this->redirectToRoute('user_sessions_index');
  267.     }
  268.     /**
  269.      * @Route("/{id}/invoke-sharing", name="invoke_sharing", methods={"POST"})
  270.      */
  271.     public function invokeSessionSharing(
  272.         ToastSession $session,
  273.         CommandBusInterface $commandBus,
  274.         Request $request,
  275.         ActionResponseHandler $actionResponseHandler
  276.     ): Response {
  277.         $command = new ShareToastSessionCommand();
  278.         $command->session $session->getId();
  279.         $command->recipient $request->request->get('email');
  280.         try {
  281.             $commandBus->execute($command);
  282.         } catch (\Exception $e) {
  283.             return $actionResponseHandler->errorRedirect('user_sessions_index'ExceptionMessage::getMessage($e));
  284.         }
  285.         return $actionResponseHandler->successRedirect('user_sessions_index''Session is successfully shared');
  286.     }
  287.     /**
  288.      * @Route("/{id}/rename", name="rename")
  289.      */
  290.     public function renameSession(
  291.         Request $request,
  292.         ToastSession $session,
  293.         EntityManagerInterface $em,
  294.         ActionResponseHandler $actionResponseHandler
  295.     ): Response {
  296.         $this->denyAccessUnlessGranted(ToastSessionVoter::ACCESS$session);
  297.         $session->setName($request->request->get('name'));
  298.         $em->persist($session);
  299.         $em->flush();
  300.         return $actionResponseHandler->successRedirect('user_sessions_index''Success');
  301.     }
  302.     /**
  303.      * @Route("/{id}/links/add", name="add_link", methods={"POST"})
  304.      */
  305.     public function addSessionLink(
  306.         Request $request,
  307.         CommandBusInterface $commandBus,
  308.         ToastSession $session,
  309.         ActionResponseHandler $actionResponseHandler
  310.     ): Response {
  311.         $url $request->request->get('url');
  312.         $siteParser = new SiteParser($url);
  313.         $command = new CreateToastSessionLinkCommand();
  314.         $command->id Identifier::generate();
  315.         $command->name $siteParser->getPageTitle();
  316.         $command->icon $siteParser->getFavicon();
  317.         $command->url $url;
  318.         $command->session $session->getId();
  319.         try {
  320.             $commandBus->execute($command);
  321.         } catch (\Exception $e) {
  322.             return $actionResponseHandler->errorRedirect('user_sessions_index'ExceptionMessage::getMessage($e));
  323.         }
  324.         return $actionResponseHandler->successRedirect('user_sessions_index''Success');
  325.     }
  326. }