src/Controller/UserController.php line 52

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Doctrine\Persistence\ManagerRegistry;
  5. use Symfony\Component\Mailer\MailerInterface;
  6. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  7. use Symfony\Component\Mime\Email;
  8. use Symfony\Component\HttpFoundation\{JsonResponseRequestResponse};
  9. use Symfony\Component\Routing\Annotation\Route;
  10. use App\Utils\Ticketing;
  11. use App\Entity\User;
  12. use App\Entity\Item;
  13. use App\Utils\Functions;
  14. /**
  15.  * @Route("/{_locale}", requirements={"_locale": "en|es"})
  16.  */
  17. class UserController extends AbstractController
  18. {
  19.     /**
  20.      * @var Ticketing
  21.      */
  22.     private $ticketing;
  23.     /**
  24.      * @var Functions
  25.      */
  26.     private $functions;
  27.     /**
  28.      * @var ManagerRegistry
  29.      */
  30.     private $doctrine;
  31.     /**
  32.      * @param Ticketing $ticketing
  33.      * @param Functions $functions
  34.      * @param ManagerRegistry $doctrine
  35.      */
  36.     public function __construct(Ticketing $ticketingFunctions $functionsManagerRegistry $doctrine)
  37.     {
  38.         date_default_timezone_set('UTC');
  39.         $this->ticketing $ticketing;
  40.         $this->functions $functions;
  41.         $this->doctrine  $doctrine;
  42.     }
  43.     /**
  44.      * @Route("/access", name="access")
  45.      */
  46.     public function access(Request $requestManagerRegistry $doctrineMailerInterface $mailer): Response
  47.     {
  48.         if($request->get("format")){
  49.             $format $request->get("format");
  50.         } else {
  51.             $format 1;
  52.         }
  53.         // General function to set discount ref/affId
  54.         $this->functions->setDiscount($request);
  55.         $entityManager $doctrine->getManager();
  56.         $redirect="";
  57.         $statusLogin "";
  58.         $statusPreregister "";
  59.         $emailPreregister $request->get('email-preregister');
  60.         $emailLogin $request->get('email-login');
  61.         $password $request->get('password');
  62.         if($request->get("redirect")){
  63.             $redirect=$request->get("redirect");
  64.         }
  65. //        if($request->isMethod('post')) {
  66. //            $checkCaptcha = $this->functions->checkCaptcha($request->get('g-recaptcha-response'));
  67. //            if(!$checkCaptcha) {
  68. //                return $this->render('user/access.html.twig', [
  69. //                    'statusLogin' => 'errorCaptcha',
  70. //                    'statusPreregister' => $statusPreregister,
  71. //                    'redirect' => $redirect,
  72. //                    'format' => $format
  73. //                ]);
  74. //            }
  75. //        }
  76.         if($emailLogin){
  77.             if($request->get('send-form-log')){
  78.                 $result $this->ticketing->curl("users/login""normal", array("userId"=>$emailLogin"password"=>$password), "POST");
  79.                 if($result["code"] != 200){
  80.                     $statusLogin "error";
  81.                 } else{
  82.                     $session $request->getSession();
  83.                     $session->set('userId'$result["userId"]);
  84.                     if (!empty($result['type']) && $result['type'] === 1) {
  85.                         $session->set('userType'1);
  86.                         $session->set('userEventId'$result['eventId']);
  87.                     }
  88.                     if($redirect!=""){
  89.                         return $this->redirect($redirect);
  90.                     }
  91.                     return $this->redirectToRoute('home');
  92.                 }
  93.             }
  94.         }
  95.         if($emailPreregister){
  96.             if($request->get('send-form-pre')){
  97.                 $result $this->ticketing->curl("users""normal", array("userId"=>$emailPreregister), "POST");
  98.     
  99.                 if($result["code"] != 201){
  100.                     $statusPreregister "error";
  101.                 } else {
  102.                     $user = new User();
  103.                     $user->setUserId($result["userId"]);
  104.                     $user->setCreatedAt(new \DateTime());
  105.                     $entityManager->persist($user);
  106.                     $entityManager->flush();
  107.         
  108.                     $email = (new TemplatedEmail())
  109.                         ->from($this->getParameter('mailer_from'))
  110.                         ->to($result["userId"])
  111.                         ->subject('DOW - Registro')
  112.                         ->htmlTemplate('mail/register.html.twig')
  113.                         ->context([
  114.                             'userId' => $result["userId"],
  115.                             'registerCode' => $result["registerCode"],
  116.                         ]);
  117.         
  118.                     $mailer->send($email);
  119.         
  120.                     $statusPreregister "done";
  121.                 }
  122.             }
  123.         }
  124.         return $this->render('user/access.html.twig', [
  125.             'statusLogin' => $statusLogin,
  126.             'statusPreregister' => $statusPreregister,
  127.             'redirect' => $redirect,
  128.             'format' => $format
  129.         ]);
  130.     }
  131.     /**
  132.      * @Route("/register/{userId}/{registerCode}", name="register")
  133.      */
  134.     public function register(Request $requestManagerRegistry $doctrine$userId$registerCode): Response
  135.     {
  136.         $em $doctrine->getManager();
  137.         $status "";
  138.         $user $this->ticketing->curl("users/".$userId"normal", array(), "GET");
  139.         if($user["code"] == 200){
  140.             $status "error";
  141.         } else {
  142.             if($request->get('send-form')){
  143.                 $password $request->get('password');
  144.                 $name $request->get('name');
  145.                 $surname $request->get('surname');
  146.                 $alias $request->get('alias');
  147.                 $phone $request->get('phone');
  148.                 $city $request->get('city');
  149.                 $nif $request->get('nif');
  150.                 // Birth date
  151.                 $birth_date $request->get('birth_date');
  152.                 $datetime = new \DateTime();
  153.                 $newDate $datetime->createFromFormat('Y-m-d'$birth_date);
  154.                 $objUser $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
  155.                 if (empty($objUser)) {
  156.                     $objUser = new User();
  157.                     $objUser->setUserId($userId);
  158.                     $objUser->setCreatedAt(new \DateTime());
  159.                 }
  160.                 // Requiresd
  161.                 $objUser->setAlias($alias);
  162.                 $objUser->setPhone($phone);
  163.                 $objUser->setBirthDate($newDate);
  164.                 $objUser->setCity($city);
  165.                 $em->persist($objUser);
  166.                 $em->flush();
  167.                 $result $this->ticketing->curl("users""normal",
  168.                     [
  169.                         "userId" => $userId,
  170.                         "password" => 'dow-12345678'// Password temporal
  171.                         "name" => $name,
  172.                         "surname" => $surname,
  173.                         "registerCode" => $registerCode,
  174.                         "alias" => $alias,
  175.                         "phone" => $phone,
  176.                         "city" => $city,
  177.                         "birth_date" => $newDate,
  178.                         "nif" => $nif,
  179.                     ], "PATCH");
  180.                 if($result["code"] != 200){
  181.                     $status "error";
  182.                 } else {
  183.                     $status "done";
  184.                     // Email with tickets link
  185.                     $this->ticketing->curl("send-qr-email""normal", ["userId" => $userId], "POST");
  186.                 }
  187.             }
  188.         }
  189.         return $this->render('user/register.html.twig', [
  190.             'status' => $status,
  191.             'id' => $userId,
  192.             'code' => $registerCode
  193.         ]);
  194.     }
  195.     /**
  196.      * @Route("/logout", name="logout")
  197.      */
  198.     public function logout(Request $request): Response
  199.     {
  200.         $session $request->getSession();
  201.         $session->clear();
  202.         return $this->redirectToRoute('home');
  203.     }
  204.     /**
  205.      * @Route("/user-profile", name="userProfile")
  206.      */
  207.     public function userProfile(Request $request): Response
  208.     {
  209.         // General function to set discount ref/affId
  210.         $this->functions->setDiscount($request);
  211.         
  212.         $em $this->doctrine->getManager();
  213.         $userId=$this->functions->getUserLogged();
  214.         if(!$userId){
  215.             $this->addFlash(
  216.                 'notice',
  217.                 'Debe iniciar sesión como usuario'
  218.             );
  219.             return $this->redirectToRoute('access',["redirect" => $this->generateUrl('userProfile')]);
  220.         }
  221.         $tickets $this->ticketing->curl("tickets?onSaleByUser=false&user=" $userId "&orderBy=event&limit=1000""normal", [], "GET");
  222.         $result $this->ticketing->curl("users/" $userId"normal", [], "GET");
  223.         $items_pending $em->getRepository(Item::class)->search("count", ["web_pending" => TRUE]);
  224.         $sents $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1000&enabled=true&type=transfer""normal", [], "GET");
  225.         $sells $this->ticketing->curl("tickets?onSaleByUser=true&user=" $userId "&limit=1000""normal", [], "GET");
  226.         $sales_history $this->ticketing->curl("tickets/activity?origin=" $userId "&limit=1000&type=sale""normal", [], "GET");
  227.         $wallet_operations $this->ticketing->curl("wallet-operations?user=".$userId"normal", [], "GET");
  228.         // Separate collections and tickets
  229.         $spsCollections = [];
  230.         $nftTickets     = [];
  231.         date_default_timezone_set("Europe/Madrid");
  232.         $dateForCollection date("Y-m-d H:i:s"strtotime('-24 hours'));
  233.         foreach($tickets['tickets'] as $ticket) {
  234.             if ($dateForCollection $ticket['event']['dateEvent']) {
  235.                 $spsCollections[] = $ticket;
  236.             } else {
  237.                 // Automatic activation for tickets
  238.                 if (!$ticket["active"] && (date("Y-m-d H:i:s") >= $ticket['event']['dateActivation'])) {
  239.                     // Unblock ticket
  240.                     if ($ticket['isBlocked'])
  241.                         $this->ticketing->curl("tickets/" $ticket['id'], "normal", ["blocked" => "false"], "PATCH");
  242.                     // Remove tickets on sale in secondary market
  243.                     if ($ticket['onSaleUser'])
  244.                         $this->ticketing->curl("sales/" $ticket['id'], "normal", [], "DELETE");
  245.                     // get event
  246.                     $event $this->ticketing->curl("events/".$ticket["event"]["id"], "normal", [], "GET");
  247.                     $activation $this->ticketing->curl("tickets/".$ticket['id']."/activate""normal", ["latitude" => $event["latitude"], "longitude" => $event["longitude"]], "PATCH");
  248.                     if ($activation["code"] == "200") {
  249.                         $ticket['active'] = true;
  250.                         $ticket['accessCode'] = $activation['accessCode'];
  251.                     }
  252.                 }
  253.                 $nftTickets[] = $ticket;
  254.             }
  255.         }
  256.         $user $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
  257.         if ($user !== null) {
  258.             $userAlias $user->getAlias();
  259.         } else {
  260.             $userAlias '-';
  261.         }
  262.         // Blacklist from env
  263.         $blacklist explode(',',$_ENV['BLACKLIST']);
  264.         return $this->render('user/profile.html.twig', [
  265.             'user'              => $result,
  266.             'tickets'           => $nftTickets,
  267.             'collections'       => $spsCollections,
  268.             'items_pending'     => $items_pending,
  269.             'alias'             => $userAlias,
  270.             'sents'             => $sents["activity"],
  271.             'sells'             => $sells["tickets"],
  272.             'wallet_operations' => $wallet_operations,
  273.             'sales_history'     => $sales_history["activity"],
  274.             'blacklist'         => $blacklist
  275.         ]);
  276.     }
  277.     /**
  278.      * @Route("/extra-content/{ticketId}/{source}", name="extraContent")
  279.      */
  280.     public function extraContent(Request $request$ticketId$source): Response
  281.     {
  282.         // General function to set discount ref/affId
  283.         $this->functions->setDiscount($request);
  284.         
  285.         $em $this->doctrine->getManager();
  286.         $userId=$this->functions->getUserLogged();
  287.         if(!$userId){
  288.             $this->addFlash(
  289.                 'notice',
  290.                 'Debe iniciar sesión como usuario'
  291.             );
  292.             return $this->redirectToRoute('access');
  293.         }
  294.         $ticket $this->ticketing->curl("tickets/".$ticketId"normal", [], "GET");
  295.         $topMomentActive = !str_contains(strtolower($ticket['name']), 'space top moment') && !$ticket["active"];
  296.         if (empty($ticket) || $ticket["code"] != "200" || $ticket["user"]["userId"] != $userId || $topMomentActive){
  297.             $this->addFlash(
  298.                 'notice',
  299.                 'No se puede acceder al contenido extra'
  300.             );
  301.             return $this->redirectToRoute('home');
  302.         }
  303.         if(!array_key_exists("extraContent"$ticket) || !array_key_exists($source$ticket["extraContent"])){
  304.             $this->addFlash(
  305.                 'notice',
  306.                 'No se puede acceder al contenido extra'
  307.             );
  308.             return $this->redirectToRoute('home');
  309.         }
  310.         $source $ticket["extraContent"][$source];
  311.         // Path to your private key.  Be very careful that this file is not accessible
  312.         // from the web!
  313.         $private_key_filename = \dirname(__DIR__).'/../var/private_key.pem';
  314.         $key_pair_id 'K3HFP4XM97GS7X';
  315.         $expires time() + 86400// 1 hour
  316.         $canned_policy_stream_name $this->functions->get_canned_policy_stream_name($source$private_key_filename$key_pair_id$expires);
  317.         $client_ip $_SERVER['REMOTE_ADDR'];
  318.         $policy =
  319.         '{'.
  320.             '"Statement":['.
  321.                 '{'.
  322.                     '"Resource":"'$source '",'.
  323.                     '"Condition":{'.
  324.                         '"IpAddress":{"AWS:SourceIp":"' $client_ip '/32"},'.
  325.                         '"DateLessThan":{"AWS:EpochTime":' $expires '}'.
  326.                     '}'.
  327.                 '}'.
  328.             ']' .
  329.             '}';
  330.         $custom_policy_stream_name $this->functions->get_custom_policy_stream_name($source$private_key_filename$key_pair_id$policy);
  331.         //echo urldecode($canned_policy_stream_name);die();
  332.         return $this->redirect(urldecode($custom_policy_stream_name));
  333.         
  334.         return $this->render('user/extra-content.html.twig', [
  335.             'source' => $source,
  336.             'canned_policy_stream_name' => urldecode($canned_policy_stream_name),
  337.             'custom_policy_stream_name' => urldecode($custom_policy_stream_name)
  338.         ]);
  339.     }
  340.     /**
  341.      * @Route("/recover-password", name="recoverPassword")
  342.      */
  343.     public function recoverPassword(Request $requestMailerInterface $mailer): Response
  344.     {
  345.         $status "";
  346.         $email $request->get('email');
  347.         $result $this->ticketing->curl("users/".$email."/recover/password""normal", [], "GET");
  348.         if($email && $result){
  349.             if($result["code"] != 200 || (!array_key_exists('recoverCode'$result) && !array_key_exists('registerCode'$result))){
  350.                 $status "error";
  351.             } else {
  352.                 $checkCaptcha $this->functions->checkCaptcha($request->get('g-recaptcha-response'));
  353.                 if(!$checkCaptcha) {
  354.                     return $this->render('user/recover-password.html.twig', [
  355.                         'status' => 'errorCaptcha'
  356.                     ]);
  357.                 }
  358.                 if(array_key_exists('registerCode'$result) && !empty($result['registerCode'])){
  359.                     $mail = (new TemplatedEmail())
  360.                     ->from($this->getParameter('mailer_from'))
  361.                     ->to($email)
  362.                     ->subject('DOW - Registro')
  363.                     ->htmlTemplate('mail/register.html.twig')
  364.                     ->context([
  365.                         'userId' => $email,
  366.                         'registerCode' => $result["registerCode"],
  367.                     ]);
  368.                 } else {
  369.                     $mail = (new TemplatedEmail())
  370.                     ->from($this->getParameter('mailer_from'))
  371.                     ->to($email)
  372.                     ->subject('DOW - Recuperar contraseña')
  373.                     ->htmlTemplate('mail/recover-password.html.twig')
  374.                     ->context([
  375.                         'userId' => $email,
  376.                         'recoverCode' => $result["recoverCode"],
  377.                     ]);
  378.                 }
  379.                 $mailer->send($mail);
  380.                 $status "done";
  381.             }
  382.         }
  383.         return $this->render('user/recover-password.html.twig', [
  384.             'status'=>$status
  385.         ]);
  386.     }
  387.     /**
  388.      * @Route("/change-password/{userId}/{recoverCode}", name="changePassword")
  389.      */
  390.     public function changePassword(Request $request$userId$recoverCode): Response
  391.     {
  392.         $status "";
  393.         $password $request->get('password');
  394.         $check $this->ticketing->curl("users/".$userId"normal", array(), "GET");
  395.         if($check["code"] != 200 || !array_key_exists('recoverCode'$check) || $check["recoverCode"]!=$recoverCode){
  396.             $status "error2";
  397.         }
  398.         else{
  399.             if($request->get('send-form')){
  400.                 $result $this->ticketing->curl("users/change-password""normal", array("userId"=>$userId"password"=>$password"recoverCode"=>$recoverCode), "PATCH");
  401.                 if($result["code"] != 200){
  402.                     $status "error";
  403.                 } else {
  404.                     $status "done";
  405.                 }
  406.             }
  407.         }
  408.         return $this->render('user/change-password.html.twig', [
  409.             'status' => $status,
  410.             'id' => $userId,
  411.             'code' => $recoverCode
  412.         ]);
  413.     }
  414.     /**
  415.      * @Route("/withdrawal", name="withdrawal-request")
  416.      */
  417.     public function requestWithdrawal(Request $requestMailerInterface $mailer) {
  418.         $wh_token bin2hex(random_bytes(45));
  419.         $data $request->request->all();
  420.         $data['token'] = $wh_token;
  421.         $withdraw $this->ticketing->curl("wallet-operations""normal"$data"POST");
  422.         if($withdraw["code"] != 201) {            
  423.             return new JsonResponse([
  424.                 'status'    => false,
  425.                 'message'   => $withdraw['message'],
  426.                 'data'      => []                
  427.             ], 403);
  428.         }
  429.         $data['operation_id'] = $withdraw['id'];
  430.         $email = (new TemplatedEmail())
  431.             ->from($this->getParameter('mailer_from'))
  432.             ->to($_ENV['CLIENT_EMAIL'])
  433.             ->subject('DOW - request withdrawal')
  434.             ->htmlTemplate('mail/withdrawal-request.html.twig')
  435.             ->context($data);
  436.         $mailer->send($email);
  437.         return new JsonResponse([
  438.             'status' => true,
  439.             'message' => 'La retirada se ha solicitado con éxito.'
  440.         ]);
  441.     }
  442.     /**
  443.      * @Route("/withdrawal-remove", name="withdrawal-remove")
  444.      */
  445.     public function removeWithdrawal(Request $requestMailerInterface $mailer) {
  446.         $wh_token bin2hex(random_bytes(45));
  447.         $data $request->request->all();
  448.         $data['token'] = $wh_token;
  449.         $withdraw $this->ticketing->curl("wallet-operations-update/".$data['operation_id'], "normal"$data"POST");
  450.         if($withdraw["code"] != 201) {
  451.             return new JsonResponse([
  452.                 'status'    => false,
  453.                 'message'   => $withdraw['message'],
  454.                 'data'      => []
  455.             ], 403);
  456.         }
  457.         
  458.         
  459.         $email = (new TemplatedEmail())
  460.             ->from($this->getParameter('mailer_from'))
  461.             ->to($_ENV['CLIENT_EMAIL'])
  462.             ->subject('DOW - remove withdrawal')
  463.             ->htmlTemplate('mail/withdrawal-remove.html.twig')
  464.             ->context([
  465.                 'operation_id' => $withdraw['id'],
  466.                 'account_name' => $withdraw['accountName'],
  467.                 'account' => $withdraw['account'],
  468.                 'amount' => $withdraw['amount']
  469.             ]);
  470.         $mailer->send($email);
  471.         
  472.         return new JsonResponse([
  473.             'status' => true,
  474.             'message' => 'La retirada se ha anulado con éxito.'
  475.         ]);
  476.     }
  477.     /**
  478.      * @Route("/anonymous-user-profile/{token}", name="anonymousUserProfile")
  479.      */
  480.     public function anonymousUserProfile(Request $request$token): Response
  481.     {
  482.         $userId $this->functions->getUserLogged();
  483.         if ($userId)
  484.             return $this->redirectToRoute('userProfile');
  485.         // General function to set discount ref/affId
  486.         $this->functions->setDiscount($request);
  487.         $em $this->doctrine->getManager();
  488.         $userId $this->functions->decrypt($token);
  489.         $anyUser '/false';
  490.         $result $this->ticketing->curl("users/".$userId.$anyUser"normal", [], "GET");
  491.         if($result['enabled']){
  492.             $this->addFlash(
  493.                 'notice',
  494.                 'Debe iniciar sesión como usuario'
  495.             );
  496.             return $this->redirectToRoute('access',["redirect" => $this->generateUrl('userProfile')]);
  497.         }
  498.         $tickets        $this->ticketing->curl("tickets?onSaleByUser=false&user=".$userId."&orderBy=event&limit=1000""normal", [], "GET");
  499.         $items_pending  $em->getRepository(Item::class)->search("count",["web_pending" => TRUE]);
  500.         // Separate collections and tickets
  501.         $spsCollections = [];
  502.         $nftTickets     = [];
  503.         date_default_timezone_set("Europe/Madrid");
  504.         foreach($tickets['tickets'] as $ticket) {
  505.             if (date("Y-m-d") > $ticket['event']['dateEvent']) {
  506.                 $spsCollections[] = $ticket;
  507.             } else {
  508.                 // Automatic activation for tickets
  509.                 if (!$ticket["active"] && (date("Y-m-d H:i:s") >= $ticket['event']['dateActivation'])
  510.                     && (date("Y-m-d") == date("Y-m-d"strtotime($ticket['event']['dateEvent']))) ) {
  511.                     // get event
  512.                     $event $this->ticketing->curl("events/".$ticket["event"]["id"], "normal", [], "GET");
  513.                     $activation $this->ticketing->curl("tickets/".$ticket['id']."/activate""normal", ["latitude" => $event["latitude"], "longitude" => $event["longitude"]], "PATCH");
  514.                     if ($activation["code"] == "200") {
  515.                         $ticket['active'] = true;
  516.                         $ticket['accessCode'] = $activation['accessCode'];
  517.                     }
  518.                 }
  519.                 $nftTickets[] = $ticket;
  520.             }
  521.         }
  522.         return $this->render('user/anonymous-profile.html.twig', [
  523.             'user'              => $result,
  524.             'tickets'           => $nftTickets,
  525.             'collections'       => $spsCollections,
  526.             'items_pending'     => $items_pending,
  527.             'anonymous'         => TRUE
  528.         ]);
  529.     }
  530. }