<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Address;
use App\Entity\Account;
use App\Form\RegisterFormType;
class RegisterController extends AbstractController
{
#[Route('/{_locale}/register',
locale: "en",
format: "html",
requirements: ["_locale" => "en|es|ca", "_format" => "html|xml", ],
defaults: ["_locale" => "en"], name: 'register')]
public function register (Request $request, UserPasswordHasherInterface $passwordHasher, MailerInterface $mailer)
{
$user = new Account();
$form = $this->createForm(RegisterFormType::class, $user, array('type'=>'register'));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$hashedPassword = $passwordHasher->hashPassword(
$user,
'retabit_platform'
);
// encode the plain password
$user->setPassword( $hashedPassword );
$roles[0] = 'ROLE_GUEST';
$user->setRoles($roles);
$user->setCreationDay(new \DateTimeImmutable());
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
$admins = $entityManager->getRepository(Account::class)->findByRole('ROLE_SUPER_ADMIN');
$recipients = array();
foreach($admins as $admin){
$recipients [] = $admin["email"];
}
//Send email to admins
$email = (new TemplatedEmail())
->from(new Address('info@retabit.es', 'Retabit'))
->to(...$recipients)
->subject('RETABIT Register')
->htmlTemplate('Backoffice/email_register.html.twig')
->context([
'expiration_date' => new \DateTime('+7 days'),
'guest' => $user
])
;
$logoPath = $this->getParameter('kernel.project_dir') . '/public/img/logo-menu-white.png';
$cid = $email->embedFromPath($logoPath, 'logo');
$mailer->send($email);
return $this->render('Register/guestRegistered.html.twig');
}
return $this->renderForm('Register/register.html.twig', [
'registerForm' => $form,
]);
}
#[Route('guest-registered', name: 'guest-registered')]
public function guestRegistered (Request $request) : Response
{
return $this->renderForm('Register/guestRegistered.html.twig');
}
#[Route('change-rol', name: 'changeRol')]
public function changeRol (Request $request)
{
// un superAdmin // admin // register
$em = $this->getDoctrine()->getManager();
$usersToUpdate = $em->getRepository(Account::class)->findUsersWithNonSallesEmail();
if (empty($usersToUpdate)) {
$this->addFlash('info', 'No se encontraron usuarios para actualizar.');
return $this->redirectToRoute('dashboard');
}
foreach ($usersToUpdate as $user) {
$user->setRoles(['ROLE_REGISTERED']);
$em->persist($user);
}
$em->flush();
$this->addFlash('success', sprintf('Se han actualizado %d usuarios.', count($usersToUpdate)));
return $this->redirectToRoute('dashboard');
}
/*#[Route('/reset-password', name: 'app_forgot_password')]
public function requestReset(Request $request, MailerInterface $mailer, EntityManagerInterface $em)
{
$form = $this->createForm(PasswordResetRequestFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
$user = $em->getRepository(User::class)->findOneBy(['email' => $email]);
if ($user) {
$token = Uuid::v4()->toRfc4122();
$user->setResetToken($token);
$user->setResetTokenExpiresAt(new \DateTimeImmutable('+1 hour'));
$em->flush();
$resetLink = $this->generateUrl('app_reset_password', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL);
$emailMessage = (new Email())
->from('no-reply@tusitio.com')
->to($user->getEmail())
->subject('Restablecer contraseña')
->html("<p>Haz clic en el siguiente enlace para restablecer tu contraseña:</p><p><a href='$resetLink'>$resetLink</a></p>");
$mailer->send($emailMessage);
}
$this->addFlash('success', 'Si el correo existe, recibirás instrucciones.');
return $this->redirectToRoute('app_login');
}
return $this->render('security/request_reset.html.twig', [
'form' => $form->createView(),
]);
}
#[Route('/reset-password/{token}', name: 'app_reset_password')]
public function resetPassword(Request $request, string $token, EntityManagerInterface $em, UserPasswordHasherInterface $hasher)
{
$user = $em->getRepository(User::class)->findOneBy(['resetToken' => $token]);
if (!$user || $user->getResetTokenExpiresAt() < new \DateTimeImmutable()) {
throw $this->createNotFoundException('Token inválido o expirado.');
}
$form = $this->createFormBuilder()
->add('password', PasswordType::class, ['label' => 'Nueva contraseña'])
->add('submit', SubmitType::class, ['label' => 'Restablecer'])
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setPassword(
$hasher->hashPassword($user, $form->get('password')->getData())
);
$user->setResetToken(null);
$user->setResetTokenExpiresAt(null);
$em->flush();
$this->addFlash('success', 'Contraseña actualizada.');
return $this->redirectToRoute('app_login');
}
return $this->render('security/reset_password.html.twig', [
'form' => $form->createView()
]);
}*/
}