<?php
namespace Insurance\Controller;
use Insurance\Model\User;
use Insurance\Request\FirstConnectionRequest;
use Insurance\Request\PasswordResetRequest;
use Insurance\Request\PostLoginRequest;
use Insurance\Response\PostLoginResponse;
use Insurance\Service\BcaAccountService;
use Insurance\Service\BcaConnectService;
use Insurance\Service\BcaRequestService;
use Insurance\Service\PricingService;
use Insurance\Service\SamSchoolService;
use GuzzleHttp\Exception\GuzzleException;
use JMS\Serializer\SerializationContext;
use JMS\Serializer\SerializerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
class HomeController extends AbstractController
{
private PricingService $pricingService;
private SerializerInterface $serializer;
private BcaConnectService $bcaConnectService;
private BcaAccountService $bcaAccountService;
private SamSchoolService $samSchoolService;
private BcaRequestService $bcaRequestService;
public function __construct(
PricingService $pricingService,
SerializerInterface $serializer,
BcaConnectService $bcaConnectService,
BcaAccountService $bcaAccountService,
SamSchoolService $samSchoolService,
BcaRequestService $bcaRequestService
)
{
$this->pricingService = $pricingService;
$this->serializer = $serializer;
$this->bcaConnectService = $bcaConnectService;
$this->bcaAccountService = $bcaAccountService;
$this->samSchoolService = $samSchoolService;
$this->bcaRequestService = $bcaRequestService;
}
/**
* @Route("/", name="home")
*/
public function index()
{
return $this->render('home/index.html.twig');
}
/**
* @Route("/login", name="postLogin", methods={"POST"})
* @ParamConverter("postLoginRequest", converter="postLoginConverter", class="Insurance\Request\PostLoginRequest")
*
* @param PostLoginRequest $postLoginRequest
* @return Response
* @throws TransportExceptionInterface
* @throws GuzzleException
*/
public function postLogin(PostLoginRequest $postLoginRequest)
{
/** @var PostLoginResponse $postLoginResponse */
$postLoginResponse = $this->bcaConnectService->postLogin($postLoginRequest);
$customerView = $this->bcaAccountService->getCustomerView($postLoginRequest->getEmail());
$customerProducts = $this->bcaAccountService->getCustomerProducts($postLoginResponse->getId());
$user = new User();
$user->withCustomerViewResponse($customerView);
if(!empty($customerProducts)){
$user->setProduct($customerProducts[0]);
}
$jsonUser = $this->serializer->serialize($user,'json');
return new JsonResponse($jsonUser, 200, [], true);
}
/**
* @Route("/user", name="getUserByToken", methods={"GET"})
*/
public function getUserByToken(Request $request)
{
$customerId = $this->bcaRequestService->getCustomerId($request->query->get('token'));
$customerView = $this->bcaAccountService->getCustomerById($customerId);
$customerProducts = $this->bcaAccountService->getCustomerProducts($customerId);
$user = User::fromCustomerView($customerView);
if(!empty($customerProducts)){
$user->setProduct($customerProducts[0]);
}
$jsonUser = $this->serializer->serialize($user, 'json');
return new JsonResponse($jsonUser, 200, [], true);
}
/**
* @Route("/firstConnection", name="firstConnection", methods={"POST"})
* @param FirstConnectionRequest $firstConnectionRequest
* @return JsonResponse
* @throws TransportExceptionInterface
* @throws GuzzleException
*/
public function firstConnection(FirstConnectionRequest $firstConnectionRequest)
{
$forgotRequestResponse = $this->bcaConnectService->firstConnection($firstConnectionRequest);
$customerView = $this->bcaAccountService->getCustomerView($firstConnectionRequest->getEmail());
$user = new User();
$user->withCustomerViewResponse($customerView)
->setToken($forgotRequestResponse->getToken());
$context = SerializationContext::create()->setGroups(['authentication']);
$jsonUser = $this->serializer->serialize($user,'json', $context);
return new JsonResponse($jsonUser, 200, [], true);
}
/**
* @Route("/passwordReset", name="passwordReset", methods={"POST"})
* @param PasswordResetRequest $passwordResetRequest
* @return Response
* @throws TransportExceptionInterface
* @throws GuzzleException
*/
public function resetPassword(PasswordResetRequest $passwordResetRequest){
$this->bcaConnectService->resetPassword($passwordResetRequest);
return new Response();
}
/**
* @Route("/context", name="context", methods={"POST"})
*
* @param User $user
* @return Response
*/
public function createContext(User $user)
{
$url = $this->samSchoolService->createContext($user);
return new JsonResponse(["url"=>$url], Response::HTTP_CREATED);
}
/**
* @Route("/formule/{formule}", name="formule", methods={"GET"})
*/
public function getFormule(string $formule): JsonResponse
{
$content = $this->pricingService->getFormulePrice($formule);
return $this->json($content, Response::HTTP_OK, [], [
'groups' => 'get',
]);
}
}