<?php
namespace App\Controller;
use App\Component\ResetPassword\ResetPasswordFactory;
use App\Entity\ResetPasswordRequest;
use App\Entity\User;
use App\Form\RegistrationFormType;
use App\Security\UserAuthenticator;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Contracts\Translation\TranslatorInterface;
class RegistrationController extends ABaseController
{
public function __construct(
private ResetPasswordFactory $resetPasswordFactory,
)
{
}
#[Route('/register', name: 'route.register')]
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, UserAuthenticatorInterface $userAuthenticator, UserAuthenticator $authenticator, EntityManagerInterface $entityManager): Response
{
if (!empty($entityManager->getRepository(User::class)->findAll())) {
return $this->redirectToRoute('route.login');
}
$user = new User();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// encode the plain password
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$user->setRoles(['ROLE_SUPER_ADMIN']);
$user->setFirstName('admin')
->setLastname('admin');
$entityManager->persist($user);
$entityManager->flush();
// do anything else you need here, like send an email
return $userAuthenticator->authenticateUser(
$user,
$authenticator,
$request
);
}
return $this->render('registration/register.html.twig', [
'registrationForm' => $form->createView(),
]);
}
#[Route('/reset_password', name: 'route.reset_password')]
public function requestResetPassword(Request $request): Response
{
$response = $this->resolveDashboardRedirect();
if ($response instanceof Response) {
return $response;
}
$formBuilder = $this->createFormBuilder();
$formBuilder->add('email', EmailType::class, [
'label' => 'E-mail',
'required' => true
]);
$formBuilder->add('submit', SubmitType::class, [
'label' => 'Odeslat žádost o obnovení hesla'
]);
$form = $formBuilder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->resetPasswordFactory->resetPasswordPrepare($form->get('email')->getData());
return $this->redirectToRoute('route.login');
}
return $this->render('registration/reset_password_email.twig', [
'form' => $form->createView()
]);
}
#[Route('/reset_password/{token}', name: 'route.reset_password_verify', requirements: ['token' => '.+'])]
public function resetPassword(
string $token,
Request $request,
UserPasswordHasherInterface $userPasswordHasher,
EntityManagerInterface $entityManager,
): Response {
$response = $this->resolveDashboardRedirect();
if ($response instanceof Response) {
return $response;
}
$resetPasswordRequest = $this->getEntityManager()->getRepository(ResetPasswordRequest::class)->findOneBy(['token' => $token]);
if (!$resetPasswordRequest instanceof ResetPasswordRequest) {
return $this->redirectToRoute('route.login');
}
$isValid = $this->resetPasswordFactory->resolveResetPassword($resetPasswordRequest);
if (!$isValid) {
return $this->redirectToRoute('route.login');
}
$formBuilder = $this->createFormBuilder();
$formBuilder->add('plainPassword', RepeatedType::class, [
'type' => PasswordType::class,
'first_options' => ['label' => 'Heslo'],
'second_options' => ['label' => 'Heslo znovu'],
'required' => true,
'mapped' => false,
'attr' => ['autocomplete' => 'new-password'],
'constraints' => [
new NotBlank([
'message' => 'Prosím zadejte heslo',
]),
new Length([
'min' => 6,
'minMessage' => 'Vaše heslo by mělo mít minimálně {{ limit }} znaků',
'max' => 4096,
]),
],
]);
$formBuilder->add('submit', SubmitType::class, [
'label' => 'Nastavit heslo'
]);
$form = $formBuilder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user = $resetPasswordRequest->getUser();
$resetPasswordRequest->setVerifiedAt(new \DateTimeImmutable());
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$entityManager->flush();
return $this->redirectToRoute('route.login');
}
return $this->render('registration/reset_password_email.twig', [
'form' => $form->createView()
]);
}
}