public function loginAction(Request $request)
 {
     $oauth = $this->get('campaignchain.security.authentication.client.oauth.authentication');
     $status = $oauth->authenticate(self::RESOURCE_OWNER, $this->applicationInfo);
     $profile = $oauth->getProfile();
     if ($status) {
         try {
             $em = $this->getDoctrine()->getManager();
             $em->getConnection()->beginTransaction();
             $wizard = $this->get('campaignchain.core.channel.wizard');
             $wizard->setName($profile->displayName);
             // Get the location module.
             $locationService = $this->get('campaignchain.core.location');
             $locationModule = $locationService->getLocationModule(self::LOCATION_BUNDLE, self::LOCATION_MODULE);
             $location = new Location();
             $location->setIdentifier($profile->identifier);
             $location->setName($profile->displayName);
             $location->setImage($profile->photoURL);
             $location->setLocationModule($locationModule);
             $wizard->addLocation($location->getIdentifier(), $location);
             $channel = $wizard->persist();
             $wizard->end();
             $oauth->setLocation($channel->getLocations()[0]);
             $user = new MailChimpUser();
             $user->setLocation($channel->getLocations()[0]);
             $user->setIdentifier($profile->identifier);
             $user->setUsername($profile->username);
             $user->setDisplayName($profile->displayName);
             $user->setFirstName($profile->firstName);
             $user->setLastName($profile->lastName);
             $user->setEmail($profile->email);
             $user->setProfileImageUrl($profile->photoURL);
             $user->setAddress($profile->address);
             $user->setCity($profile->city);
             $user->setCountry($profile->country);
             $user->setZip($profile->zip);
             $user->setPhone($profile->phone);
             $user->setWebsiteUrl($profile->webSiteURL);
             $em->persist($user);
             $em->flush();
             $em->getConnection()->commit();
             $this->get('session')->getFlashBag()->add('success', 'The MailChimp location <a href="#">' . $profile->displayName . '</a> was connected successfully.');
         } catch (\Exception $e) {
             $em->getConnection()->rollback();
             throw $e;
         }
     } else {
         $this->get('session')->getFlashBag()->add('warning', 'A location has already been connected for this MailChimp account.');
     }
     return $this->render('CampaignChainChannelMailChimpBundle:Create:login.html.twig', array('redirect' => $this->generateUrl('campaignchain_core_location')));
 }
 public function loginAction()
 {
     $oauth = $this->get('campaignchain.security.authentication.client.oauth.authentication');
     $status = $oauth->authenticate(self::RESOURCE_OWNER, $this->applicationInfo);
     $profile = $oauth->getProfile();
     if ($status) {
         try {
             $em = $this->getDoctrine()->getManager();
             $em->getConnection()->beginTransaction();
             $wizard = $this->get('campaignchain.core.channel.wizard');
             $wizard->setName($profile->displayName);
             // Get the location module.
             $locationService = $this->get('campaignchain.core.location');
             $locationModule = $locationService->getLocationModule('campaignchain/location-twitter', 'campaignchain-twitter-user');
             $location = new Location();
             $location->setIdentifier($profile->identifier);
             $location->setName($profile->displayName);
             $location->setLocationModule($locationModule);
             $location->setImage($profile->photoURL);
             $location->setUrl($profile->profileURL);
             $wizard->addLocation($location->getIdentifier(), $location);
             $channel = $wizard->persist();
             $wizard->end();
             $oauth->setLocation($channel->getLocations()[0]);
             $twitterUser = new TwitterUser();
             $twitterUser->setLocation($channel->getLocations()[0]);
             $twitterUser->setIdentifier($profile->identifier);
             $twitterUser->setDisplayName($profile->firstName);
             $twitterUser->setUsername($profile->displayName);
             $twitterUser->setProfileImageUrl($profile->photoURL);
             $twitterUser->setProfileUrl($profile->profileURL);
             $em->persist($twitterUser);
             // schedule job to get metrics from now on
             if ($channel->getLocations()[0]->getLocationModule()->getIdentifier() === 'campaignchain-twitter-user') {
                 $this->get('campaignchain.job.report.location.twitter')->schedule($channel->getLocations()[0]);
             }
             $em->flush();
             $em->getConnection()->commit();
             $this->addFlash('success', 'The Twitter location <a href="#">' . $profile->displayName . '</a> was connected successfully.');
         } catch (\Exception $e) {
             $em->getConnection()->rollback();
             throw $e;
         }
     } else {
         // A channel already exists that has been connected with this Facebook account
         $this->addFlash('warning', 'A location has already been connected for this Twitter account.');
     }
     return $this->render('CampaignChainChannelTwitterBundle:Create:login.html.twig', ['redirect' => $this->generateUrl('campaignchain_core_location')]);
 }
 public function processContentLocation(Location $location, $data)
 {
     $sid = $data['slideshow'];
     $location->setIdentifier($sid);
     $location->setName($this->availableSlideshows[$sid]['title']);
     $location->setUrl($this->availableSlideshows[$sid]['url']);
     return $location;
 }
 public function createLocationAction(Request $request)
 {
     $selectedIds = $request->get('google-analytics-profile-id', []);
     if (empty($selectedIds)) {
         $this->addFlash('warning', 'Please select at least one Google Analytics property');
         return $this->redirectToRoute('campaignchain_channel_google_analytics_list_properties');
     }
     /** @var Token $token */
     $token = $request->getSession()->get('token');
     $em = $this->getDoctrine()->getManager();
     $token = $em->merge($token);
     $websiteChannelModule = $em->getRepository('CampaignChainCoreBundle:ChannelModule')->findOneBy(['identifier' => 'campaignchain-website']);
     $googleAnalyticsChannelModule = $em->getRepository('CampaignChainCoreBundle:ChannelModule')->findOneBy(['identifier' => 'campaignchain-google-analytics']);
     foreach ($selectedIds as $analyticsId) {
         list($accountId, $propertyId, $profileId) = explode('|', $analyticsId);
         $analyticsClient = $this->get('campaignchain_report_google_analytics.service_client')->getService($token);
         /** @var \Google_Service_Analytics_Profile $profile */
         $profile = $analyticsClient->management_profiles->get($accountId, $propertyId, $profileId);
         $wizard = $this->get('campaignchain.core.channel.wizard');
         $wizard->start(new Channel(), $googleAnalyticsChannelModule);
         $wizard->setName($profile->getName());
         // Get the location module.
         $locationService = $this->get('campaignchain.core.location');
         $locationModule = $locationService->getLocationModule('campaignchain/location-google-analytics', 'campaignchain-google-analytics');
         $location = new Location();
         $location->setIdentifier($profile->getId());
         $location->setName($profile->getName());
         $location->setLocationModule($locationModule);
         $google_base_url = 'https://www.google.com/analytics/web/#report/visitors-overview/';
         $location->setUrl($google_base_url . 'a' . $profile->getAccountId() . 'w' . $profile->getInternalWebPropertyId() . 'p' . $profile->getId());
         $em->persist($location);
         try {
             $em->flush();
         } catch (UniqueConstraintViolationException $e) {
             //This GA endpoint is already connected
             $this->addFlash('warning', 'The Google Analytics Property <a href="#">' . $profile->getName() . '</a> is already connected.');
             continue;
         }
         $wizard->addLocation($location->getIdentifier(), $location);
         $wizard->persist();
         $wizard->end();
         //Check if the if the belonging website location exists, if not create a new website location
         $website = $em->getRepository('CampaignChainCoreBundle:Location')->findOneByUrl($profile->getWebsiteUrl());
         //Create website location that belongs to the GA location
         if (!$website) {
             $websiteLocationModule = $locationService->getLocationModule('campaignchain/location-website', 'campaignchain-website');
             $websiteLocationName = ParserUtil::getHTMLTitle($profile->getWebsiteUrl());
             $websiteLocation = new Location();
             $websiteLocation->setLocationModule($websiteLocationModule);
             $websiteLocation->setName($websiteLocationName);
             $websiteLocation->setUrl($profile->getWebsiteUrl());
             $em->persist($websiteLocation);
             $wizard->start(new Channel(), $websiteChannelModule);
             $wizard->setName($websiteLocationName);
             $wizard->addLocation($profile->getWebsiteUrl(), $websiteLocation);
             $wizard->persist();
             $website = $websiteLocation;
         }
         $entityToken = clone $token;
         $entityToken->setLocation($location);
         $entityToken->setApplication($token->getApplication());
         $em->persist($entityToken);
         $analyticsProfile = new Profile();
         $analyticsProfile->setAccountId($profile->getAccountId());
         $analyticsProfile->setPropertyId($profile->getWebPropertyId());
         $analyticsProfile->setProfileId($profile->getId());
         $analyticsProfile->setIdentifier($profile->getId());
         $analyticsProfile->setDisplayName($profile->getName());
         $analyticsProfile->setLocation($location);
         $analyticsProfile->setBelongingLocation($website);
         $em->persist($analyticsProfile);
         $em->flush();
         $this->addFlash('success', 'The Google Analytics Property <a href="#">' . $profile->getName() . '</a> was connected successfully.');
     }
     return $this->redirectToRoute('campaignchain_core_location');
 }
 public function processContentLocation(Location $location, $data)
 {
     $remoteNewsletter = $this->getRemoteNewsletter($data);
     $location->setIdentifier($remoteNewsletter['id']);
     $location->setName($remoteNewsletter['title']);
     $location->setUrl($remoteNewsletter['archive_url_long']);
     return $location;
 }
 /**
  * @return Location[]
  */
 public function getParsedLocationsFromLinkedIn()
 {
     $channel = $this->channelWizard->getChannel();
     $profile = $this->channelWizard->get('profile');
     $locations = [];
     $locationName = $profile->displayName;
     if (!empty($profile->username)) {
         $locationName .= ' (' . $profile->username . ')';
     }
     // Get the location module for the user stream.
     $locationModuleUser = $this->locationService->getLocationModule('campaignchain/location-linkedin', 'campaignchain-linkedin-user');
     // Create the location instance for the user stream.
     $locationUser = new Location();
     $locationUser->setIdentifier($profile->identifier);
     $locationUser->setName($locationName);
     $locationUser->setLocationModule($locationModuleUser);
     if (!$profile->photoURL || strlen($profile->photoURL) == 0) {
         $locationUser->setImage($this->assetsHelper->getUrl('/bundles/campaignchainchannellinkedin/ghost_person.png'));
     } else {
         $locationUser->setImage($profile->photoURL);
     }
     $locationUser->setChannel($channel);
     $locationModuleUser->addLocation($locationUser);
     $locations[$profile->identifier] = $locationUser;
     $tokens = $this->channelWizard->get('tokens');
     /** @var Token $userToken */
     $userToken = array_values($tokens)[0];
     $connection = $this->client->getConnectionByToken($userToken);
     $companies = $connection->getCompanies();
     //there is only a user page
     if (empty($companies)) {
         return $locations;
     }
     // Get the location module for the page stream.
     $locationModulePage = $this->locationService->getLocationModule('campaignchain/location-linkedin', 'campaignchain-linkedin-page');
     $wizardPages = [];
     foreach ($companies as $company) {
         $newToken = new Token();
         $newToken->setAccessToken($userToken->getAccessToken());
         $newToken->setApplication($userToken->getApplication());
         $newToken->setTokenSecret($userToken->getTokenSecret());
         $tokens[$company['id']] = $newToken;
         $this->channelWizard->set('tokens', $tokens);
         $companyData = $connection->getCompanyProfile($company['id']);
         $locationPage = new Location();
         $locationPage->setChannel($channel);
         $locationPage->setName($companyData['name']);
         $locationPage->setIdentifier($companyData['id']);
         if (isset($companyData['squareLogoUrl'])) {
             $locationPage->setImage($companyData['squareLogoUrl']);
         } else {
             $locationPage->setImage($this->assetsHelper->getUrl('/bundles/campaignchainchannellinkedin/ghost_person.png'));
         }
         $locationPage->setLocationModule($locationModulePage);
         $locationModulePage->addLocation($locationPage);
         $locations[$companyData['id']] = $locationPage;
         $wizardPages[$companyData['id']] = $companyData;
     }
     $this->channelWizard->set('pagesData', $wizardPages);
     return $locations;
 }
 /**
  * After a new Activity was created, this method makes it possible to alter
  * the data of the Content's Location (not the Activity's Location!) as per
  * the data provided for the Content.
  *
  * Called in these views:
  * - new
  *
  * @param Location $location Location of the Content.
  * @param $data Form submit data of the Content.
  * @return Location
  */
 public function processContentLocation(Location $location, $data)
 {
     $connection = $this->getRestApiConnectionByLocation();
     $remoteContentObject = $connection->getContentObject($data['content_object']);
     $location->setIdentifier($remoteContentObject['_id']);
     $location->setName($remoteContentObject['Name']);
     return $location;
 }
 public function processContentLocation(Location $location, $data)
 {
     $location->setIdentifier($this->remoteWebinar['webinarKey']);
     $location->setName($this->remoteWebinar['subject']);
     $location->setUrl($this->remoteWebinar['registrationUrl']);
     return $location;
 }
 public function addLocationAction(Request $request)
 {
     $wizard = $this->get('campaignchain.core.channel.wizard');
     $channel = $wizard->getChannel();
     $profile = $wizard->get('profile');
     $locations = [];
     $locationName = $profile->displayName;
     $username = $profile->username;
     if (!empty($username)) {
         $locationName .= ' (' . $username . ')';
     }
     // Get the location module for the user stream.
     $locationService = $this->get('campaignchain.core.location');
     $locationModuleUser = $locationService->getLocationModule('campaignchain/location-facebook', 'campaignchain-facebook-user');
     // Create the location instance for the user stream.
     $locationUser = new Location();
     $locationUser->setChannel($channel);
     $locationUser->setName($locationName);
     $locationUser->setIdentifier($profile->identifier);
     $locationUser->setImage($profile->photoURL);
     $locationUser->setLocationModule($locationModuleUser);
     $locationModuleUser->addLocation($locationUser);
     $locations[$profile->identifier] = $locationUser;
     // Connect to Facebook to retrieve pages related to the user.
     $tokens = $wizard->get('tokens');
     $client = $this->container->get('campaignchain.channel.facebook.rest.client');
     $connection = $client->connect($tokens[$profile->identifier]->getAccessToken());
     if ($connection) {
         // TODO: Check whether user has manage_pages permission with /me/permissions
         // check if the user owns Facebook pages
         $response = $connection->api('/me/accounts');
         $pagesData = $response['data'];
         if (is_array($pagesData) && count($pagesData)) {
             // TODO: Should we check whether the Facebook page has actually been published (through is_published), because if not, then posting to it won't make sense? Same with can_post and perms from /me/accounts?
             // Get the location module for the page stream.
             $locationModulePage = $locationService->getLocationModule('campaignchain/location-facebook', 'campaignchain-facebook-page');
             // User owns pages, so let's build the form and ask him whether to create channels for each of them
             // with the respective channel name
             foreach ($pagesData as $pageData) {
                 // Save the token in the Wizard.
                 $tokens = $wizard->get('tokens');
                 $newToken = new Token();
                 $newToken->setAccessToken($pageData['access_token']);
                 $application = $tokens[$wizard->get('facebook_user_id')]->getApplication();
                 $newToken->setApplication($application);
                 $tokens[$pageData['id']] = $newToken;
                 $wizard->set('tokens', $tokens);
                 // Get the page picture
                 $pageConnection = $client->connect($pageData['access_token']);
                 $pagePicture = $pageConnection->api('/' . $pageData['id'] . '/picture', 'GET', ['redirect' => false, 'type' => 'large']);
                 $pageData['picture_url'] = $pagePicture['data']['url'];
                 // Create the location instance for the page stream.
                 $locationPage = new Location();
                 $locationPage->setChannel($channel);
                 $locationPage->setName($pageData['name']);
                 $locationPage->setIdentifier($pageData['id']);
                 $locationPage->setImage($pageData['picture_url']);
                 $locationPage->setLocationModule($locationModulePage);
                 $locationModulePage->addLocation($locationPage);
                 $locations[$pageData['id']] = $locationPage;
                 $wizardPages[$pageData['id']] = $pageData;
             }
             $wizard->set('pagesData', $wizardPages);
         }
     }
     $data = [];
     $form = $this->createFormBuilder($data);
     foreach ($locations as $identifier => $location) {
         // Has the page already been added as a location?
         $repository = $this->getDoctrine()->getRepository('CampaignChainCoreBundle:Location');
         $pageExists = $repository->findOneBy(['identifier' => $identifier, 'locationModule' => $location->getLocationModule()]);
         // Compose the checkbox form field.
         $form->add($identifier, CheckboxType::class, ['label' => '<img class="campaignchain-location-image-input-prepend" src="' . $location->getImage() . '"> ' . $location->getName(), 'required' => false, 'data' => true, 'mapped' => false, 'disabled' => $pageExists, 'attr' => ['align_with_widget' => true]]);
         // If a location has already been added before, remove it from this process.
         // TODO: Also assign existing locations to the new FB user.
         if ($pageExists) {
             unset($locations[$identifier]);
         }
     }
     $form = $form->getForm();
     $form->handleRequest($request);
     if ($form->isValid()) {
         // Find out which locations should be added, i.e. which respective checkbox is active.
         foreach ($locations as $identifier => $location) {
             if (!$form->get($identifier)->getData()) {
                 unset($locations[$identifier]);
                 $wizard->removeLocation($identifier);
             }
         }
         // If there's at least one location to be added, then have the user configure it.
         if (is_array($locations) && count($locations)) {
             $wizard->setLocations($locations);
             return $this->redirectToRoute('campaignchain_channel_facebook_location_configure', ['step' => 0]);
         } else {
             $this->addFlash('warning', 'No new location has been added.');
             return $this->redirectToRoute('campaignchain_core_location');
         }
     }
     return $this->render('CampaignChainCoreBundle:Base:new.html.twig', ['page_title' => 'Add Facebook Locations', 'form' => $form->createView()]);
 }