src/Controller/AAR/AuthController.php line 42

Open in your IDE?
  1. <?php
  2. namespace App\Controller\AAR;
  3. use App\Controller\Master\DefaultController as DefaultController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  9. use App\Entity\Purchase;
  10. use App\Entity\PurchaseItem;
  11. use App\Entity\User;
  12. use App\Entity\Contact;
  13.  
  14. use App\Utils\ContentHelper;
  15. use App\Utils\UserHelper;
  16. use App\Utils\ContactHelper;
  17. use App\Utils\EmailHelper;
  18. use App\Utils\OrderHelper;
  19. use App\Utils\LeadHelper;
  20. use App\Security\WordPressPasswordEncoder;
  21. use App\Exception\ResourceNotFoundException;
  22. use Symfony\Bridge\Doctrine\Security\RememberMe\DoctrineTokenProvider;
  23. use Symfony\Component\Security\Core\Authentication\RememberMe\PersistentToken;
  24. use Symfony\Component\HttpFoundation\Cookie;
  25. class AuthController extends DefaultController
  26. {
  27.     
  28.     /**
  29.      * @Route("/sign-in",
  30.      *    name="sign-in-post_aar",
  31.      *    defaults={"message": ""},
  32.      *  methods={"POST"}
  33.      *    )
  34.      */
  35.     public function signInPost(
  36.         Request $request,
  37.         $message "",
  38.         UserHelper $userHelper,
  39.         EmailHelper $emailHelper,
  40.         DoctrineTokenProvider $doctrineTokenProvider
  41.     
  42.     {
  43.         $username $request->get("_username");
  44.         $password $request->get("_password");
  45.         if(!$emailHelper->checkCaptcha($request->get("g-recaptcha-response"))) {
  46.             $this->addFlash("warning""The reCAPTCHA was invalid. Please try again.");
  47.             $message = array (
  48.                 "type" => "warning",
  49.                 "text" => "The reCAPTCHA was invalid. Please try again.",
  50.             );
  51.             return $this->defaultRender("forms/sign-in.html.twig", [
  52.                 "message" => $message,
  53.             ]);
  54.         }
  55.         $session $request->getSession();
  56.         $nRoute $session->get("non_sign_in_route");
  57.         $path = !empty($nRoute["path"]) ? $nRoute["path"] : "/";
  58.         $result $userHelper->signIn(
  59.             $username
  60.             $password,
  61.             //$this->get("security.token_storage"),
  62.             //$this->get("event_dispatcher")
  63.         );
  64.         if(is_array($result) && $result["status"] == 2) {
  65.             return new RedirectResponse("/mfa/{$result['uid']}/{$result['token']}");
  66.         }
  67.         elseif (is_array($result) && $result["status"] == 1) {
  68.             $this->addFlash("success""You have successfully logged in.");
  69.             $response = new RedirectResponse($path);
  70.             $response $this->setRememberMe($request$response$doctrineTokenProvider$username);
  71.         }
  72.         else {            
  73.             $message = array (
  74.                 "type" => "warning",
  75.                 "text" => "Invalid credentials provided.",
  76.             );
  77.             return $this->defaultRender("forms/sign-in.html.twig", [
  78.                 "message" => $message,
  79.             ]);
  80.         }
  81.         
  82.         return $response;
  83.     }
  84.     /**
  85.      * @Route("/sign-in",
  86.      *    name="sign-in_aar",
  87.      *    defaults={"message": ""}
  88.      *    )
  89.      */
  90.     public function signIn(Request $requestAuthenticationUtils $authUtils$message ""WordPressPasswordEncoder $wpEncoder
  91.     {
  92.         //just testing: $message = $wpEncoder->encodePassword("M0byd1ck771!"); 
  93.         //$message = null;
  94.         
  95.         $message $request->query->get("message") ?? "";
  96.         
  97.         $error $authUtils->getLastAuthenticationError();
  98.         $lastUsername $authUtils->getLastUsername();
  99.         
  100.         if ($error) {
  101.             $message = array (
  102.                 "type" => "warning",
  103.                 "text" => "Invalid credentials.",
  104.             );
  105.         }
  106.         
  107.         
  108.         return $this->defaultRender("forms/sign-in.html.twig", [
  109.             "last_username" => $lastUsername,
  110.             // "error" => $error,
  111.             "message" => $message,
  112.         ]);
  113.     }
  114.     
  115.     /**
  116.      * @Route("/forgot-password", name="forgot-password_aar")
  117.      */
  118.     public function forgotPassword (
  119.         Request $request,
  120.         UserHelper $userHelper,
  121.         EmailHelper $emailHelper
  122.     ) {        
  123.         // should we rate limit ??
  124.         $username $request->request->get("username");
  125.         $message = array ();
  126.         
  127.         if ($username) {
  128.             $rsp $userHelper->forgotPassword($username);
  129.             $message = array(
  130.                 "type" => $rsp["status"] ? "success" "warning",
  131.                 "text" => $rsp["message"],
  132.             );
  133.         }
  134.         
  135.         return $this->defaultRender("forms/forgot-password.html.twig", [
  136.             "message" => $message,
  137.         ]);
  138.         
  139.         
  140.     }
  141.     
  142.     /**
  143.      * @Route("/forgot-username", name="forgot-username_aar", methods={"POST"})
  144.      */
  145.     public function forgotUsername (
  146.         Request $request,
  147.         UserHelper $userHelper
  148.     ) {
  149.         $email $request->get("email");
  150.         $rsp $userHelper->forgotUsername($email);
  151.         $msg = array ();
  152.         
  153.         if ($rsp["status"]) {
  154.             $msg = array (
  155.                 "type" => "success",
  156.                 "text" => $rsp["message"],
  157.             );
  158.         } 
  159.         
  160.         else {
  161.             sleep (3);
  162.             $msg = array (
  163.                 "type" => "warning",
  164.                 "text" => $rsp["message"],
  165.             );
  166.         }
  167.         
  168.         return $this->defaultRender("forms/forgot-username.html.twig", [
  169.             "message" => $msg
  170.         ]);
  171.         
  172.         /*
  173.         try {
  174.             $user = $userHelper->getUserByEmail($email);
  175.             $username = $user->getUsername();
  176.             
  177.             return $this->defaultRender("forms/sign-in.html.twig", [
  178.                 "message" => [
  179.                     "type" => "success",
  180.                     "text" => "The username linked to that account is <strong>{$username}</strong>.",
  181.                 ]
  182.             ]);
  183.             
  184.         } catch (ResourceNotFoundException $e) {
  185.             sleep(3);
  186.             return $this->defaultRender("forms/forgot-username.html.twig", [
  187.                 "message" => [
  188.                     "type" => "warning",
  189.                     "text" => "That e-mail address was not found in the system.",
  190.                 ]
  191.             ]);
  192.         } 
  193.         */    
  194.     }
  195.     
  196.     /**
  197.      * @Route("/forgot-username", name="forgot-username-form_aar")
  198.      */
  199.     public function viewForgotUsername (
  200.     
  201.     ) {
  202.         
  203.         return $this->defaultRender("forms/forgot-username.html.twig", [
  204.             "message" => array ()
  205.         ]);
  206.     }
  207.     
  208.     /**
  209.      * @Route("/rcs-reset-password/{id}/{token}", name="reset-password-form_aar", defaults={"message": ""})
  210.      */
  211.     public function viewResetPassword (
  212.         UserHelper $userHelper,
  213.         $id
  214.         $token,
  215.         $message ""
  216.     ) {
  217.         
  218.         try {
  219.             $user $userHelper->getUserById($id);
  220.             
  221.             // if token does not match 
  222.             if ($token != $user->getResetPwToken()) {
  223.                 return $this->defaultRender("errors/404.html.twig");
  224.             }
  225.             
  226.             return $this->defaultRender("forms/reset-password.html.twig", [
  227.                 "user" => $user,
  228.                 "id" => $id,
  229.                 "token" => $token,
  230.                 "message" => $message
  231.             ]);
  232.         } catch (ResourceNotFoundException $e) {
  233.             
  234.         }
  235.     }
  236.     
  237.     /**
  238.      * @Route("/rcs-reset-password", name="reset-password_aar", methods={"POST"})
  239.      */
  240.     public function resetPassword (
  241.         Request $request,
  242.         WordPressPasswordEncoder $wpEncoder,
  243.         UserHelper $userHelper
  244.     ) {
  245.         
  246.         $id $request->get("id");
  247.         $token $request->get("token");
  248.         $password1 $request->get("password1");
  249.         $password2 $request->get("password2");
  250.         
  251.         $rsp $userHelper->resetPassword(
  252.             $id,
  253.             $token,
  254.             $password1,
  255.             $password2
  256.         );
  257.         
  258.         $msg = array ();
  259.         
  260.         if ($rsp["status"]) {
  261.             $msg = array (
  262.                 "type" => "success",
  263.                 "text" => $rsp["message"],
  264.             );
  265.             return $this->redirectToRoute("sign-in_aar", [
  266.                 "message" => $msg
  267.             ]);
  268.         } 
  269.         
  270.         else {
  271.             $msg = array (
  272.                 "type" => "warning",
  273.                 "text" => $rsp["message"],
  274.             );
  275.             return $this->redirectToRoute("reset-password-form_aar", [
  276.                "id" => $id,
  277.                "token" => $token,
  278.                "message" => $msg
  279.             ]);
  280.         }
  281.         
  282.     }
  283.      
  284.     /**
  285.      * @Route("/sign-up", name="sign-up_aar", methods={"POST"})
  286.      */
  287.     public function signUp (
  288.         Request $request,
  289.         UserHelper $userHelper,
  290.         EmailHelper $emailHelper,
  291.         LeadHelper $leadHelper
  292.     ) {
  293.         
  294.         $username $request->get("username");
  295.         $email $request->get("email");
  296.         $email trim($email);
  297.         $firstname $request->get("firstname");
  298.         $lastname $request->get("lastname");
  299.         $address1 $request->get("address1");
  300.         $address2 $request->get("address2");
  301.         $city $request->get("city");
  302.         $state $request->get("state");
  303.         $zip $request->get("zip");
  304.         
  305.         if($emailHelper->checkCaptcha($request->get("g-recaptcha-response"))) {
  306.             
  307.             $password1 $request->get("password1");
  308.             $password2 $request->get("password2");
  309.             
  310.             $lead["username"] = $username;
  311.             $lead["email"] = $email;
  312.             $lead["firstname"] = $firstname;
  313.             $lead["lastname"] = $lastname;
  314.             $lead["address1"] = $address1;
  315.             $lead["address2"] = $address2;
  316.             $lead["city"] = $city;
  317.             $lead["state"] = $state;
  318.             $lead["zip"] = $zip;
  319.             
  320.             $lead $leadHelper->saveLead($leadnull$request);
  321.             $em $this->getDoctrine()->getManager();
  322.             $em->persist($lead);
  323.             $em->flush();
  324.             
  325.             
  326.             $rsp $userHelper->signUp(
  327.                 "bypass",
  328.                 "bypass",
  329.                 $username,
  330.                 $email,
  331.                 $password1,
  332.                 $password2
  333.             );
  334.             
  335.             if ($rsp["status"]) {
  336.                 return $this->defaultRender("forms/sign-in.html.twig", [
  337.                     "message" => $rsp["message"],
  338.                 ]);
  339.             }
  340.             
  341.             return $this->defaultRender("forms/sign-up.html.twig", [
  342.                 "username" => $username,
  343.                 "email" => $email,
  344.                 "firstname" => $firstname,
  345.                 "lastname" => $lastname,
  346.                 "address1" => $address1,
  347.                 "address2" => $address2,
  348.                 "city" => $city,
  349.                 "state" => $state,
  350.                 "zip" => $zip,
  351.                 "message" => $rsp["message"],
  352.             ]);
  353.             
  354.         }
  355.         else {
  356.             return $this->defaultRender("forms/sign-up.html.twig", [
  357.                 "username" => $username,
  358.                 "email" => $email,
  359.                 "firstname" => $firstname,
  360.                 "lastname" => $lastname,
  361.                 "address1" => $address1,
  362.                 "address2" => $address2,
  363.                 "city" => $city,
  364.                 "state" => $state,
  365.                 "zip" => $zip,
  366.                 "message" => [
  367.                     "type" => "warning",
  368.                     "text" => "The reCAPTCHA was invalid. Please try again.",
  369.                 ],
  370.             ]);
  371.         }
  372.     }
  373.     
  374.     /**
  375.      * @Route("/sign-up", name="sign-up-form_aar")
  376.      */
  377.     public function viewSignUp (
  378.     
  379.     ) {
  380.         
  381.         return $this->defaultRender("forms/sign-up.html.twig", [
  382.             "username" => "",
  383.             "email" => "",
  384.             "message" => array (
  385.             
  386.             )
  387.         ]);
  388.     }
  389.     
  390.     
  391.     /**
  392.      * @Route("/activate-account", name="activate_aar", methods={"POST"})
  393.      */
  394.     public function activateAccount (
  395.         Request $request,
  396.         UserHelper $userHelper
  397.     ) {
  398.         
  399.         $id $request->get("id");
  400.         $token $request->get("token");
  401.         $rsp $userHelper->activateAccount($id$token);
  402.         
  403.         if ($rsp["status"]) {
  404.             
  405.             /*return $this->defaultRender("/", [
  406.                 "message" => array (
  407.                     "type" => "success",
  408.                     "text" => $rsp["message"],
  409.                 )
  410.             ]);*/
  411.             
  412.             $this->addFlash("success"$rsp["message"]);
  413.             return $this->redirect("/");
  414.             
  415.             //$this->addFlash("success", $rsp["message"]);
  416.             //return $this->redirect('http://staging.rooferscoffeeshop.com/post-a-classified-ad/2');
  417.         
  418.         
  419.         else {
  420.             return $this->defaultRender("forms/send-activation.html.twig", [
  421.                 "type" => "warning",
  422.                 "text" => $rsp["message"],
  423.             ]);
  424.         }
  425.         
  426.         
  427.         /*
  428.         try {
  429.             $id = $request->get("id");
  430.             $token = $request->get("token");
  431.             
  432.             $user = $userHelper->getUserById($id);
  433.             $expires = $user->getActivationExpires();
  434.             
  435.             if ($user->getActivationToken() == $token && 
  436.                 new \DateTime("now") < $expires
  437.             ) {
  438.                 $user->setActivationToken(null);
  439.                 $user->setActivationExpires(null);
  440.                 // $user->setIsActive(1);
  441.                 $user->setStatus(1);
  442.                 
  443.                 $em = $this->getDoctrine()->getManager();
  444.                 $em->persist($user);
  445.                 $em->flush();
  446.                 $em->clear();
  447.                 
  448.                 return $this->defaultRender("forms/sign-in.html.twig", [
  449.                     "message" => array (
  450.                         "type" => "success",
  451.                         "text" => "The account has been activated. You may now sign in.",
  452.                     ),
  453.                 ]);
  454.             }
  455.         } 
  456.         
  457.         catch (ResourceNotFoundException $e) {
  458.             // ... ignore
  459.         }
  460.         
  461.         return $this->defaultRender("forms/send-activation.html.twig", [
  462.             "message" => array (
  463.                 "type" => "warning",
  464.                 "text" => "The provided token was not found in the system. It is possible that it has expired. If the token has expired, you will need to sign up again.",
  465.             ),
  466.         ]);
  467.         */
  468.         
  469.     }
  470.     
  471.     /**
  472.      * @Route("/activate-account/{id}/{token}", name="view-activation-form_aar")
  473.      */
  474.     public function viewActivateAccount (
  475.         UserHelper $userHelper,
  476.         $id "",
  477.         $token ""
  478.     ) {
  479.         try {
  480.             $user $userHelper->getUserById($id);
  481.             $expires $user->getActivationExpires();
  482.             if ($token == $user->getActivationToken() && 
  483.                 new \DateTime("now") < $expires 
  484.             ) {
  485.                 return $this->defaultRender("forms/activate.html.twig", [
  486.                     "username" => $user->getUsername(),
  487.                     "id" => $id,
  488.                     "token" => $token,
  489.                 ]);
  490.             }
  491.         } catch (ResourceNotFoundException $e) {
  492.             // ... ignore
  493.         }
  494.         
  495.         return $this->defaultRender("forms/send-activation.html.twig", [
  496.             "message" => array (
  497.                 "type" => "warning",
  498.                 "text" => "The provided token was not found in the system. It is possible that it has expired. If the token has expired, you will need to sign up again or re-send the activation link.",
  499.             ),
  500.         ]);
  501.     }
  502.     
  503.     /**
  504.      * @Route("/send-activation", name="send-activation_aar", methods={"POST"})
  505.      */
  506.     public function sendActivation (
  507.         Request $request,
  508.         UserHelper $userHelper,
  509.         EmailHelper $emailHelper
  510.     ) {
  511.         
  512.         $email $request->get("email");
  513.         $resp $userHelper->sendActivation($email);
  514.                  
  515.         if ($resp["status"]) {
  516.             return $this->defaultRender("forms/send-activation.html.twig", [
  517.                 "message" => array (
  518.                     "type" => "success",
  519.                     "text" => $resp["message"],
  520.                 )
  521.             ]);
  522.         }
  523.         
  524.         return $this->defaultRender("forms/send-activation.html.twig", [
  525.             "message" => array (
  526.                 "type" => "warning",
  527.                 "text" => $resp["message"],
  528.             )
  529.         ]);
  530.         
  531.         /*
  532.         try {
  533.             $email = $request->get("email");
  534.             $user = $userHelper->getUserByEmail($email);
  535.             $uid = $user->getId();
  536.             $token = $user->getActivationToken();
  537.             $expires = $user->getActivationExpires();
  538.             
  539.             $pooled = $emailHelper->sendEmail($email, "Account Activation Link", [
  540.                 ["p" => "Hello {$user->getFullName()},"],
  541.                 ["p" => "You recently requested to receive an activation link for your RoofersCoffeeShop account. Click the button below to activate it."],
  542.                 ["button" => [
  543.                     "text" => "Activate Account",
  544.                     "href" => "https://rooferscoffeeshop.com/activate-account/{$uid}/{$token}",
  545.                 ]],
  546.                 ["p" => "If you did not request a password reset, please ignore this email or reply to let us know. This password reset link is only valid for the next 2 hours."],
  547.             ]);
  548.             
  549.             if ($pooled) {
  550.                 return $this->defaultRender("forms/send-activation.html.twig", [
  551.                     "message" => array (
  552.                         "type" => "success",
  553.                         "text" => "The activation link has been sent to that e-mail address.",
  554.                     )
  555.                 ]);
  556.             } 
  557.             
  558.             return $this->defaultRender("forms/send-activation.html.twig", [
  559.                 "message" => array (
  560.                     "type" => "warning",
  561.                     "text" => "An error occurred while trying to send a system e-mail. If this error continues to occur please contact support.",
  562.                 )
  563.             ]);
  564.             
  565.         } catch (ResourceNotFoundException $e) {
  566.             
  567.         }
  568.         
  569.         return $this->defaultRender("forms/send-activation.html.twig", [
  570.             "message" => array (
  571.                 "type" => "warning",
  572.                 "text" => "No account found matching that criteria.",
  573.             )
  574.         ]);
  575.         */
  576.         
  577.     }
  578.     
  579.     /**
  580.      * @Route("/send-activation", name="send-activation-form_aar")
  581.      */
  582.     public function viewSendActivation (
  583.         UserHelper $userHelper
  584.     ) {
  585.         return $this->defaultRender("forms/send-activation.html.twig", [
  586.             "message" => array (),
  587.         ]);
  588.     }
  589.     
  590.     
  591.     /**
  592.      * @Route("/mfa/{id}/{token}", name="view-mfa-form_aar")
  593.      */
  594.     public function viewMfa (
  595.         UserHelper $userHelper,
  596.         $id "",
  597.         $token ""
  598.     ) {
  599.         try {
  600.             $user $userHelper->getUserById($id);
  601.             $expires $user->getMfaTokenExpires();
  602.             if ($token == $user->getMfaToken() && 
  603.                 new \DateTime("now") < $expires 
  604.             ) {
  605.                 return $this->defaultRender("forms/mfa.html.twig", [
  606.                     "username" => $user->getUsername(),
  607.                     "id" => $id,
  608.                     "token" => $token,
  609.                 ]);
  610.             }
  611.         } catch (ResourceNotFoundException $e) {
  612.             // ... ignore
  613.         }
  614.         
  615.         return $this->defaultRender("forms/sign-in.html.twig", [
  616.             "message" => array (
  617.                 "type" => "warning",
  618.                 "text" => "The provided token was not found in the system. It is possible that it has expired. Try signing in again.",
  619.             ),
  620.         ]);
  621.     }
  622.     /**
  623.      * @Route("/mfasignin", name="mfasignin_aar", methods={"POST"})
  624.      */
  625.     public function mfaSignIn (
  626.         Request $request,
  627.         UserHelper $userHelper,
  628.         DoctrineTokenProvider $doctrineTokenProvider
  629.     ) {
  630.         
  631.         $id $request->get("id");
  632.         $token $request->get("token");
  633.         $code $request->get("code");
  634.         $rsp $userHelper->signInMfa($id$token$code);
  635.         
  636.         if ($rsp["status"]) {
  637.             
  638.             /*return $this->defaultRender("/", [
  639.                 "message" => array (
  640.                     "type" => "success",
  641.                     "text" => $rsp["message"],
  642.                 )
  643.             ]);*/
  644.             
  645.             $session $request->getSession();
  646.             $nRoute $session->get("non_sign_in_route");
  647.             $path = !empty($nRoute["path"]) ? $nRoute["path"] : "/";
  648.             $user $userHelper->getUserById($id);
  649.             $username $user->getUsername();
  650.             
  651.             $this->addFlash("success""You have successfully logged in.");
  652.             $response = new RedirectResponse($path);
  653.             $response $this->setRememberMe($request$response$doctrineTokenProvider$username);
  654.             return $response;
  655.             
  656.             //return $this->redirect("/");
  657.             
  658.             //$this->addFlash("success", $rsp["message"]);
  659.             //return $this->redirect('http://staging.rooferscoffeeshop.com/post-a-classified-ad/2');
  660.         
  661.         
  662.         else {
  663.             return $this->defaultRender("forms/mfa.html.twig", [
  664.                 //"username" => $user->getUsername(),
  665.                 "id" => $id,
  666.                 "token" => $token,
  667.                 "message" => array (
  668.                     "type" => "warning",
  669.                     "text" => $rsp["message"],
  670.                 )
  671.             ]);
  672.         }
  673.         
  674.     }
  675.     public function setRememberMe(
  676.         $request,
  677.         $response,
  678.         $doctrineTokenProvider,
  679.         $username
  680.     ) {
  681.         $series base64_encode(random_bytes(64));
  682.         $tokenValue base64_encode(random_bytes(64));
  683.         $user $this->user;
  684.         $doctrineTokenProvider->createNewToken(
  685.             new PersistentToken(
  686.                 User::class,
  687.                 //$user->getUsername(),
  688.                 $username,
  689.                 $series,
  690.                 $tokenValue,
  691.                 new \DateTime()
  692.             )
  693.         );
  694.         
  695.         $options = [
  696.             'name' => 'REMEMBERME',
  697.             'lifetime' => 604800,
  698.             'path' => '/',
  699.             //'domain' => 'staging.rooferscoffeeshop.com',
  700.             'domain' => null,
  701.             'secure' => true,
  702.             'httponly' => true,
  703.             'samesite' => 'strict',
  704.         ];
  705.         //samesite = 
  706.         //public const SAMESITE_NONE = 'none';
  707.         //public const SAMESITE_LAX = 'lax';
  708.         //public const SAMESITE_STRICT = 'strict';
  709.         $cookieParts = [$series$tokenValue];
  710.         
  711.         foreach ($cookieParts as $cookiePart) {
  712.             if (str_contains($cookiePart":")) {
  713.                 throw new \InvalidArgumentException(sprintf('$cookieParts should not contain the cookie delimiter "%s".'":"));
  714.             }
  715.         }
  716.         $encodedCookie base64_encode(implode(":"$cookieParts));
  717.         //$response = new Response();
  718.         $response->headers->setCookie(
  719.             new Cookie(
  720.                 $options['name'],
  721.                 //$this->encodeCookie([$series, $tokenValue]),
  722.                 $encodedCookie,
  723.                 time() + $options['lifetime'],
  724.                 $options['path'],
  725.                 $options['domain'],
  726.                 $options['secure'] ?? $request->isSecure(),
  727.                 $options['httponly'],
  728.                 false,
  729.                 $options['samesite']
  730.             )
  731.         );
  732.         return $response;
  733.     }
  734.     /**
  735.      * @Route("/account", methods={"POST"}, name="post-account_aar")
  736.      */
  737.     public function updateAccount (
  738.         Request $request,
  739.         UserHelper $userHelper
  740.     ) {
  741.         // if we have a current user
  742.         if ($this->user) {
  743.             // grab the fields
  744.             $data = [];
  745.             
  746.             if ($request->get("firstname")) {
  747.                 $data["firstname"] = $request->get("firstname");
  748.             }
  749.             
  750.             if ($request->get("lastname")) {
  751.                 $data["lastname"] = $request->get("lastname");
  752.             }
  753.             
  754.             if ($request->get("displayname")) {
  755.                 $data["displayname"] = $request->get("displayname");
  756.             }
  757.             
  758.             if ($request->get("username")) {
  759.                 $data["username"] = $request->get("username");
  760.             }
  761.             
  762.             if ($request->get("email")) {
  763.                 $data["email"] = $request->get("email");
  764.             }
  765.             
  766.             if ($request->get("password1")) {
  767.                 $data["password1"] = $request->get("password1");
  768.                 $data["password2"] = $request->get("password2");
  769.                 $data["password3"] = $request->get("password3");
  770.             }
  771.             
  772.             // user avatar
  773.             if ($request->files->get("avatar")) {
  774.                 $data["avatar"] = $request->files->get("avatar");
  775.             }
  776.             
  777.             else if ($request->get("remove_avatar")) {
  778.                 $data["remove_avatar"] = true;
  779.             }
  780.             
  781.             //Update notifications 
  782.             $data["usermeta"] = [];
  783.             $notifications $request->get("notifications");
  784.             if(empty($notifications)) {
  785.                 $notifications = [];
  786.             }
  787.             $data["usermeta"]["member_notification_forum"] = in_array("forum"$notifications);
  788.             $data["usermeta"]["member_notification_page"] = in_array("page"$notifications);
  789.             $data["usermeta"]["member_notification_classifieds"] = in_array("classifieds"$notifications);
  790.             
  791.             
  792.             $rsp $userHelper->updateAccount(
  793.                 $this->user->getId(),
  794.                 $data
  795.             );
  796.             $this->addFlash($rsp["type"], $rsp["message"]);
  797.         }
  798.         
  799.         return $this->redirectToRoute("account_aar");
  800.     }
  801.     /**
  802.      * @Route("/account/profile", methods={"POST"}, name="post-account-profile_aar")
  803.      */
  804.     public function updateAccountProfile (
  805.         Request $request,
  806.         ContactHelper $contactHelper,
  807.         EmailHelper $emailHelper
  808.     ) {
  809.         
  810.         $user $this->user;
  811.         // if we have a current user
  812.         if($user) {
  813.             
  814.             $contact $user->getContact();
  815.             if(!$contact) {
  816.                 $contact = new Contact();
  817.                 $user->setContact($contact);
  818.                 $entityManager $this->getDoctrine()->getManager();
  819.                 $entityManager->persist($user);
  820.                 $entityManager->flush();
  821.             }
  822.             
  823.             $contactHelper->updateContact($contact->getId(), $request->request->all());
  824.             $this->addFlash("success""Profile updated.");
  825.             
  826.             $emailHelper->sendEmail(
  827.                 ["rcs@rooferscoffeeshop.com"],
  828.                 "Profile Updated - {$user->getUsername()}",
  829.                 [
  830.                     ["p" => "{$user->getUsername()} has updated their account's profile information."],
  831.                     ["p" => "Visit the User Dashboard to view these changes."],
  832.                     ["button" => [
  833.                         "text" => "User Dashboard",
  834.                         "href" => "https://www.rooferscoffeeshop.com/user-dashboard",
  835.                     ]],
  836.                 ]
  837.             );
  838.             
  839.         }
  840.         
  841.         return $this->redirectToRoute("account_aar", [
  842.            "slug" => "profile",
  843.         ]);
  844.     }
  845.     
  846.     /**
  847.      * @Route("/account/content/{type}", name="account-content-filter_aar")
  848.      */
  849.     public function viewAccountContentType (
  850.         Request $request,
  851.         UserHelper $userHelper,
  852.         $type ""
  853.     ) {
  854.         if (!$this->user) {
  855.             return $this->redirect("/sign-in");
  856.         }
  857.         $user $this->user;
  858.         
  859.         return $this->defaultRender("forms/user-account.html.twig", [
  860.             "user" => $user,
  861.             "slug" => "content",
  862.             "type" => $type,
  863.             
  864.             "meta" => [
  865.                 "breadcrumbs" => [
  866.                     [
  867.                         "title" => "Your Account",
  868.                         "href" => "/account",
  869.                     ]
  870.                 ]
  871.             ]
  872.         ]);
  873.         
  874.         
  875.     }
  876.     
  877.     /**
  878.      * @Route("/account/membership/cancel", methods={"POST"}, name="post-account-membership-cancel_aar")
  879.      */
  880.     public function cancelAccountMembership (
  881.         Request $request,
  882.         UserHelper $userHelper,
  883.         OrderHelper $orderHelper
  884.     ) {
  885.         if (!$this->user) {
  886.             return $this->redirect("/sign-in");
  887.         }
  888.         $user $this->user;
  889.         
  890.         $manager $this->getDoctrine()->getManager();
  891.         $item $manager->getRepository(PurchaseItem::class)
  892.             ->findOneBy([
  893.                "id" => $request->get("item_id"),
  894.             ]);
  895.         
  896.         $item->setStatus(PurchaseItem::STATUS_ACTIVE);
  897.         $manager->persist($item);
  898.         $manager->flush();
  899.         
  900.         $this->addFlash("success""Your membership has been cancelled and will not auto-renew.");
  901.         return $this->redirectToRoute("account_aar", [
  902.            "slug" => "membership",
  903.         ]);
  904.     }
  905.     
  906.     /**
  907.      * @Route("/account/membership/continue", methods={"POST"}, name="post-account-membership-continue_aar")
  908.      */
  909.     public function continueAccountMembership (
  910.         Request $request,
  911.         UserHelper $userHelper,
  912.         OrderHelper $orderHelper
  913.     ) {
  914.         if (!$this->user) {
  915.             return $this->redirect("/sign-in");
  916.         }
  917.         $user $this->user;
  918.         
  919.         $manager $this->getDoctrine()->getManager();
  920.         $item $manager->getRepository(PurchaseItem::class)
  921.             ->findOneBy([
  922.                "id" => $request->get("item_id"),
  923.             ]);
  924.         
  925.         $item->setStatus($item->getPaymentFailed() ? PurchaseItem::STATUS_ACTIVE_RENEWING_FINAL PurchaseItem::STATUS_ACTIVE_RENEWING);
  926.         $manager->persist($item);
  927.         $manager->flush();
  928.         
  929.         $this->addFlash("success""Your membership has been re-activated and will now automatically renew.");
  930.         return $this->redirectToRoute("account_aar", [
  931.            "slug" => "membership",
  932.         ]);
  933.     }
  934.     
  935.     /**
  936.      * @Route("/account/membership", methods={"POST"}, name="post-account-membership_aar")
  937.      */
  938.     public function updateAccountMembership (
  939.         Request $request,
  940.         UserHelper $userHelper,
  941.         OrderHelper $orderHelper
  942.     ) {
  943.         
  944.         if (!$this->user) {
  945.             return $this->redirect("/sign-in");
  946.         }
  947.         $user $this->user;
  948.         
  949.         $payment $request->get("payment");
  950.         $card $request->get("card");
  951.         
  952.         //expiration date
  953.         $card["card_expires"] = $card["card_expires_month"].$card["card_expires_year"];
  954.         
  955.         if (!$payment || !isset($payment["terms"])) {
  956.             $this->addFlash("warning""You must accept the terms and conditions.");
  957.             return $this->redirectToRoute("account_aar", [
  958.                "slug" => "membership",
  959.             ]);
  960.         }
  961.         
  962.         $result $orderHelper->generateToken(
  963.            $payment["firstname"],
  964.            $payment["lastname"],
  965.            $payment["company"],
  966.            $payment["address1"],
  967.            $payment["address2"],
  968.            $payment["city"],
  969.            $payment["state"],
  970.            $payment["zip"],
  971.            $payment["country"],
  972.            $payment["email"],
  973.            $payment["phone"],
  974.            $_SERVER["REMOTE_ADDR"],
  975.            $card["card_number"],
  976.            $card["card_expires"],
  977.            $card["card_csc"]
  978.         );
  979.         
  980.         if ($result["result"] == "APPROVAL" || $result["result"] == "APPROVED") {
  981.             
  982.             $last4 $card["card_number"];
  983.             $last4 preg_replace("/[^0-9]/"''$last4);
  984.             $last4 substr($last4, -4);
  985.             
  986.             $user->setUsermetum("has_payment_info""1");
  987.             $user->setUsermetum("payment_first_name"$payment["firstname"]);
  988.             $user->setUsermetum("payment_last_name"$payment["lastname"]);
  989.             $user->setUsermetum("payment_company"$payment["company"]);
  990.             $user->setUsermetum("payment_address_line_1"$payment["address1"]);
  991.             $user->setUsermetum("payment_address_line_2"$payment["address2"]);
  992.             $user->setUsermetum("payment_city"$payment["city"]);
  993.             $user->setUsermetum("payment_state_province"$payment["state"]);
  994.             $user->setUsermetum("payment_postal_code"$payment["zip"]);
  995.             $user->setUsermetum("payment_country"$payment["country"]);
  996.             $user->setUsermetum("payment_email"$payment["email"]);
  997.             $user->setUsermetum("payment_phone"$payment["phone"]);
  998.             $user->setUsermetum("payment_last4"$last4);
  999.             $user->setUsermetum("payment_exp"$card["card_expires"]);
  1000.             //$user->setUsermetum("payment_cvv2", $card["card_csc"]);
  1001.             $user->setUsermetum("payment_token"$result["token"]);
  1002.             $user->setUsermetum("payment_token_response"$result["token_response"]);
  1003.             
  1004.             $manager $this->getDoctrine()->getManager();
  1005.             $manager->persist($user);
  1006.             $manager->flush();
  1007.             
  1008.             $this->addFlash("success""Membership settings updated.");
  1009.             return $this->redirectToRoute("account_aar", [
  1010.                //"slug" => "membership",
  1011.             ]);
  1012.         }
  1013.         else {
  1014.             $this->addFlash("warning""Their was an error while updating your payment information. Response: {$result["result"]}");
  1015.             return $this->redirectToRoute("account_aar", [
  1016.                "slug" => "membership",
  1017.             ]);
  1018.         }
  1019.         
  1020.         
  1021.         
  1022.     }
  1023.     
  1024.     /**
  1025.      * @Route("/account/{slug}/{id}", 
  1026.      *      name="account_aar",
  1027.      *      defaults={"slug": "", "id": ""}
  1028.      * )
  1029.      */
  1030.     public function viewAccount (
  1031.         UserHelper $userHelper,
  1032.         Request $request,
  1033.         $slug "",
  1034.         $id ""
  1035.     ) {
  1036.         if (!$this->user) {
  1037.             return $this->redirect("/sign-in");
  1038.         }
  1039.         $user $this->user;
  1040.         $manager $this->getDoctrine()->getManager();
  1041.         $purchases $user->getPurchases();
  1042.         $purchase null;
  1043.         
  1044.         if (!$slug) {
  1045.             $slug "account";
  1046.         }
  1047.         
  1048.         if ($slug == "order" && $id) {
  1049.             // show the order details
  1050.             $purchase $manager->getRepository(Purchase::class)
  1051.                 ->findOneBy([
  1052.                     "id" => $id
  1053.                 ]);
  1054.             
  1055.             if (!$purchase || $purchase->getUser()->getId() != $user->getId()) {
  1056.                 $purchase null;
  1057.             }
  1058.         }
  1059.         
  1060.         $customers $user->getCompanies();
  1061.         
  1062.         $membership_item "";
  1063.         $membership_product "";
  1064.         $will_renew false;
  1065.         //Get the current purchase item used to activate the user's membership
  1066.         if($user->isMember()) {
  1067.             $now = new \DateTime();
  1068.             foreach($purchases as $p) {
  1069.                 $items $p->getItems();
  1070.                 foreach($items as $item) {
  1071.                     if(($item->getStatus() >= PurchaseItem::STATUS_ACTIVE) && ($item->getType() == PurchaseItem::TYPE_MEMBERSHIP) && ($item->getExpiresAt() > $now)) {
  1072.                         $membership_item $item;
  1073.                         $membership_product $item->getProduct();
  1074.                         $will_renew = ($item->getStatus() >= PurchaseItem::STATUS_ACTIVE_RENEWING true false);
  1075.                     }
  1076.                 }
  1077.             }
  1078.         }
  1079.         
  1080.         $payment false;
  1081.         if($slug == "membership") {
  1082.             if($user->getUserMetaValueByKey("has_payment_info")) {
  1083.                 $payment = [];
  1084.                 $payment["firstname"] = $user->getUserMetaValueByKey("payment_first_name");
  1085.                 $payment["lastname"] = $user->getUserMetaValueByKey("payment_last_name");
  1086.                 $payment["company"] = $user->getUserMetaValueByKey("payment_company");
  1087.                 $payment["address1"] = $user->getUserMetaValueByKey("payment_address_line_1");
  1088.                 $payment["address2"] = $user->getUserMetaValueByKey("payment_address_line_2");
  1089.                 $payment["city"] = $user->getUserMetaValueByKey("payment_city");
  1090.                 $payment["state"] = $user->getUserMetaValueByKey("payment_state_province");
  1091.                 $payment["zip"] = $user->getUserMetaValueByKey("payment_postal_code");
  1092.                 $payment["country"] = $user->getUserMetaValueByKey("payment_country");
  1093.                 $payment["email"] = $user->getUserMetaValueByKey("payment_email");
  1094.                 $payment["phone"] = $user->getUserMetaValueByKey("payment_phone");
  1095.             }
  1096.         }
  1097.         
  1098.         return $this->defaultRender("forms/user-account.html.twig", [
  1099.             "user" => $user,
  1100.             "purchases" => $purchases,
  1101.             "purchase" => $purchase,
  1102.             "slug" => $slug,
  1103.             "customers" => $customers,
  1104.             "membership_item" => $membership_item,
  1105.             "membership_product" => $membership_product,
  1106.             "will_renew" => $will_renew,
  1107.             "payment" => $payment,
  1108.             
  1109.             "meta" => [
  1110.                 "breadcrumbs" => [
  1111.                     [
  1112.                         "title" => "Your Account",
  1113.                         "href" => "/account",
  1114.                     ]
  1115.                 ]
  1116.             ]
  1117.         ]);
  1118.     }
  1119.     
  1120.     /**
  1121.      * @Route("/admin-account/membership/{id}", name="admin-account-membership_aar")
  1122.      */
  1123.     public function adminAccountMembership(
  1124.         Request $request,
  1125.         UserHelper $userHelper,
  1126.         $id ""
  1127.     ) {
  1128.         
  1129.         //Admin check
  1130.         $access false;
  1131.         if ($this->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
  1132.             $user $this->getUser();
  1133.             if($user) {
  1134.                 if($user->isAdmin()) {
  1135.                     $access true;
  1136.                 }
  1137.             }
  1138.         }
  1139.         
  1140.         if(!$access) {
  1141.             $this->addFlash("warning""This page is only accessible to site administrators.");
  1142.             return $this->redirectToRoute("/");
  1143.         }
  1144.         
  1145.         $member "";
  1146.         if($id) {
  1147.             $member $userHelper->getUserById($id);
  1148.         }
  1149.         $manager $this->getDoctrine()->getManager();
  1150.         $purchases $member->getPurchases();
  1151.         $purchase null;
  1152.         
  1153.         $membership_item "";
  1154.         $membership_product "";
  1155.         $will_renew false;
  1156.         //Get the current purchase item used to activate the user's membership
  1157.         if($member->isMember()) {
  1158.             $now = new \DateTime();
  1159.             foreach($purchases as $p) {
  1160.                 $items $p->getItems();
  1161.                 foreach($items as $item) {
  1162.                     if(($item->getStatus() >= PurchaseItem::STATUS_ACTIVE) && ($item->getType() == PurchaseItem::TYPE_MEMBERSHIP) && ($item->getExpiresAt() > $now)) {
  1163.                         $membership_item $item;
  1164.                         $membership_product $item->getProduct();
  1165.                         $will_renew = ($item->getStatus() >= PurchaseItem::STATUS_ACTIVE_RENEWING true false);
  1166.                     }
  1167.                 }
  1168.             }
  1169.         }
  1170.         
  1171.         
  1172.         return $this->defaultRender("forms/account/admin-membership.html.twig", [
  1173.             "id" => $id,
  1174.             "member" => $member,
  1175.             "purchases" => $purchases,
  1176.             "purchase" => $purchase,
  1177.             "membership_item" => $membership_item,
  1178.             "membership_product" => $membership_product,
  1179.             "will_renew" => $will_renew,
  1180.             
  1181.         ]);
  1182.     }
  1183.     
  1184.     /**
  1185.      * @Route("/admin-account/membership-cancel", methods={"POST"}, name="post-admin-account-membership-cancel_aar")
  1186.      */
  1187.     public function adminCancelAccountMembership (
  1188.         Request $request,
  1189.         UserHelper $userHelper,
  1190.         OrderHelper $orderHelper
  1191.     ) {
  1192.         $user_id $request->get("user_id");
  1193.         $user $userHelper->getUserById($user_id);
  1194.         
  1195.         $manager $this->getDoctrine()->getManager();
  1196.         $item $manager->getRepository(PurchaseItem::class)
  1197.             ->findOneBy([
  1198.                "id" => $request->get("item_id"),
  1199.             ]);
  1200.         
  1201.         $item->setStatus(PurchaseItem::STATUS_ACTIVE);
  1202.         $manager->persist($item);
  1203.         $manager->flush();
  1204.         
  1205.         $this->addFlash("success""Membership has been cancelled and will not auto-renew.");
  1206.         return $this->redirectToRoute("admin-account-membership_aar", [
  1207.            "id" => $user_id,
  1208.         ]);
  1209.     }
  1210.     
  1211.     /**
  1212.      * @Route("/admin-account/membership-continue", methods={"POST"}, name="post-admin-account-membership-continue_aar")
  1213.      */
  1214.     public function adminContinueAccountMembership (
  1215.         Request $request,
  1216.         UserHelper $userHelper,
  1217.         OrderHelper $orderHelper
  1218.     ) {
  1219.         $user_id $request->get("user_id");
  1220.         $user $userHelper->getUserById($user_id);
  1221.         
  1222.         $manager $this->getDoctrine()->getManager();
  1223.         $item $manager->getRepository(PurchaseItem::class)
  1224.             ->findOneBy([
  1225.                "id" => $request->get("item_id"),
  1226.             ]);
  1227.         
  1228.         $item->setStatus($item->getPaymentFailed() ? PurchaseItem::STATUS_ACTIVE_RENEWING_FINAL PurchaseItem::STATUS_ACTIVE_RENEWING);
  1229.         $manager->persist($item);
  1230.         $manager->flush();
  1231.         
  1232.         $this->addFlash("success""Membership has been re-activated and will now automatically renew.");
  1233.         return $this->redirectToRoute("admin-account-membership_aar", [
  1234.            "id" => $user_id,
  1235.         ]);
  1236.     }
  1237.     
  1238. }