<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-07-16
* Time: 14:33
*/
namespace App\Controller;
use App\Entity\Account\Advertiser;
use App\Entity\Account\Customer;
use App\Entity\Location\City;
use App\Entity\User;
use App\Form\RegisterAccountForm;
use App\Security\LoginFormAuthenticator;
use App\Service\DefaultCityProvider;
use App\Service\Features;
use App\Service\UserService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
class AccountRegistrationController extends AbstractController
{
#[Route(path: '/reg/', name: 'app_security_register', methods: ['GET', 'POST'])]
#[ParamConverter('city', converter: 'city_converter')]
public function register(UserService $userService, City $city, Request $request, Features $features, DefaultCityProvider $defaultCityProvider): Response
{
//$isCustomerRegister = $request->attributes->get('_route') == 'register_customer';
/** @var User $user */
$user = null;
if ($request->isMethod('POST')) {
$formData = $request->request->get('register_account_form');
switch ($formData['accountType'] ?? null) {
case 'advertiser':
$user = new Advertiser();
break;
case 'customer':
$user = new Customer();
break;
default:
throw new \LogicException('Unknown user type');
}
}
$form = $this->createForm(RegisterAccountForm::class, $user, [
'use_captcha' => $features->use_sign_up_captcha(),
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();
$userService->save($user);
return $this->render('security/register_send.html.twig');
}
return $this->render('security/register.html.twig', ['form' => $form->createView(), 'city' => $city]);
}
#[Route(path: '/reg/{id}/{code}/', name: 'email_confirmation', requirements: ['id' => '\d+', 'code' => '\d+'])]
#[Route(path: '/reg/customer/{id}/{code}/', name: 'email_confirmation.customer', requirements: ['id' => '\d+', 'code' => '\d+'])]
public function confirmEmail(
LoginFormAuthenticator $authenticator,
GuardAuthenticatorHandler $guardHandler,
Request $request,
UserService $userService,
string $id,
string $code
): Response|null {
/** @var User $user */
$user = $userService->findUserByIdAndConfirmationCode((int)$id, $code);
if ($user === null) {
return new Response(Response::HTTP_NOT_FOUND);
}
$userService->enable($user);
return $guardHandler->authenticateUserAndHandleSuccess($user, $request, $authenticator, 'main');
}
}