src/Controller/UserProfileController.php line 44
<?phpnamespace App\Controller;use App\Entity\User;use App\Entity\UserProfile;use App\Form\UserProfileType;use App\Form\ChangePwsdFormType;use App\Message\SendEmailMessage;use App\Repository\EventRequestRepository;use App\Repository\RegistrationCertificateRepository;use App\Repository\UserRepository;use App\Controller\UtilsController;use Doctrine\ORM\EntityManagerInterface;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Routing\Generator\UrlGeneratorInterface;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Security\Http\Attribute\IsGranted;use Symfony\Contracts\Translation\TranslatorInterface;use Symfony\Component\Messenger\MessageBusInterface;use Symfony\Component\Form\FormInterface;#[Route('/alumno')]class UserProfileController extends AbstractController{private function denyUnlessSelfOrAdmin(): void{if (!$this->getUser()) {throw $this->createAccessDeniedException();}if (!$this->isGranted('ROLE_ADMIN')&& !$this->isGranted('ROLE_SUPERUSER')&& !$this->isGranted('ROLE_ALUMNO')&& !$this->isGranted('ROLE_COURSE')) {throw $this->createAccessDeniedException();}}#[Route('/alta', name: 'alumno_alta')]public function alta(Request $request,EntityManagerInterface $em,UserPasswordHasherInterface $passwordHasher,UtilsController $utilsController,UserRepository $userRepository,MessageBusInterface $bus) {$user = new User();$profile = new UserProfile();$form = $this->createForm(UserProfileType::class, $profile, ['mode' => 'alta','profile_context' => 'public_signup','validation_groups' => static function (FormInterface $form): array {return ['Default', 'public_signup', 'public_internal'];},]);$form->handleRequest($request);if ($form->isSubmitted()) {$recaptchaResponse = $request->request->get('g-recaptcha-response');if (!$utilsController->isRecaptchaValid($recaptchaResponse)) {$this->addFlash('error', 'Verifique el captcha');return $this->render('public/new_student.html.twig', ['form' => $form->createView(),'recaptcha_site_key' => $_ENV['GOOGLE_RECAPTCHA_SITE_KEY'],]);}}if ($form->isSubmitted() && $form->isValid()) {$dni = $form->get('dni')->getData();if ($dni && $userRepository->findOneBy(['dni' => $dni])) {$this->addFlash('error', 'Ese DNI ya se encuentra dado de alta.');return $this->render('public/new_student.html.twig', ['form' => $form->createView(),'recaptcha_site_key' => $_ENV['GOOGLE_RECAPTCHA_SITE_KEY'],]);}$email = $form->get('email')->getData();if ($email && $userRepository->findOneBy(['email' => $email])) {$this->addFlash('error', 'Ese correo electrónico ya se encuentra dado de alta.');return $this->render('public/new_student.html.twig', ['form' => $form->createView(),'recaptcha_site_key' => $_ENV['GOOGLE_RECAPTCHA_SITE_KEY'],]);}$user->setDni($dni);$user->setUsername($email);$user->setEmail($email);$user->setNomComplet($profile->getNombre());$user->setSurname($profile->getApellido1().' '.$profile->getApellido2());$user->setPhone($profile->getTelefono());$user->setRoles(['ROLE_ALUMNO']);$user->setValid(true);$user->setDeleted(false);$user->setAdmin(false);// password temporal$plainPassword = bin2hex(random_bytes(4));$user->setPassword($passwordHasher->hashPassword($user, $plainPassword));$profile->setUser($user);// activación$token = bin2hex(random_bytes(32));$user->setActivationToken($token);$user->setActive(false);$em->persist($user);$em->persist($profile);$em->flush();$activationUrl = $this->generateUrl('alumno_activate_account',['token' => $token],UrlGeneratorInterface::ABSOLUTE_URL);$bus->dispatch(new SendEmailMessage($user->getEmail(),'notifications/student_account_activation.html.twig','Activación de la cuenta necesaria',$user->getNomComplet(),['activationUrl' => $activationUrl,'gender' => $profile->getSexo()]));$this->addFlash('success', 'Revise su correo para activar la cuenta');return $this->redirectToRoute('app_login');}return $this->render('public/new_student.html.twig', ['form' => $form->createView(),'recaptcha_site_key' => $_ENV['GOOGLE_RECAPTCHA_SITE_KEY'],]);}#[Route('/activar/{token}', name: 'alumno_activate_account')]public function activate(string $token,Request $request,EntityManagerInterface $em,UserPasswordHasherInterface $hasher,MessageBusInterface $bus) {$user = $em->getRepository(User::class)->findOneBy(['activationToken' => $token]);if (!$user) {throw $this->createNotFoundException();}$isPasswordSetupOnly = $user->isActive();if ($request->isMethod('POST')) {if (!$this->isCsrfTokenValid('activate_account', $request->request->get('_token'))) {throw $this->createAccessDeniedException();}$password = (string) $request->request->get('password');$repeat = (string) $request->request->get('password_repeat');if ($password === '' || $repeat === '') {$this->addFlash('error', 'Debe introducir ambos campos');} elseif ($password !== $repeat) {$this->addFlash('error', 'Las contraseñas no coinciden');} else {$user->setPassword($hasher->hashPassword($user, $password));$user->setActivationToken(null);if (!$isPasswordSetupOnly) {$user->setActive(true);}$em->flush();if ($isPasswordSetupOnly) {$this->addFlash('success', 'La contraseña se ha establecido correctamente. Ya puede acceder a la plataforma con su correo electrónico y la contraseña definida.');} else {$bus->dispatch(new SendEmailMessage($user->getEmail(),'notifications/student_account_activated.html.twig','Cuenta activada',$user->getNomComplet(),['loginUrl' => $this->generateUrl('app_login',[],UrlGeneratorInterface::ABSOLUTE_URL)]));$this->addFlash('success', 'Su cuenta ha sido activada correctamente. Ya puede acceder a la plataforma con su dirección de correo y la contraseña establecida');}return $this->redirectToRoute('app_login');}}return $this->render('public/activate_account.html.twig', ['token' => $token,'isPasswordSetupOnly' => $isPasswordSetupOnly,]);}#[Route(path: '/cambioPassword', name: 'alumno_change_password')]public function changePswd(Request $request,TranslatorInterface $translator,EntityManagerInterface $em,UserPasswordHasherInterface $passwordHasher){$this->denyUnlessSelfOrAdmin();$user = $this->getUser();$form = $this->createForm(ChangePwsdFormType::class, $user, ['translator' => $translator]);$form->handleRequest($request);if ($form->isSubmitted() && $form->isValid()) {$password = $form['justpassword']->getData();$newPassword = $form['newpassword']->getData();if ($passwordHasher->isPasswordValid($user, $password)) {$user->setPassword($passwordHasher->hashPassword($user, $newPassword));} else {$this->addFlash('error', 'backend.user.new_passwod_must_be');return $this->render('public/profile/cambio_password_student.html.twig', ['passwordForm' => $form]);}$em->persist($user);$em->flush();$this->addFlash('success', $translator->trans('backend.user.changed_password'));return $this->redirectToRoute('public_events');}return $this->render('public/profile/cambio_password_student.html.twig', ['passwordForm' => $form]);}#[Route('/perfil', name: 'alumno_perfil')]public function editar(Request $request,EntityManagerInterface $em) {$this->denyUnlessSelfOrAdmin();$user = $this->getUser();$profile = $user->getProfile();if (!$profile) {$this->addFlash('error', 'Perfil no encontrado');return $this->redirectToRoute('public_events');}$mode = $request->query->getBoolean('edit') ? 'edit' : 'view';$form = $this->createForm(UserProfileType::class, $profile, ['mode' => $mode,'profile_context' => 'public_profile',]);$form->get('dni')->setData($user->getDni());$form->get('email')->setData($user->getEmail());$form->handleRequest($request);if ($mode && $form->isSubmitted() && $form->isValid()) {$em->flush();$this->addFlash('success', 'Perfil actualizado');return $this->redirectToRoute('alumno_perfil');}return $this->render('public/profile/edit_profile_student.html.twig', ['form' => $form->createView(),'mode' => $mode,]);}#[Route('/cursos', name: 'alumno_cursos')]public function cursos(EventRequestRepository $repo,RegistrationCertificateRepository $registrationCertificateRepository) {$this->denyUnlessSelfOrAdmin();$certificatesByEvent = [];foreach ($registrationCertificateRepository->findActiveByUser($this->getUser()) as $certificate) {$eventId = $certificate->getEvent()?->getId();if ($eventId === null) {continue;}$certificatesByEvent[$eventId][] = $certificate;}return $this->render('public/profile/course_history_student.html.twig', ['requests' => $repo->findByUser($this->getUser()),'certificatesByEvent' => $certificatesByEvent,]);}#[Route('/baja', name: 'alumno_baja')]public function baja(EntityManagerInterface $em){$this->denyUnlessSelfOrAdmin();/** @var \App\Entity\User $user */$user = $this->getUser();$user->setDeleted(true);$user->setValid(false);$em->flush();return $this->redirectToRoute('app_logout');}}