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

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.             'table_id' => $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  86.             'key' => $stripeHelper->publicKey,
  87.         ]);
  88.     }
  89.     /**
  90.      * @Route("/profile", name="profile")
  91.      */
  92.     public function profile(Request $requestEntityManagerInterface $emStripeHelper $stripeHelper): Response
  93.     {
  94.         /** @var User $user */
  95.         $user $this->getUser();
  96.         // Stripe subscription table
  97.         if (!$user->getStripeMember()) {
  98.             $customer $stripeHelper->registerMember($user);
  99.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  100.             $user->setStripeMember($stripeMember);
  101.             $em->persist($stripeMember);
  102.             $em->flush();
  103.         }
  104.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  105.         // Stripe subscription table
  106.         return $this->render('user/sessions.html.twig', [
  107.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  108.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  109.             'sessions' => $user->getSessions(),
  110.             'first_view' => false,
  111.             'appleReviewMode' => true,
  112.             'secret' => $subscriptionSession->client_secret,
  113.             // 'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  114.             'table_id' => $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  115.             'key' => $stripeHelper->publicKey,
  116.         ]);
  117.     }
  118.     /**
  119.      * @Route("/bonus", name="bonus")
  120.      */
  121.     public function getbonus(Request $requestEntityManagerInterface $emStripeHelper $stripeHelper): Response
  122.     {
  123.         /** @var User $user */
  124.         $user $this->getUser();
  125.         // Stripe subscription table
  126.         if (!$user->getStripeMember()) {
  127.             $customer $stripeHelper->registerMember($user);
  128.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  129.             $user->setStripeMember($stripeMember);
  130.             $em->persist($stripeMember);
  131.             $em->flush();
  132.         }
  133.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  134.         // Stripe subscription table
  135.         return $this->render('user/sessions.html.twig', [
  136.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  137.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  138.             'sessions' => $user->getSessions(),
  139.             'first_view' => false,
  140.             'appleReviewMode' => true,
  141.             'secret' => $subscriptionSession->client_secret,
  142.             // 'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  143.             'table_id' => $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  144.             'key' => $stripeHelper->publicKey,
  145.         ]);
  146.     }
  147.     /**
  148.      * @Route("/upgrade", name="upgrade")
  149.      */
  150.     public function upgrade(Request $requestEntityManagerInterface $emStripeHelper $stripeHelper): Response
  151.     {
  152.         /** @var User $user */
  153.         $user $this->getUser();
  154.         // Stripe subscription table
  155.         if (!$user->getStripeMember()) {
  156.             $customer $stripeHelper->registerMember($user);
  157.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  158.             $user->setStripeMember($stripeMember);
  159.             $em->persist($stripeMember);
  160.             $em->flush();
  161.         }
  162.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  163.         // Stripe subscription table
  164.         return $this->render('user/sessions.html.twig', [
  165.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  166.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  167.             'sessions' => $user->getSessions(),
  168.             'first_view' => false,
  169.             'appleReviewMode' => true,
  170.             'secret' => $subscriptionSession->client_secret,
  171.             // 'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  172.             'table_id' => $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  173.             'key' => $stripeHelper->publicKey,
  174.         ]);
  175.     }
  176.     /**
  177.      * @Route("/synchronization", name="synchronization")
  178.      */
  179.     public function synchronization(Request $request): Response
  180.     {
  181.         /** @var User $user */
  182.         $user $this->getUser();
  183.         return $this->render('user/synchronization.html.twig', [
  184.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  185.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  186.             'sessions' => $user->getSessions(),
  187.             'first_view' => false,
  188.             'appleReviewMode' => true,
  189.             'secret' => $subscriptionSession->client_secret,
  190.             // 'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  191.             'table_id' => $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  192.             'key' => $stripeHelper->publicKey,
  193.         ]);
  194.     }
  195.     /**
  196.      * @Route("/subscribed", name="subscribed")
  197.      */
  198.     public function subscribed(Request $requestEntityManagerInterface $emStripeHelper $stripeHelper): Response
  199.     {
  200.         /** @var User $user */
  201.         $user $this->getUser();
  202.         // Stripe subscription table
  203.         if (!$user->getStripeMember()) {
  204.             $customer $stripeHelper->registerMember($user);
  205.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  206.             $user->setStripeMember($stripeMember);
  207.             $em->persist($stripeMember);
  208.             $em->flush();
  209.         }
  210.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  211.         // Stripe subscription table
  212.         return $this->render('user/sessions.html.twig', [
  213.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  214.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  215.             'sessions' => $user->getSessions(),
  216.             'first_view' => false,
  217.             'appleReviewMode' => true,
  218.             'secret' => $subscriptionSession->client_secret,
  219.             // 'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  220.             'table_id' => $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  221.             'key' => $stripeHelper->publicKey,
  222.         ]);
  223.     }
  224.     /**
  225.      * @Route("/{id}", name="show")
  226.      */
  227.     public function showSession(string $idRequest $requestToastSessionRepository $toastSessionRepositoryEntityManagerInterface $emStripeHelper $stripeHelper): Response
  228.     {
  229.         $session $toastSessionRepository->find($id);
  230.         /** @var User $user */
  231.         $user $this->getUser();
  232.         // Stripe subscription table
  233.         if (!$user->getStripeMember()) {
  234.             $customer $stripeHelper->registerMember($user);
  235.             $stripeMember = new UserStripeMember(Identifier::generate(), $customer['id']);
  236.             $user->setStripeMember($stripeMember);
  237.             $em->persist($stripeMember);
  238.             $em->flush();
  239.         }
  240.         $subscriptionSession $stripeHelper->invokeSubscriptionTableSession($user);
  241.         // Stripe subscription table
  242.         return $this->render('user/sessions.html.twig', [
  243.             'sharing_status_success' => $request->getSession()->get('sharing_status_success'false),
  244.             'sharing_errors' => $request->getSession()->get('sharing.errors'null),
  245.             'sessions' => $user->getSessions(),
  246.             'session' => $session,
  247.             'first_view' => false,
  248.             'appleReviewMode' => true,
  249.             'secret' => $subscriptionSession->client_secret,
  250.             // 'table_id' => $user->getMembership()->isAllowedTrial() ? $_ENV['STRIPE_PRICING_TABLE_WITH_TRIAL'] : $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  251.             'table_id' => $_ENV['STRIPE_PRICING_TABLE_WITHOUT_TRIAL'],
  252.             'key' => $stripeHelper->publicKey,
  253.         ]);
  254.     }
  255.     /**
  256.      * @Route("/{id}/remove", name="remove", methods={"GET"})
  257.      */
  258.     public function removeSession(ToastSession $sessionEntityManagerInterface $em): Response
  259.     {
  260.         $this->denyAccessUnlessGranted(ToastSessionVoter::ACCESS$session);
  261.         $em->remove($session);
  262.         $em->flush();
  263.         return $this->redirectToRoute('user_sessions_index');
  264.     }
  265.     /**
  266.      * @Route("/links/{id}/remove", name="remove_link")
  267.      */
  268.     public function removeLink(ToastSessionLink $linkEntityManagerInterface $em): \Symfony\Component\HttpFoundation\RedirectResponse
  269.     {
  270.         $this->denyAccessUnlessGranted(ToastSessionLinkVoter::ACCESS$link);
  271.         $em->remove($link);
  272.         $em->flush();
  273.         return $this->redirectToRoute('user_sessions_index');
  274.     }
  275.     /**
  276.      * @Route("/{id}/invoke-sharing", name="invoke_sharing", methods={"POST"})
  277.      */
  278.     public function invokeSessionSharing(
  279.         ToastSession $session,
  280.         CommandBusInterface $commandBus,
  281.         Request $request,
  282.         ActionResponseHandler $actionResponseHandler
  283.     ): Response {
  284.         $command = new ShareToastSessionCommand();
  285.         $command->session $session->getId();
  286.         $command->recipient $request->request->get('email');
  287.         try {
  288.             $commandBus->execute($command);
  289.         } catch (\Exception $e) {
  290.             return $actionResponseHandler->errorRedirect('user_sessions_index'ExceptionMessage::getMessage($e));
  291.         }
  292.         return $actionResponseHandler->successRedirect('user_sessions_index''Session is successfully shared');
  293.     }
  294.     /**
  295.      * @Route("/{id}/rename", name="rename")
  296.      */
  297.     public function renameSession(
  298.         Request $request,
  299.         ToastSession $session,
  300.         EntityManagerInterface $em,
  301.         ActionResponseHandler $actionResponseHandler
  302.     ): Response {
  303.         $this->denyAccessUnlessGranted(ToastSessionVoter::ACCESS$session);
  304.         $session->setName($request->request->get('name'));
  305.         $em->persist($session);
  306.         $em->flush();
  307.         return $actionResponseHandler->successRedirect('user_sessions_index''Success');
  308.     }
  309.     /**
  310.      * @Route("/{id}/links/add", name="add_link", methods={"POST"})
  311.      */
  312.     public function addSessionLink(
  313.         Request $request,
  314.         CommandBusInterface $commandBus,
  315.         ToastSession $session,
  316.         ActionResponseHandler $actionResponseHandler
  317.     ): Response {
  318.         $url $request->request->get('url');
  319.         $siteParser = new SiteParser($url);
  320.         $command = new CreateToastSessionLinkCommand();
  321.         $command->id Identifier::generate();
  322.         $command->name $siteParser->getPageTitle();
  323.         $command->icon $siteParser->getFavicon();
  324.         $command->url $url;
  325.         $command->session $session->getId();
  326.         try {
  327.             $commandBus->execute($command);
  328.         } catch (\Exception $e) {
  329.             return $actionResponseHandler->errorRedirect('user_sessions_index'ExceptionMessage::getMessage($e));
  330.         }
  331.         return $actionResponseHandler->successRedirect('user_sessions_index''Success');
  332.     }
  333. }