src/Controller/LoginController.php line 29

  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use GuzzleHttp\Client;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Bundle\SecurityBundle\Security;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. class LoginController extends AbstractController
  13. {
  14.     #[Route(
  15.         path'/{_locale}/signin',
  16.         name'signin'
  17.     )]
  18.     public function signin(Request $request)
  19.     {
  20.         $previousUrl $request->headers->get('referer');
  21.         $locale $request->getLocale();
  22.         $redirectURI str_replace('{locale}'$locale$_ENV['REDIRECT_URI']);
  23.         $wcaURL "https://www.worldcubeassociation.org/oauth/authorize?client_id=" $_ENV['CLIENT_ID']
  24.                     . "&redirect_uri=" $redirectURI
  25.                     "&state=" urlencode($previousUrl)
  26.                     . "&response_type=code&scope=public";
  27.         return $this->redirect($wcaURL);
  28.     }
  29.     #[Route(
  30.         path'/{_locale}/wca',
  31.         name'wca'
  32.     )]
  33.     public function wca(Request $requestEntityManagerInterface $entityManagerSecurity $securityTranslatorInterface $translator): Response
  34.     {
  35.         $locale $request->getLocale();
  36.         $redirectURI str_replace('{locale}'$locale$_ENV['REDIRECT_URI']);
  37.         $code $request->get('code');
  38.         $state $request->query->get('state');
  39.         $httpClient = new Client();
  40.         // create request to WCA API
  41.         $response $httpClient->post('https://www.worldcubeassociation.org/oauth/token', [
  42.             'form_params' => [
  43.                 'grant_type' => 'authorization_code',
  44.                 'client_id' => $_ENV['CLIENT_ID'],
  45.                 'client_secret' => $_ENV['CLIENT_SECRET'],
  46.                 'code' => $code,
  47.                 'redirect_uri' => $redirectURI
  48.             ]
  49.         ]);
  50.         $json json_decode($response->getBody()->getContents(), true);
  51.         $client = new Client([
  52.             'base_uri' => 'https://www.worldcubeassociation.org/api/v0/',
  53.             'headers' => ['Authorization' => 'Bearer ' $json['access_token']]
  54.         ]);
  55.         $response $client->get('me');
  56.         // return access token
  57.         $personalData json_decode($response->getBody()->getContents(), true);
  58.         $personalData $personalData['me'];
  59.         $wcaId $personalData['wca_id'];
  60.         $user $entityManager->getRepository(User::class)->findOneBy([ 'wcaId' => $wcaId ]);
  61.         if (is_null($user)) {
  62.             $user = new User();
  63.             if ($wcaId) {
  64.                 $user->setWcaId($wcaId);
  65.             }
  66.             $user->setName($personalData['name']);
  67.             $user->setCountryIso2($personalData['country_iso2']);
  68.             if (array_key_exists('region'$personalData)) {
  69.                 $user->setRegion($personalData['region']);
  70.             }
  71.             $user->setDelegateStatus($personalData['delegate_status']);
  72.             $entityManager->persist($user);
  73.             $entityManager->flush();
  74.         }
  75.         $security->login($user);
  76.         if ($state) {
  77.             return $this->redirect($state);
  78.         }
  79.         return $this->redirectToRoute('home', ['_locale' => $translator->getLocale()]);
  80.     }
  81.     #[Route(
  82.         path'/{_locale}/signout',
  83.         name'signout'
  84.     )]
  85.     public function signout(Security $security)
  86.     {
  87.         $security->logout();
  88.     }
  89. }