<?php
namespace Bidcoz\Bundle\CoreBundle\Security;
use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
use Bidcoz\Bundle\CoreBundle\Entity\Config;
use Bidcoz\Bundle\CoreBundle\Entity\Organization;
use Bidcoz\Bundle\CoreBundle\Entity\Terms\UserTerms;
use Bidcoz\Bundle\CoreBundle\Entity\User;
use Doctrine\Persistence\ObjectManager;
use FOS\UserBundle\Model\UserManagerInterface;
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\User\UserInterface;
class NvidiaUserProvider extends FOSUBUserProvider
{
protected ObjectManager $em;
private RequestStack $requestStack;
public function __construct(
UserManagerInterface $userManager,
array $properties,
ObjectManager $em,
RequestStack $requestStack
)
{
parent::__construct($userManager, $properties);
$this->em = $em;
$this->requestStack = $requestStack;
}
public function connect(UserInterface $user, UserResponseInterface $response)
{
$property = $this->getProperty($response);
$username = $response->getUsername();
$existingUser = $this->userManager->findUserBy([$property => $username]);
if (null !== $existingUser) {
$user->setGoogleId(null);
$this->userManager->updateUser($existingUser);
}
// we connect current user, set current user id and token
$this->updateUser($user, $response);
$this->userManager->updateUser($user);
}
/**
* {@inheritdoc}
*/
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
$userEmail = $response->getEmail();
$user = $this->userManager->findUserByEmail($userEmail);
// if null just create new user and set it properties
if (null === $user) {
$user = new User();
$user->setTimezone('America/Los_Angeles');
}
$this->updateUser($user, $response);
return $user;
}
private function updateUser(User $user, UserResponseInterface $response)
{
// Log this for now
file_put_contents('/tmp/nvidia.txt', var_export($response->getData(), true), FILE_APPEND);
$org = $this->getOranization();
$campaign = $this->getCampaign($org);
$name = $response->getFirstName();
$nameParts = explode(' ', $name);
$firstName = count($nameParts) > 1 ? $nameParts[0] : '';
$lastName = count($nameParts) > 1 ? $nameParts[1] : '';
$username = $response->getUsername();
$user->setUsername($username);
$user->setEmail($response->getEmail());
if (count($nameParts) && !$user->hasName()) {
$user->setFirstName($firstName);
$user->setLastName($lastName);
}
$user->setNvidiaId($response->getUsername());
$user->setEnabled(true);
$user->setLoggedIn(true);
$user->setLastVisitOrganization($org);
$user->setLastVisitCampaign($campaign);
// Auto set them to accept the terms
$user->setUserTerms($this->getCurrentUserTerms());
$this->userManager->updateUser($user);
// Set the redirect info into the session
$routeInfo = [
'route' => 'campaign_home',
'routeParams' => [
'orgSlug' => $org->getSlug(),
'campaignSlug' => $campaign->getSlug(),
],
];
$this->requestStack->getSession()->set('_redirect_info', $routeInfo);
}
protected function getOranization(): Organization
{
return $this->em->getRepository(Organization::class)->findOneBySlug('nvidia');
}
protected function getCampaign(Organization $organization): Campaign
{
return $this->em->getRepository(Campaign::class)->findOrganizationCampaignBySlug($organization, 'kindness2024');
}
private function getCurrentUserTerms(): UserTerms
{
return $this->em
->getRepository(Config::class)
->findActiveConfig()
->getUserTerms();
}
}