src/Controller/SubscribeController.php line 80

Open in your IDE?
  1. <?php
  2.     namespace App\Controller;
  3.     use App\Entity\EmailConfirmation;
  4.     use App\Form\SubscribeForm;
  5.     use App\Service\TessituraBundle\ConstituentService;
  6.     use App\Service\TessituraSDK\Entity\Remote\WebLogin;
  7.     use App\Service\TessituraSDK\Resource\CRM\WebLogins;
  8.     use App\Service\TessituraSDK\Resource\Emails;
  9.     use App\Service\TessituraSDK\TessituraClient;
  10.     use App\Service\TessituraSDK\TessituraClientException;
  11.     use App\Service\TessituraSDK\Request as TessituraRequest;
  12.     use Doctrine\ORM\EntityManagerInterface;
  13.     use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14.     use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  15.     use Symfony\Component\Form\FormError;
  16.     use Symfony\Component\HttpFoundation\Request;
  17.     use Symfony\Component\HttpFoundation\Response;
  18.     use Symfony\Component\HttpFoundation\JsonResponse;
  19.     use Symfony\Component\Routing\Annotation\Route;
  20.     use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  21.     use Symfony\Component\Security\Core\User\User;
  22.     use Symfony\Contracts\Translation\TranslatorInterface;
  23.     class SubscribeController extends AbstractController
  24.     {
  25.         /**
  26.          * @var TessituraClient
  27.          */
  28.         private $client;
  29.         /**
  30.          * @var TranslatorInterface
  31.          */
  32.         private $translator;
  33.         /**
  34.          * @var ParameterBagInterface
  35.          */
  36.         private $params;
  37.         public function __construct(
  38.             TessituraClient $client,
  39.             TranslatorInterface $translator,
  40.             ParameterBagInterface $params
  41.         ) {
  42.             $this->client     $client;
  43.             $this->translator $translator;
  44.             $this->params     $params;
  45.         }
  46.         /**
  47.          * @Route(
  48.          *     "/subscribe/",
  49.          *     name="subscribe-redirect",
  50.          * )
  51.          * @param Request $request
  52.          *
  53.          * @return Response
  54.          */
  55.         public function subscribeRedirect(Request $request)
  56.         {
  57.             return $this->redirect('/en/subscribe');
  58.         }
  59.         
  60.         /**
  61.          * @Route(
  62.          *     "/{_locale}/subscribe/",
  63.          *     name="subscribe",
  64.          *     defaults={
  65.          *          "_locale": "fi"
  66.          *     },
  67.          *     requirements={
  68.          *          "_locale": "fi|sv|en"
  69.          *     }
  70.          * )
  71.          * @param Request $request
  72.          *
  73.          * @return Response
  74.          */
  75.         public function subscribeAction(Request $request)
  76.         {
  77.             /** @var User $user */
  78.             $user $this->get('security.token_storage')->getToken()->getUser();
  79.             if (in_array('ROLE_TESSITURA_KNOWN'$user->getRoles())) {
  80.                 return $this->redirectToRoute('account-profile', ['_fragment' => 'subscribe']);
  81.             }
  82.             $form $this->createForm(SubscribeForm::class, [
  83.             ]);
  84.             $form->handleRequest($request);
  85.             if ($form->isSubmitted() && $form->isValid()) {
  86.                 $data $form->getData();
  87.                 $searchResponse $this->client->request(WebLogins::search([
  88.                     'emailAddress' => $data['email'],
  89.                     'loginTypeId'  => $this->params->get('tessitura.logintype')
  90.                 ]));
  91.                 $webLogins $searchResponse->denormalize(WebLogin::class . '[]');
  92.                 if (!empty($webLogins)) {
  93.                     $form->addError(new FormError($this->translator->trans('form_subscribe_email_exists_error')));
  94.                 } else {
  95.                     $mail $this->generateSubscriptionConfirmationMail($data);
  96.                     $this->client->request($mail);
  97.                     return $this->render('page/subscribe.html.twig', [
  98.                         'submitted' => true
  99.                     ]);
  100.                 }
  101.             }
  102.             return $this->render('page/subscribe.html.twig', [
  103.                 'form'      => $form->createView(),
  104.                 'submitted' => false
  105.             ]);
  106.         }
  107.         /**
  108.          * @Route(
  109.          *     "/api/v1/subscribe/",
  110.          *     name="subscribe-api",
  111.          *        methods={"POST"},
  112.          * )
  113.          * @param Request $request
  114.          *
  115.          * @return Response
  116.          */
  117.         public function subscribeRequest(Request $request)
  118.         {
  119.             $data $request->toArray();
  120.             $origin $request->headers->get('Origin');
  121.             if (!$data['email'] || !$data['firstname'] || !$data['lastname'] || !$data['consent']) {
  122.                 return new JsonResponse(array_merge([
  123.                     'success' => false,
  124.                     'message' => 'Bad request'
  125.                 ], $data), 400);
  126.             }
  127.             
  128.             $searchResponse $this->client->request(WebLogins::search([
  129.                 'emailAddress' => $data['email'],
  130.                 'loginTypeId'  => $this->params->get('tessitura.logintype')
  131.             ]));
  132.             $webLogins $searchResponse->denormalize(WebLogin::class . '[]');
  133.             if (!empty($webLogins)) {
  134.                 return new JsonResponse(array_merge([
  135.                     'success' => false,
  136.                     'message' => 'Change subscription status in profile page'
  137.                 ], $data), 400);
  138.             } else {
  139.                 $mail $this->generateSubscriptionConfirmationMail($data);
  140.                 try {
  141.                     $this->client->request($mail);
  142.                 } catch (TessituraClientException $exception) {
  143.                     return new JsonResponse(array_merge([
  144.                         'success' => false,
  145.                         'message' => $exception->getMessage()
  146.                     ], $data), 500);
  147.                 }
  148.                 return new JsonResponse(array_merge([
  149.                     'success' => true,
  150.                     'message' => 'success'
  151.                 ], $data), 200);
  152.             }
  153.         }
  154.         /**
  155.          * @param mixed $data
  156.          * @return TessituraRequest
  157.          */
  158.         private function generateSubscriptionConfirmationMail($data) {
  159.             /** @var EntityManagerInterface $em */
  160.             $em $this->getDoctrine()->getManager();
  161.             /** @var EmailConfirmation $emailConfirmation */
  162.             $emailConfirmation $em->getRepository(EmailConfirmation::class)->findOneBy([
  163.                 'email'          => $data['email']
  164.             ]);
  165.             if (!$emailConfirmation) {
  166.                 $emailConfirmation = new EmailConfirmation();
  167.             }
  168.             $emailConfirmation->setEmail($data['email']);
  169.             $emailConfirmation->setFirstname($data['firstname']);
  170.             $emailConfirmation->setLastname($data['lastname']);
  171.             $emailConfirmation->setToken(strtoupper(md5(uniqid())));
  172.             $em->persist($emailConfirmation);
  173.             $em->flush();
  174.             $template $this->render('emails/subscribe-confirm.html.twig', [
  175.                 'confirm_link' => $this->generateUrl('subscribe-confirm', [],
  176.                         UrlGeneratorInterface::ABSOLUTE_URL) . '?token=' $emailConfirmation->getToken()
  177.             ]);
  178.             return Emails::send([
  179.                 'HtmlBody'         => $template->getContent(),
  180.                 'Subject'          => $this->translator->trans('subscribe_email_confirm_subject'),
  181.                 'EmailProfileId'   => $this->params->get('tessitura.subscribe.profile_id'),
  182.                 'RecipientAddress' => $data['email']
  183.             ]);
  184.         }
  185.         /**
  186.          * @Route(
  187.          *     "/{_locale}/subscribe/confirm/",
  188.          *     name="subscribe-confirm",
  189.          *     defaults={
  190.          *          "_locale": "fi"
  191.          *     },
  192.          *     requirements={
  193.          *          "_locale": "fi|sv|en"
  194.          *     }
  195.          * )
  196.          * @param Request $request
  197.          *
  198.          * @return Response
  199.          */
  200.         public function confirmAction(Request $requestConstituentService $constituentService)
  201.         {
  202.             /** @var User $user */
  203.             $user $this->get('security.token_storage')->getToken()->getUser();
  204.             $token $request->get('token');
  205.             $hasError false;
  206.             if ($token) {
  207.                 /** @var EntityManagerInterface $em */
  208.                 $em $this->getDoctrine()->getManager();
  209.                 /** @var EmailConfirmation $emailConfirmation */
  210.                 $emailConfirmation $em->getRepository(EmailConfirmation::class)->findOneBy([
  211.                     'token'          => $token,
  212.                     'savedTessitura' => null
  213.                 ]);
  214.                 if (!$emailConfirmation) {
  215.                     $hasError true;
  216.                 } else {
  217.                     $searchResponse $this->client->request(WebLogins::search([
  218.                         'emailAddress' => $emailConfirmation->getEmail(),
  219.                         'loginTypeId'  => $this->params->get('tessitura.logintype')
  220.                     ]));
  221.                     $webLogins      $searchResponse->denormalize(WebLogin::class . '[]');
  222.                     if (in_array('ROLE_TESSITURA_KNOWN'$user->getRoles())) {
  223.                         $hasError true;
  224.                     } elseif (!$webLogins) {
  225.                         $registrationData = [
  226.                             'email'           => $emailConfirmation->getEmail(),
  227.                             'firstname'       => $emailConfirmation->getFirstname(),
  228.                             'lastname'        => $emailConfirmation->getLastname(),
  229.                             'city'            => $this->params->get('tessitura.subscribe.default_city'),
  230.                             'postalcode'      => $this->params->get('tessitura.subscribe.default_postalcode'),
  231.                             'street1'         => $this->params->get('tessitura.subscribe.default_street1'),
  232.                             'mobile'          => $this->params->get('tessitura.subscribe.default_phone'),
  233.                             'mobile_national' => $this->params->get('tessitura.subscribe.default_phone_national'),
  234.                             'opt_in'          => (in_array($request->getLocale(), ['en''sv'])) ? [ConstituentService::OPTIN_KV] : [ConstituentService::OPTIN_EMAIL],
  235.                             'password'        => str_shuffle(md5(time()))
  236.                         ];
  237.                         $constituentService->register($constituentService->getUser(), $registrationData);
  238.                         $emailConfirmation->setSavedTessitura(1);
  239.                         $em->persist($emailConfirmation);
  240.                         $em->flush();
  241.                     } else {
  242.                         $hasError true;
  243.                     }
  244.                 }
  245.             } else {
  246.                 $hasError true;
  247.             }
  248.             return $this->render('page/subscribe-confirm.html.twig', [
  249.                 'has_error' => $hasError
  250.             ]);
  251.         }
  252.     }