/**
  * Expects the mailing list "*****@*****.**" to already exist
  */
 public function testUserIsSubscribed()
 {
     $newsletterService = $this->getNewsletterService();
     $newsletter = $this->getNewsletter();
     $email = sprintf("*****@*****.**", time());
     $user = new \ClassCentral\SiteBundle\Entity\User();
     $user->setEmail($email);
     $result = $newsletterService->subscribeUser($newsletter, $user);
     $this->assertTrue($result, "Failed to subscribe user to a newsletter " . $newsletter->getCode());
     // Unsubscribe this user
     $unsubscribe = $newsletterService->unSubscribeUser($newsletter, $user);
     $this->assertTrue($unsubscribe, "Failed to unsubscribe user from a newsletter" . $newsletter->getCode());
 }
 public function fbReceiveAuthorizationCodeAction(Request $request)
 {
     $em = $this->getDoctrine()->getManager();
     $userService = $this->get('user_service');
     $userSession = $this->get('user_session');
     $src = $this->get('session')->get('fb_auth_src');
     $logger = $this->get('logger');
     $logger->info("FBAUTH: FB auth redirect");
     $helper = $this->getFBLoginHelper();
     try {
         $session = $helper->getSessionFromRedirect();
         if (!$session) {
             // Redirect to the signup page
             $logger->info("FBAUTH: FB auth denied by the user");
             return $this->redirect($this->generateUrl('signup'));
         }
         $fbRequest = new FacebookRequest($session, 'GET', '/me');
         $fbUser = $fbRequest->execute()->getGraphObject(GraphUser::className());
         $email = $fbUser->getEmail();
         if (!$email) {
             // TODO : Render error page
             $logger->error("FBAUTH: Email missing");
             echo "Email is required. Please revoke Class Central App from your <a href='https://www.facebook.com/settings?tab=applications'>Facebook settings page</a> and then signup again.";
             exit;
         }
         $name = $fbUser->getName();
         $fbId = $fbUser->getId();
         // Check if the fb users has logged in before using the FB Id
         $usersFB = $em->getRepository('ClassCentralSiteBundle:UserFb')->findOneBy(array('fbId' => $fbId));
         if ($usersFB) {
             $user = $usersFB->getUser();
         } else {
             // Check if an account with this email address exist. If it does then merge
             // these accounts
             $user = $em->getRepository('ClassCentralSiteBundle:User')->findOneBy(array('email' => $email));
         }
         if ($user) {
             $userService->login($user);
             // Record Logins
             $keen = $this->container->get('keen');
             $keen->recordLogins($user, 'facebook');
             $userSession->setPasswordLessLogin(true);
             // Check whether the user has fb details
             $ufb = $user->getFb();
             if ($ufb) {
                 $logger->info("FBAUTH: FB user exists");
             } else {
                 $logger->info("FBAUTH: Email exists but UserFb table is empty");
                 // Create a FB info
                 $ufb = new UserFb();
                 $ufb->setFbEmail($email);
                 $ufb->setFbId($fbId);
                 $ufb->setUser($user);
             }
             $em->persist($ufb);
             $em->flush();
             $userSession->login($user, true);
             $redirectUrl = $this->getLastAccessedPage($request->getSession()) ? $this->getLastAccessedPage($request->getSession()) : $this->generateUrl('user_library');
             $logger->info(' LOGIN REDIRECT URL ' . $redirectUrl);
             return $this->redirect($redirectUrl);
         } else {
             $logger->info("FBAUTH: New user");
             $newsletterService = $this->get('newsletter');
             $newsletter = $em->getRepository('ClassCentralSiteBundle:Newsletter')->findOneByCode('mooc-report');
             // Create a new account
             $user = new \ClassCentral\SiteBundle\Entity\User();
             $user->setEmail($email);
             $user->setName($name);
             $user->setPassword($this->getRandomPassword());
             // Set a random password
             $user->setIsverified(true);
             $user->setSignupType(\ClassCentral\SiteBundle\Entity\User::SIGNUP_TYPE_FACEBOOK);
             $signupSrc = empty($src) ? 'facebook' : $src;
             $userService->createUser($user, false, $signupSrc);
             $userSession->setPasswordLessLogin(true);
             // Set the variable to show that the user didn't use a password to login
             // Note: A profile edit modal will be shown to the user
             $redirectUrl = $this->getLastAccessedPage($request->getSession(), $signupSrc) ? $this->getLastAccessedPage($request->getSession(), $signupSrc) : $this->generateUrl('user_library');
             // Create a FB info
             $ufb = new UserFb();
             $ufb->setFbEmail($email);
             $ufb->setFbId($fbId);
             $ufb->setUser($user);
             $em->persist($ufb);
             $em->flush();
             $this->uploadFacebookProfilePic($user, $fbId);
             // Subscribe to newsletter
             $subscribed = $newsletterService->subscribeUser($newsletter, $user);
             $logger->info("preferences subscribed : email newsletter subscription", array('email' => $user->getId(), 'newsletter' => $newsletter->getCode(), 'subscribed' => $subscribed));
             // Show the user a profile edit window
             $this->get('session')->getFlashBag()->set('show_post_fb_signup_profile_modal', 1);
             return $this->redirect($redirectUrl);
         }
     } catch (FacebookRequestException $e) {
         $logger->info("FBAUTH: FB Auth error - " . $e->getMessage());
         return null;
     } catch (\Exception $e) {
         $logger->info("FBAUTH: Api exception" . $e->getMessage());
         return null;
     }
 }