<?php
namespace Harmonizely\Controller\Login;
use Harmonizely\Core\Exception\BadRequestException;
use Harmonizely\Core\Exception\ValidationException;
use Harmonizely\Core\Response\Contract\IResponseBuilder;
use Harmonizely\Core\Security\Contract\ISecurityHelper;
use Harmonizely\Core\Validation\Contract\IDTOValidator;
use Harmonizely\DTO\User\Request\ConnectOAuthRequestDTO;
use Harmonizely\Service\Panel\OAuth\OAuthClientsContainer;
use Harmonizely\Service\Panel\OAuth\OAuthException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class LoginOAuthController extends AbstractController
{
/**
* @var OAuthClientsContainer
*/
private OAuthClientsContainer $clientContainer;
/**
* @var ISecurityHelper
*/
private ISecurityHelper $securityHelper;
/**
* @var IDTOValidator
*/
private IDTOValidator $validator;
/**
* @var IResponseBuilder
*/
private IResponseBuilder $responseBuilder;
/**
* @param OAuthClientsContainer $container
* @param ISecurityHelper $securityHelper
* @param IDTOValidator $validator
* @param IResponseBuilder $responseBuilder
*/
public function __construct(
OAuthClientsContainer $container,
ISecurityHelper $securityHelper,
IDTOValidator $validator,
IResponseBuilder $responseBuilder
)
{
$this->clientContainer = $container;
$this->securityHelper = $securityHelper;
$this->validator = $validator;
$this->responseBuilder = $responseBuilder;
}
/**
* @Route("/login/oauth/{provider}", name="login.oauth")
*
* @param string $provider
* @param ConnectOAuthRequestDTO $requestDTO
* @return Response
* @throws OAuthException
* @throws ValidationException
*/
public function __invoke(string $provider, ConnectOAuthRequestDTO $requestDTO): Response
{
$providerObj = $this->clientContainer->get($provider);
if ($this->securityHelper->getUser()) {
$this->validator->validate($requestDTO);
return $this->responseBuilder->buildResponse([
'redirectUrl' => $providerObj->getAuthUrl(),
]);
} else {
return $this->redirect($providerObj->getAuthUrl());
}
}
}