src/Core/Controller/Web/SecurityController.php line 139

Open in your IDE?
  1. <?php
  2. namespace App\Core\Controller\Web;
  3. use App\Core\Controller\Api\SecurityApiController;
  4. use App\Core\Entity\Bloqueos;
  5. use App\Core\Entity\CategoriaUsuario;
  6. use App\Core\Entity\InformacionPerfil;
  7. use App\Core\Entity\Institucion\DirectorInstitucion;
  8. use App\Core\Entity\Notificacion;
  9. use App\Core\Entity\RecordatorioAgenda;
  10. use App\Core\Entity\Seguidor;
  11. use App\Core\Entity\Subscripciones\PagoSubscripcion;
  12. use App\Core\Entity\SugerenciaCategoria;
  13. use App\Core\Entity\User;
  14. use App\Core\Entity\Maestro;
  15. use App\Core\Entity\Estudiante;
  16. use App\Core\Form\Model\UserModel;
  17. use App\Core\Form\UserFormType;
  18. use App\Core\Repository\CategoriaRepository;
  19. use App\Core\Repository\CityRepository;
  20. use App\Core\Repository\ColorRepository;
  21. use App\Core\Repository\CountryRepository;
  22. use App\Core\Repository\CursoRepository;
  23. use App\Core\Repository\InformacionPerfil\ColegioRepository;
  24. use App\Core\Repository\InformacionPerfil\EmpleoRepository;
  25. use App\Core\Repository\InformacionPerfil\IdiomaRepository;
  26. use App\Core\Repository\InformacionPerfil\ProfesionRepository;
  27. use App\Core\Repository\InformacionPerfil\UniversidadRepository;
  28. use App\Core\Repository\Institucion\DirectorInstitucionRepository;
  29. use App\Core\Repository\NotificacionRepository;
  30. use App\Core\Repository\SeguidorRepository;
  31. use App\Core\Repository\TutorialRepository;
  32. use App\Core\Repository\UserRepository;
  33. use App\Core\Security\LoginUserAuthenticator;
  34. use App\Core\Validator\CursoValidator;
  35. use App\Entity\FichaEstudiantil;
  36. use App\Entity\OtrosContactosEmergencia;
  37. use App\Entity\RecordatorioCalendario;
  38. use App\EventSubscriber\LocaleSubscriber;
  39. use App\EventSubscriber\UserLocaleSubscriber;
  40. use App\Repository\CampusMaestroRepository;
  41. use App\Repository\InvitacionInstitucionRepository;
  42. use App\Repository\OtrosContactosEmergenciaRepository;
  43. use App\Service\suscripcion\SuscripcionesKoleyo;
  44. use App\Service\TutorialService;
  45. use App\Service\visa_cybersource\visa_cybersource;
  46. use Doctrine\ORM\EntityManagerInterface;
  47. use Knp\Component\Pager\PaginatorInterface;
  48. use Lcobucci\JWT\Builder;
  49. use Lcobucci\JWT\Signer\Hmac\Sha256;
  50. use Lcobucci\JWT\Signer\Key;
  51. use Lexik\Bundle\JWTAuthenticationBundle\Encoder\JWTEncoderInterface;
  52. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  53. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  54. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  55. use Symfony\Component\Console\CommandLoader\ContainerCommandLoader;
  56. use Symfony\Component\HttpFoundation\Cookie;
  57. use Symfony\Component\HttpFoundation\File\UploadedFile;
  58. use Symfony\Component\HttpFoundation\RedirectResponse;
  59. use Symfony\Component\HttpFoundation\Request;
  60. use Symfony\Component\HttpFoundation\Response;
  61. use Symfony\Component\HttpFoundation\Session\Session;
  62. use Symfony\Component\Mailer\MailerInterface;
  63. use Symfony\Component\Mime\Address;
  64. use Symfony\Component\Mime\Message;
  65. use Symfony\Component\Routing\Annotation\Route;
  66. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  67. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  68. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  69. use Symfony\Component\Serializer\SerializerInterface;
  70. use Symfony\Component\Validator\Validator\ValidatorInterface;
  71. use Symfony\Contracts\Translation\TranslatorInterface;
  72. use Symfony\Component\HttpFoundation\File\File;
  73. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  74. use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;
  75. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  76. class SecurityController extends AbstractController
  77. {
  78. /**
  79. * @var SuscripcionesKoleyo
  80. */
  81. private $suscripcionesKoleyo;
  82. /**
  83. * @var TranslatorInterface
  84. */
  85. private $translator;
  86. /**
  87. * @var SerializerInterface
  88. */
  89. private $serializer;
  90. /**
  91. * @var EntityManagerInterface
  92. */
  93. private $entityManager;
  94. /**
  95. * @var TutorialRepository
  96. */
  97. private $tutorialRepository;
  98. /**
  99. * @var UrlGeneratorInterface
  100. */
  101. private $urlGenerator;
  102. /**
  103. * @var JWTEncoderInterface
  104. */
  105. private $JWTEncoder;
  106. /**
  107. * @var ColorRepository
  108. */
  109. private $colorRepository;
  110. private $campusMaestroRepository;
  111. private $invitacionInstitucionRepository;
  112. private $userRepository;
  113. private $directorInstitucionRepository;
  114. function __construct(SuscripcionesKoleyo $suscripcionesKoleyo, TranslatorInterface $translator, SerializerInterface $serializer, EntityManagerInterface $entityManager, TutorialRepository $tutorialRepository, UrlGeneratorInterface $urlGenerator, JWTEncoderInterface $JWTEncoder, ColorRepository $colorRepository, CampusMaestroRepository $campusMaestroRepository, InvitacionInstitucionRepository $invitacionInstitucionRepository, UserRepository $userRepository, DirectorInstitucionRepository $directorInstitucionRepository)
  115. {
  116. $this->suscripcionesKoleyo = $suscripcionesKoleyo;
  117. $this->translator = $translator;
  118. $this->serializer = $serializer;
  119. $this->entityManager = $entityManager;
  120. $this->tutorialRepository = $tutorialRepository;
  121. $this->urlGenerator = $urlGenerator;
  122. $this->JWTEncoder = $JWTEncoder;
  123. $this->colorRepository = $colorRepository;
  124. $this->campusMaestroRepository = $campusMaestroRepository;
  125. $this->invitacionInstitucionRepository = $invitacionInstitucionRepository;
  126. $this->userRepository = $userRepository;
  127. $this->directorInstitucionRepository = $directorInstitucionRepository;
  128. }
  129. #[Route('/login', name: 'app_login')]
  130. public function login(Request $request, AuthenticationUtils $authenticationUtils)
  131. {
  132. //Me aseguro que el login sea en https en el servidor...
  133. $strHostName = $request->getHttpHost();
  134. if ($_ENV['APP_ENV'] === 'prod') {
  135. $tieneWWW = strpos($strHostName, 'www');
  136. if ($tieneWWW === false) {
  137. $strURL = "www.{$strHostName}";
  138. return new RedirectResponse("https://{$strURL}/login");
  139. }
  140. if (!$request->isSecure()) {
  141. $strURL = "https://{$strHostName}";
  142. return new RedirectResponse("{$strURL}/login");
  143. }
  144. }
  145. else if ($_ENV['APP_ENV'] === 'test') {
  146. if (!$request->isSecure()) {
  147. $strURL = "https://{$strHostName}/login";
  148. return new RedirectResponse("{$strURL}");
  149. }
  150. }
  151. //Si ya hay un usuario registrado redirige a la pantalla de perfil
  152. if ($this->getUser()) {
  153. $this->checkInvitacion($this->getUser()->getEmail());
  154. $redirectResponse = new RedirectResponse($this->urlGenerator->generate('app_perfil'));
  155. //se desconecta el test de pub porque ya hay usuarios iguales creados en el mismo servidor
  156. $uat = [
  157. 'id' => $this->getUser()->getId(),
  158. 'idMaestro' => ($this->getUser()->getMaestro()) ? $this->getUser()->getMaestro()->getId() : 0,
  159. 'idEstudiante' => ($this->getUser()->getEstudiante()) ? $this->getUser()->getEstudiante()->getId() : 0,
  160. 'idDirector' => ($this->getUser()->getDirector()) ? $this->getUser()->getDirector()->getId() : 0,
  161. 'autorizado' => true
  162. ];
  163. $redirectResponse->headers->setCookie(Cookie::create('UAT',$this->JWTEncoder->encode($uat)));
  164. return $redirectResponse;
  165. }
  166. // Obtiene el error de login si existe
  167. $error = $authenticationUtils->getLastAuthenticationError();
  168. // Obtiene el �ltimo nombre de usuario
  169. $lastUsername = $authenticationUtils->getLastUsername();
  170. return $this->render('security/login.html.twig', [
  171. 'last_username' => $lastUsername,
  172. 'error' => $error
  173. ]);
  174. }
  175. #[Route('/recuperacion', name: 'app_ingresar_correo_recuperacion')]
  176. function ingresarCorreoRecuperacion(Request $request, MailerInterface $mailer, UserRepository $userRepository) {
  177. if ($request->isMethod('POST')) {
  178. $resultado = SecurityApiController::verificarCorreoRecuperacion($request, $userRepository, $mailer, $this->entityManager, $this, $this->translator);
  179. if ($resultado['correcto'] === false)
  180. return $this->render('security/recuperarPassword/ingresar_correo_recuperacion.html.twig', [
  181. 'error' => $resultado['mensaje']
  182. ]);
  183. return $this->redirectToRoute('app_ingresar_codigo_recuperacion', ['email' => $resultado['usuario']->getEmail()]);
  184. }
  185. return $this->render('security/recuperarPassword/ingresar_correo_recuperacion.html.twig');
  186. }
  187. #[Route('/recuperacion/codigo/{email}', name: 'app_ingresar_codigo_recuperacion')]
  188. function ingresarCodigoRecuperacion(User $usuario, Request $request, UserPasswordHasherInterface $userPasswordEncoder, UserAuthenticatorInterface $userAuthenticator, LoginUserAuthenticator $loginAuthenticator) {
  189. if ($request->isMethod('POST')) {
  190. if (!$this->isCsrfTokenValid('codigo-recuperacion', $request->request->get('_csrf_token'))) {
  191. $resultado['correcto'] = false;
  192. $resultado['mensaje'] = $this->translator->trans('datos_invalidos', [], 'errores');
  193. }
  194. else $resultado = SecurityApiController::cambiarPassword($request, $usuario, $userPasswordEncoder, $this->entityManager, $this->translator);
  195. if ($resultado['correcto'] !== true)
  196. return $this->render('security/recuperarPassword/ingresar_codigo.html.twig', [
  197. 'error' => $resultado['mensaje'],
  198. 'correo' => $usuario->getEmail()
  199. ]);
  200. return $userAuthenticator->authenticateUser(
  201. $usuario,
  202. $loginAuthenticator,
  203. $request
  204. );
  205. }
  206. return $this->render('security/recuperarPassword/ingresar_codigo.html.twig', [
  207. 'correo' => $usuario->getEmail()
  208. ]);
  209. }
  210. #[Route('/logout', name: 'app_logout')]
  211. public function logout(){}
  212. #[Route('/register', name: 'app_register')]
  213. public function register(Request $request, UserPasswordHasherInterface $passwordEncoder, UserAuthenticatorInterface $userAuthenticator, LoginUserAuthenticator $loginAuthenticator, ValidatorInterface $validator, UserRepository $userRepository, MailerInterface $mailer, TranslatorInterface $translator, CountryRepository $countryRepository, TutorialService $tutorialService)
  214. {
  215. $error = '';
  216. $lang = $request->getLanguages()[0];
  217. $paises = $countryRepository->findAll();
  218. $correoInvitacion = null;
  219. if ($request->query->get('email') && !$userRepository->findOneBy(['email' => urldecode($request->query->get('email'))]))
  220. $correoInvitacion = urldecode($request->query->get('email'));
  221. if($request->isMethod('POST') && $this->isCsrfTokenValid('csrf_seguridad', $request->request->get('_csrf_token'))) {
  222. $resultado = SecurityApiController::registrarUsuario($request, $translator, $mailer, $passwordEncoder, $this->entityManager, $userRepository, $countryRepository, $this->tutorialRepository, $tutorialService);
  223. if ($resultado['correcto'] !== true)
  224. return $this->render('security/register.html.twig', [
  225. 'error' => $resultado['mensaje'],
  226. 'lang' => $lang,
  227. 'paises' => $paises,
  228. 'correoInvitacion' => $correoInvitacion
  229. ]);
  230. $user = $resultado['usuario'];
  231. $invitacionInstitucion = $this->invitacionInstitucionRepository->findOneBy(['email' => $user->getEmail(), 'estado' => 0]);
  232. $invitacionMaestro = $this->campusMaestroRepository->findOneBy(['email' => $user->getEmail(), 'estado' => 0]);
  233. //Mantiene en la sesion que el usuario fue invitado, para crear su perfil de alumno
  234. if ($correoInvitacion && $user->getEmail() === $correoInvitacion) {
  235. if ($invitacionInstitucion) {
  236. $request->getSession()->set('director', true);
  237. } elseif ($invitacionMaestro) {
  238. $request->getSession()->set('maestro', true);
  239. } else {
  240. $request->getSession()->set('invitado', true);
  241. }
  242. }
  243. $this->checkInvitacion($correoInvitacion);
  244. //De una vez autentica al usuario que se registr�
  245. /*
  246. return $guardHandler->authenticateUserAndHandleSuccess(
  247. $user,
  248. $request,
  249. $loginAuthenticator,
  250. 'main'
  251. );
  252. */
  253. return $this->render('homepage/informacion_confirmacion.html.twig', [
  254. 'error' => $error,
  255. 'lang' => $lang,
  256. 'correo' => $user->getEmail(),
  257. 'correoInvitacion' => $correoInvitacion,
  258. 'paises' => $paises
  259. ]);
  260. }
  261. return $this->render('security/register.html.twig', [
  262. 'error' => $error,
  263. 'lang' => $lang,
  264. 'correoInvitacion' => $correoInvitacion,
  265. 'paises' => $paises
  266. ]);
  267. }
  268. public function checkInvitacion($correoInvitacion) {
  269. $director = null;
  270. $maestro = null;
  271. $user = $this->userRepository->findOneBy(['email' => $correoInvitacion]);
  272. if ($user) {
  273. $director = $user->getDirector();
  274. $maestro = $user->getMaestro();
  275. }
  276. $invitacion = $this->invitacionInstitucionRepository->findOneBy(['email' => $correoInvitacion, 'estado' => 0]);
  277. $campusMaestro = $this->campusMaestroRepository->findOneBy(['email' => $correoInvitacion, 'estado' => 0]);
  278. if ($invitacion && $director) {
  279. $invitacion->setDirector($director);
  280. $invitacion->setEstado(1);
  281. $this->entityManager->persist($invitacion);
  282. $this->entityManager->flush($invitacion);
  283. $directorAsignado = $this->directorInstitucionRepository->findOneBy(['director' => $director, 'institucion' => $invitacion->getInstitucion(), 'estado' => 1]);
  284. if (!$directorAsignado) {
  285. $directorInstitucion = new DirectorInstitucion();
  286. $directorInstitucion->setDirector($director);
  287. $directorInstitucion->setInstitucion($invitacion->getInstitucion());
  288. $this->entityManager->persist($directorInstitucion);
  289. $this->entityManager->flush($directorInstitucion);
  290. }
  291. }
  292. if ($campusMaestro && $maestro) {
  293. $campusMaestroAsignado = $this->campusMaestroRepository->findOneBy(['maestro' => $maestro, 'Campus' => $campusMaestro->getCampus(), 'estado' => 1]);
  294. if ($campusMaestroAsignado) return;
  295. $campusMaestro->setMaestro($maestro);
  296. $campusMaestro->setEstado(1);
  297. $this->entityManager->persist($campusMaestro);
  298. $this->entityManager->flush($campusMaestro);
  299. }
  300. }
  301. /**
  302. * @param Request $request
  303. * @param UserAuthenticatorInterface $userAuthenticator
  304. * @param LoginUserAuthenticator $loginAuthenticator
  305. * @param UserRepository $userRepository
  306. */
  307. #[Route('/confirmar-correo', name: 'app_confirmar_correo')]
  308. function webConfirmarCorreo(Request $request, UserAuthenticatorInterface $userAuthenticator, LoginUserAuthenticator $loginAuthenticator, UserRepository $userRepository) {
  309. $resultado = SecurityApiController::confirmarCorreo($request, $this->entityManager, $userRepository, $this->translator);
  310. if ($resultado['correcto'] !== true) return $this->redirectToRoute('app_login');
  311. return $userAuthenticator->authenticateUser(
  312. $resultado['usuario'],
  313. $loginAuthenticator,
  314. $request
  315. );
  316. //return new RedirectResponse($this->urlGenerator->generate('app_login'));
  317. }
  318. #[Route('/informacion-perfil/{editar}', name: 'app_informacion_perfil', defaults: ['editar' => null])]
  319. public function informacionPerfil(Request $request,
  320. CityRepository $cityRepository, IdiomaRepository $idiomaRepository,
  321. EmpleoRepository $empleoRepository, ProfesionRepository $profesionRepository,
  322. UniversidadRepository $universidadRepository, ColegioRepository $colegioRepository, $editar = null) {
  323. if ($editar === 'editar') {
  324. $editar = true;
  325. $this->denyAccessUnlessGranted('ROLE_USER');
  326. }
  327. else $editar = false;
  328. if ($request->getMethod() === 'POST') {
  329. $resultado = SecurityApiController::postInformacionPerfil($request, $this->translator, $this->entityManager, $editar, $this->getUser(), $cityRepository, $universidadRepository, $colegioRepository, $empleoRepository, $idiomaRepository, $profesionRepository);
  330. if ($resultado['correcto'] !== true) return $this->redirectToRoute('app_informacion_perfil', ['editar' => 'editar']);
  331. if ($editar) return $this->redirectToRoute('app_perfil');
  332. else return $this->redirectToRoute('app_seleccionar_categorias');
  333. }
  334. if ($editar && $this->getUser()->getInformacionPerfil()) {
  335. $resultado = SecurityApiController::getInformacionPerfil($this->getUser());
  336. /** @var InformacionPerfil\IdiomaPerfil[] $idiomaPerfiles */
  337. $idiomaPerfiles = $resultado['idiomaPerfiles'];
  338. /** @var InformacionPerfil\EmpleoPerfil[] $empleoPerfiles */
  339. $empleoPerfiles = $resultado['empleoPerfiles'];
  340. /** @var InformacionPerfil\ProfesionPerfil[] $profesionPerfiles */
  341. $profesionPerfiles = $resultado['profesionPerfiles'];
  342. /** @var InformacionPerfil\UniversidadPerfil[] $universidadPerfiles */
  343. $universidadPerfiles = $resultado['universidadPerfiles'];
  344. /** @var InformacionPerfil\ColegioPerfil[] $colegioPerfiles */
  345. $colegioPerfiles = $resultado['colegioPerfiles'];
  346. }
  347. return $this->render('security/informacion_perfil.html.twig', [
  348. 'editar' => $editar,
  349. 'idiomaPerfiles' => $idiomaPerfiles ?? null,
  350. 'empleoPerfiles' => $empleoPerfiles ?? null,
  351. 'profesionPerfiles' => $profesionPerfiles ?? null,
  352. 'universidadPerfiles' => $universidadPerfiles ?? null,
  353. 'colegioPerfiles' => $colegioPerfiles ?? null,
  354. 'idiomas' => $idiomaRepository->findAll()
  355. ]);
  356. }
  357. #[Route('/seleccionar-categorias/{editar}', name: 'app_seleccionar_categorias', defaults: ['editar' => null])]
  358. function seleccionarCategoriasFavoritas(Request $request, CategoriaRepository $categoriaRepository, $editar = false) {
  359. if ($editar === 'editar') {
  360. $editar = true;
  361. $this->denyAccessUnlessGranted('ROLE_USER');
  362. }
  363. if ($request->getMethod() === 'POST') {
  364. /** @var User $user */
  365. $user = $this->getUser();
  366. $resultado = SecurityApiController::seleccionarCategorias($request, $user, $this->entityManager, $categoriaRepository);
  367. if ($resultado['correcto'] !== true) return $this->render('security/categorias_favoritas.html.twig', [
  368. 'categorias' => $categoriaRepository->findAll(),
  369. 'editar' => $editar
  370. ]);
  371. if ($editar) return $this->redirectToRoute('app_informacion_perfil', ['editar' => 'editar']);
  372. else return $this->redirectToRoute('app_seleccionar_perfil_inicial');
  373. }
  374. $categorias = $categoriaRepository->findAll();
  375. return $this->render('security/categorias_favoritas.html.twig', [
  376. 'categorias' => $categorias,
  377. 'editar' => $editar
  378. ]);
  379. }
  380. #[Route('/seleccionar-perfil', name: 'app_seleccionar_perfil_inicial')]
  381. #[IsGranted('ROLE_USER')]
  382. public function seleccionarPerfilInicial(Request $request) {
  383. if ($request->isMethod('POST') || $request->getSession()->get('invitado') === true) {
  384. if ($request->getSession()->get('invitado') === true)
  385. $request->request->set('perfil', 'estudiante');
  386. if ($request->getSession()->get('maestro') === true)
  387. $request->request->set('perfil', 'maestro');
  388. if ($request->getSession()->get('director') === true)
  389. $request->request->set('perfil', 'director');
  390. $resultado = SecurityApiController::crearPerfil($request, $this->getUser(), $this->suscripcionesKoleyo, $this->entityManager, $this->translator);
  391. if ($resultado['correcto'] !== true) return $this->render('security/seleccionar_perfil.html.twig', [
  392. 'error' => $resultado['mensaje']
  393. ]);
  394. if ($request->request->get('perfil') === 'maestro'){
  395. return $this->redirectToRoute('app_informacion_perfil_maestro');
  396. }
  397. else if ($request->request->get('perfil') === 'estudiante') {
  398. if ($request->getSession()->get('invitado') === true) {
  399. $request->getSession()->remove('invitado');
  400. return $this->redirectToRoute('app_estudiante_invitaciones');
  401. }
  402. return $this->redirectToRoute('app_estudiante_ficha_perfil_estudiante');
  403. }
  404. else if ($request->request->get('perfil') === 'director') {
  405. return $this->redirectToRoute('app_mis_instituciones');
  406. }
  407. }
  408. return $this->render('security/seleccionar_perfil.html.twig', [
  409. 'error' => ''
  410. ]);
  411. }
  412. #[Route('/perfil', name: 'app_perfil')]
  413. #[IsGranted('ROLE_USER')]
  414. public function perfilUsuario(Request $request, PaginatorInterface $paginator, CursoRepository $cursoRepository, NotificacionRepository $notificacionRepository) {
  415. $tutoriales = $this->tutorialRepository->getTutorialesDeUsuarioYRuta($this->getUser()->getId(), $request->attributes->get('_route'));
  416. /** @var User $user */
  417. $user = $this->getUser();
  418. $error = null;
  419. $msg = '';
  420. $resultado = SecurityApiController::getDatosPerfil($request, $cursoRepository, $user, $paginator, $notificacionRepository);
  421. //manejador de errores generales dentro de la aplicacion
  422. if($request->get('k-invalid-session')){
  423. $error = $this->translator->trans('sesion_invalida', [], 'errores');
  424. if($request->get('code') == 'k0001'){
  425. $msg = $this->translator->trans('no_eres_estudiante', [], 'errores');
  426. }
  427. }
  428. return $this->render('security/perfil_de_usuario.html.twig', array_merge($resultado, ['tutoriales' => $tutoriales], ['errorDeAcceso' => $error], ['msg' => $msg]));
  429. }
  430. #[Route('/perfil/{id}/{nombreCompleto}', name: 'app_perfil_publico')]
  431. #[IsGranted('ROLE_USER')]
  432. public function perfilPublico(User $user, CursoRepository $cursoRepository, PaginatorInterface $paginator, Request $request) {
  433. /** @var User $usuarioActual */
  434. $usuarioActual = $this->getUser();
  435. $datos = SecurityApiController::getDatosPerfilPublico($request, $cursoRepository, $paginator, $user, $usuarioActual);
  436. return $this->render('security/perfil_publico.html.twig', $datos);
  437. }
  438. #[Route('/perfil/buscar-perfiles', name: 'app_buscar_perfiles')]
  439. #[IsGranted('ROLE_USER')]
  440. public function buscarPerfiles(Request $request, UserRepository $userRepository, PaginatorInterface $paginator) {
  441. /** @var User $usuarioActual */
  442. $usuarioActual = $this->getUser();
  443. $datos = SecurityApiController::buscarPerfilesPantalla($request, $userRepository, $paginator, $usuarioActual);
  444. return $this->render('security/buscar_perfil.html.twig', $datos);
  445. }
  446. #[Route('/mis-perfiles', name: 'app_mis_perfiles')]
  447. #[IsGranted('ROLE_USER')]
  448. public function misPerfiles(Request $request) {
  449. $tutoriales = $this->tutorialRepository->getTutorialesDeUsuarioYRuta($this->getUser()->getId(), $request->attributes->get('_route'));
  450. /** @var User $usuarioActual */
  451. $usuarioActual = $this->getUser();
  452. if ($request->isMethod('POST')) {
  453. $resultado = SecurityApiController::crearPerfil($request, $usuarioActual, $this->suscripcionesKoleyo, $this->entityManager, $this->translator);
  454. if ($resultado['correcto'] !== true) return $this->render('security/mis_perfiles.html.twig', ['error' => $resultado['mensaje'], 'tutoriales' => $tutoriales]);
  455. $this->checkInvitacion($usuarioActual->getEmail());
  456. if ($request->request->get('perfil') === 'maestro') return $this->redirectToRoute('app_informacion_perfil_maestro');
  457. else if ($request->request->get('perfil') === 'estudiante') return $this->redirectToRoute('app_estudiante_mis_cursos');
  458. else if ($request->request->get('perfil') === 'director') return $this->redirectToRoute('app_mis_instituciones');
  459. }
  460. return $this->render('security/mis_perfiles.html.twig', [
  461. 'tutoriales' => $tutoriales
  462. ]);
  463. }
  464. #[Route('/maestro/perfil-maestro', name: 'app_informacion_perfil_maestro')]
  465. function informacionPerfilMaestro(Request $request){
  466. //$this->denyAccessUnlessGranted('ES_MAESTRO', $this->getUser());
  467. if (!$this->isGranted('ES_MAESTRO', $this->getUser())) {
  468. //throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException('Acceso denegado');
  469. return new RedirectResponse($this->generateUrl('app_perfil'));
  470. }
  471. if ($request->getMethod() === 'POST') {
  472. /** @var User $usuario */
  473. $usuario = $this->getUser();
  474. $resultado = SecurityApiController::actualizarDatosMaestro($request, $usuario, $this->entityManager);
  475. if ($resultado['correcto'] !== true) return $this->render('security/informacion_perfil_maestro.html.twig', ['error' => $resultado['mensaje']]);
  476. return $this->redirectToRoute('app_perfil_maestro');
  477. }
  478. return $this->render('security/informacion_perfil_maestro.html.twig');
  479. }
  480. #[Route('/estudiante/ficha', name: 'app_estudiante_ficha_perfil_estudiante')]
  481. function fichaEstududiantil(Request $request, OtrosContactosEmergenciaRepository $otrosContactosEmergenciaRepository, CategoriaRepository $categoriaRepository, UserRepository $userRepository){
  482. //$this->denyAccessUnlessGranted('ES_MAESTRO', $this->getUser());
  483. if (!$this->isGranted('ES_ESTUDIANTE', $this->getUser())) {
  484. //throw new \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException('Acceso denegado');
  485. return new RedirectResponse($this->generateUrl('app_perfil'));
  486. }
  487. $categorias = $categoriaRepository->findAll();
  488. if ($request->getMethod() === 'POST') {
  489. $nombresCategoria = array_map(array($this, 'getNombreCategoriaEnCheckBoxes'), array_filter($request->request->keys(), array($this, 'checkBoxKey')));
  490. /** @var User $usuario */
  491. $usuario = $this->getUser();
  492. /** @var Estudiante $estudiante */
  493. $estudiante = $usuario->getEstudiante();
  494. $keys = $request->request->keys();
  495. if ($estudiante->getFichaEstudiantil()){
  496. return $this->redirectToRoute('app_perfil_estudiante');
  497. }
  498. if (trim($request->request->get("nombres_usuario")) !== '')
  499. $usuario->asignarNombresUsuario($request->request->get('nombres_usuario'));
  500. if (trim($request->request->get('apellidos_usuario')) !== '')
  501. $usuario->asignarApellidosUsuario($request->request->get('apellidos_usuario'));
  502. if (trim($request->request->get('nombres_usuario')) !== '' && trim($request->request->get('apellidos_usuario')) !== ''){
  503. $usuario->asignarNombreCompleto();
  504. }
  505. if (!empty($nombresCategoria)){
  506. foreach ($nombresCategoria as $categoriaNombre){
  507. $categoria = $categoriaRepository->findOneBy(["nombre"=>$categoriaNombre]);
  508. $categoriaUsuario = new CategoriaUsuario();
  509. $categoriaUsuario->setCategoria($categoria);
  510. $categoriaUsuario->setUsuario($usuario);
  511. $this->entityManager->persist($categoriaUsuario);
  512. $this->entityManager->flush($categoriaUsuario);
  513. }
  514. }
  515. if ($request->files->get("fotoPerfil")){
  516. $usuario->setImageFile($request->files->get("fotoPerfil"));
  517. }
  518. $this->entityManager->persist($usuario);
  519. $this->entityManager->flush($usuario);
  520. if ($usuario->getImageFile()) $usuario->setImageFile(null);
  521. $ficha = new FichaEstudiantil();
  522. $ficha->setEstudiante($estudiante);
  523. $ficha->setNombreCompletoPapa($request->request->get("nombre_completo_papa"));
  524. $ficha->setNombreCompletoMama($request->request->get("nombre_completo_mama"));
  525. $ficha->setEmailPapa($request->request->get("email_papa"));
  526. $ficha->setEmailMama($request->request->get("email_mama"));
  527. $ficha->setDireccionPapa($request->request->get("direccion_papa"));
  528. $ficha->setDireccionMama($request->request->get("direccion_mama"));
  529. $ficha->setTelefonoPapa($request->request->get("telefono_papa_1"));
  530. $ficha->setTelefonoMama($request->request->get("telefono_mama_1"));
  531. $ficha->setHobbies($request->request->get("estudiante_hobbies"));
  532. $this->entityManager->persist($ficha);
  533. $contactos = [];
  534. $contacto = [];
  535. for ($i = 0; $i < count($keys); $i++){
  536. $key = $keys[$i];
  537. if ($key !== "nombre_completo_papa"
  538. && $key !== "nombre_completo_mama"
  539. && $key !== "email_papa"
  540. && $key !== "email_mama"
  541. && $key !== "direccion_papa"
  542. && $key !== "direccion_mama"
  543. && $key !== "telefono_papa_1"
  544. && $key !== "telefono_mama_1"
  545. && $key !== "total_contacto"
  546. && $key !== "nombre_alumno"
  547. && $key !== "nombres_usuario"
  548. && $key !== "apellidos_usuario"
  549. ){
  550. $keyValue = trim(explode("_", $key)[0]);
  551. $indexValue = trim(explode("_", $key)[1]);
  552. $contacto[$keyValue."_".$indexValue] = $request->request->get($key);
  553. $contactos = $contacto;
  554. }
  555. }
  556. for ($k = 1; $k <= $request->request->getInt("total_contacto"); $k++){
  557. $contactoEntity = new OtrosContactosEmergencia();
  558. for ($j = 0; $j < count(array_keys($contactos)); $j++){
  559. $numContacto = explode("_", array_keys($contactos)[$j])[1];
  560. if (intval($numContacto) === $k){
  561. $contactoEntity->setNombre($contactos["nombreCompletoContacto_".$numContacto]);
  562. $contactoEntity->setEmail($contactos["emailContacto_".$numContacto]);
  563. $contactoEntity->setParentesco($contactos["parentescoContacto_".$numContacto]);
  564. $contactoEntity->setTelefono($contactos["telefonoContacto_".$numContacto]);
  565. $this->entityManager->persist($contactoEntity);
  566. }
  567. }
  568. $ficha->addOtrosContactosEmergencia($contactoEntity);
  569. }
  570. $this->entityManager->flush();
  571. return $this->redirectToRoute('app_perfil_estudiante');
  572. }
  573. return $this->render('ficha_estudiante/estudiante/ficha_estudiantil.html.twig', ["categorias"=>$categorias]);
  574. }
  575. use TargetPathTrait;
  576. #[Route('/perfil/configuracion', name: 'app_configuracion_cuenta')]
  577. function configuracionCuenta(Request $request, UserPasswordHasherInterface $userPasswordEncoder, visa_cybersource $visa_cybersource, CountryRepository $countryRepository, UserRepository $userRepository) {
  578. if ($this->getUser() === null) return $this->redirectToRoute('app_logout');
  579. $currentYear = intval(date("Y"));
  580. if ($request->getMethod() === 'POST' && $this->isCsrfTokenValid('csrf_seguridad', $request->request->get('_csrf_token'))) {
  581. /** @var User $user */
  582. $user = $this->getUser();
  583. $resultado = SecurityApiController::actualizarConfiguracionCuenta($request, $user, $userPasswordEncoder, $this->entityManager, $this->translator, $countryRepository, $userRepository);
  584. if ($resultado['correcto'] !== true) return $this->render('security/configuracion_cuenta.html.twig', [
  585. 'currentYear' => $currentYear,
  586. 'error' => $resultado['mensaje'] ?? null,
  587. 'errorPassword' => $resultado['mensajePassword'] ?? null,
  588. 'strFingerprint_ORG_ID' => $this->getParameter('VC_FINGERPRINT_ORG_ID'),
  589. 'strMerchantID' => $this->getParameter('VC_MERCHANT_ID'),
  590. 'strFingerPrintUnique' => md5(session_id()),
  591. 'paises' => $countryRepository->findAll()
  592. ]);
  593. return $this->redirectToRoute('app_perfil');
  594. }
  595. return $this->render('security/configuracion_cuenta.html.twig', [
  596. 'currentYear' => $currentYear,
  597. 'strFingerprint_ORG_ID' => $this->getParameter('VC_FINGERPRINT_ORG_ID'),
  598. 'strMerchantID' => $this->getParameter('VC_MERCHANT_ID'),
  599. 'strFingerPrintUnique' => md5(session_id()),
  600. 'paises' => $countryRepository->findAll()
  601. ]);
  602. }
  603. #[Route('/agenda', name: 'app_agenda_usuario')]
  604. #[IsGranted('ROLE_USER')]
  605. public function agendaDeUsuario(Request $request):Response{
  606. $error = null;
  607. /** @var User $user */
  608. $user = $this->getUser();
  609. if ($request->isMethod('POST')){
  610. $recordatorioCalendario = new RecordatorioCalendario();
  611. $data = $request->request->all();
  612. foreach ($data as $datum) {
  613. if ($datum === '' || $datum === null){
  614. return $this->render('security/agenda_de_usuario.html.twig', ['error'=>$this->translator->trans('todos_los_campos_son_requeridos', [], 'errores')]);
  615. }
  616. }
  617. $recordatorioCalendario->setNombre($data['nombreRecordatorio']);
  618. $recordatorioCalendario->setFecha(new \DateTime($data['fechaRecordatorio']));
  619. $recordatorioCalendario->setHoraInicio(new \DateTime($data['horaInicioRecordatorio']));
  620. $recordatorioCalendario->setHoraFin(new \DateTime($data['horaFinRecordatorio']));
  621. $recordatorioCalendario->setColor($this->colorRepository->findOneBy(['nombre'=>$data['colorRecordatorio']]));
  622. $recordatorioCalendario->setCalendario($user->getCalendario());
  623. $recordatorioCalendario->setEstado(1);
  624. $this->entityManager->persist($recordatorioCalendario);
  625. $this->entityManager->flush();
  626. return $this->render('security/agenda_de_usuario.html.twig', ['error'=>$error]);
  627. }
  628. else {
  629. return $this->render('security/agenda_de_usuario.html.twig', ['error'=>$error]);
  630. }
  631. }
  632. #[Route('/notificaciones', name: 'app_notificaciones')]
  633. #[IsGranted('ROLE_USER')]
  634. public function notificaciones(NotificacionRepository $notificacionRepository, Request $request) {
  635. $idUsuario = $this->getUser()->getId();
  636. if ($request->isMethod('POST')) {
  637. $notificacion = $notificacionRepository->findOneBy(['id' => $request->request->get('idNotificacion')]);
  638. $curso = $notificacion->getCurso();
  639. //Redireccionar para ver lo relacionado con la notificacion dependiendo el tipo
  640. if ($notificacion->getCurso()) {
  641. switch ($notificacion->getTipo()) {
  642. case 'nuevoMensaje':
  643. case 'nuevaConversacion':
  644. case 'nuevoGrupo':
  645. return $this->redirectToRoute('app_maestro_curso_chat', ['id' => $curso->getId()]);
  646. case 'nuevaInvitacion':
  647. return $this->redirectToRoute('app_estudiante_invitaciones');
  648. case 'nuevaSolicitudAsignacion':
  649. return $this->redirectToRoute('app_asistencia_maestro_solicitudes_asignacion', ['id' => $curso->getId()]);
  650. case 'nuevoLogro':
  651. return $this->redirectToRoute('app_estudiante_mis_avances', ['id' => $curso->getId(), 'nombre' => $curso->getNombre()]);
  652. case 'nuevaRetroalimentacion':
  653. return $this->redirectToRoute('app_estudiante_retroalimentacion_estudiante', ['id' => $curso->getId(), 'nombre' => $curso->getNombre(), 'idClase' => $notificacion->getAtributos()['idClase']]);
  654. case 'nuevoAnuncio':
  655. if ($notificacion->getAtributos()) {
  656. if (in_array($this->getUser()->getId(), $notificacion['idsMaestros']))
  657. return $this->redirectToRoute('app_maestro_curso_inicio', ['id' => $curso->getId()]);
  658. }
  659. return $this->redirectToRoute('app_estudiante_curso_inicio', ['id' => $curso->getId(), 'nombre' => $curso->getNombre()]);
  660. case 'solicitudAceptada':
  661. return $this->redirectToRoute('app_estudiante_curso_inicio', ['id' => $curso->getId(), 'nombre' => $curso->getNombre()]);
  662. case 'invitacionAceptada':
  663. return $this->redirectToRoute('app_asistencia_maestro_lista_alumnos', ['id' => $curso->getId()]);
  664. case 'cursoArchivado':
  665. if ($notificacion->getAtributos()) {
  666. if (in_array($this->getUser()->getId(), $notificacion['idsMaestros'])) {
  667. if ($curso->getPrivado())
  668. return $this->redirectToRoute('app_maestro_cursos_privados_archivados');
  669. else
  670. return $this->redirectToRoute('app_maestro_cursos_abiertos_archivados');
  671. }
  672. }
  673. if ($curso->getPrivado())
  674. return $this->redirectToRoute('app_estudiante_cursos_privados_archivados');
  675. else
  676. return $this->redirectToRoute('app_estudiante_cursos_abiertos_archivados');
  677. }
  678. }
  679. else {
  680. switch ($notificacion->getTipo()) {
  681. case 'nuevoMensaje':
  682. case 'solicitudConversacionAceptada':
  683. case 'nuevaConversacion':
  684. return $this->redirectToRoute('app_mensajes');
  685. case 'nuevaSolicitudConversacion':
  686. return $this->redirectToRoute('app_solicitudes_conversacion');
  687. case 'nuevoSeguidor':
  688. return $this->redirectToRoute('app_seguidores');
  689. }
  690. }
  691. }
  692. return $this->render('security/notificaciones.html.twig');
  693. }
  694. #[Route('/mensajes', name: 'app_mensajes')]
  695. #[IsGranted('ROLE_ADMIN')]
  696. function mensajes() {
  697. $username = $this->getUser()->getUsername();
  698. $token = (new Builder())
  699. ->withClaim('mercure', ['subscribe' => [sprintf("/%s", $username)]])
  700. ->getToken(
  701. new Sha256(),
  702. new Key($this->getParameter('mercure_secret_key'))
  703. );
  704. $response = $this->render('security/mensajes/mensajes.html.twig');
  705. $response->headers->setCookie(
  706. new Cookie(
  707. 'mercureAuthorization',
  708. $token,
  709. (new \DateTime())
  710. ->add(new \DateInterval('PT2H')),
  711. '/.well-known/mercure',
  712. null,
  713. false,
  714. true,
  715. false,
  716. 'strict'
  717. )
  718. );
  719. return $response;
  720. }
  721. #[Route('/seguidores', name: 'app_seguidores')]
  722. #[IsGranted('ROLE_USER')]
  723. function seguidores(SeguidorRepository $seguidorRepository, Request $request, PaginatorInterface $paginator) {
  724. /** @var User $usuarioActual */
  725. $usuarioActual = $this->getUser();
  726. $resultado = SecurityApiController::obtenerSeguidores($request, $usuarioActual, $seguidorRepository, $paginator);
  727. return $this->render('security/seguidores.html.twig', $resultado);
  728. }
  729. #[Route('/seguidos', name: 'app_seguidos')]
  730. #[IsGranted('ROLE_USER')]
  731. function seguidos(SeguidorRepository $seguidorRepository, Request $request, PaginatorInterface $paginator) {
  732. /** @var User $usuarioActual */
  733. $usuarioActual = $this->getUser();
  734. $resultado = SecurityApiController::obtenerSeguidos($request, $usuarioActual, $seguidorRepository, $paginator);
  735. return $this->render('security/seguidos.html.twig', $resultado);
  736. }
  737. #[Route('/suscripciones-activas', name: 'app_suscripciones_activas')]
  738. function suscripcionesActivas(visa_cybersource $visa_cybersource) {
  739. if (!$this->isGranted('IS_AUTHENTICATED_FULLY')) return $this->redirectToRoute('app_logout');
  740. /** @var User $usuario */
  741. $usuario = $this->getUser();
  742. $resultado = SecurityApiController::obtenerSuscripcionesActivas($usuario);
  743. $resultado = array_merge($resultado, [
  744. 'reCaptchaSiteKey' => $this->getParameter('RECAPTCHA3_SITEKEY'),
  745. 'strFingerprint_ORG_ID' => $this->getParameter('VC_FINGERPRINT_ORG_ID'),
  746. 'strMerchantID' => $this->getParameter('VC_MERCHANT_ID'),
  747. 'strFingerPrintUnique' => md5(session_id())
  748. ]);
  749. return $this->render('security/suscripciones_activas.html.twig', $resultado);
  750. }
  751. #[Route('/terminos/privacidad', name: 'app_politicas_de_privacidad')]
  752. function politicasDePrivacidad(){
  753. return $this->render('security/politicas_de_privacidad.html.twig');
  754. }
  755. public static function bloquearUsuario(User $bloqueador, User $bloqueado, Request $request, EntityManagerInterface $entityManager) {
  756. $bloqueo = new Bloqueos();
  757. $bloqueo->setBloqueador($bloqueador);
  758. $bloqueo->setBloqueado($bloqueado);
  759. $entityManager->persist($bloqueo);
  760. $entityManager->flush();
  761. }
  762. /**
  763. * @param string $key
  764. * @return bool
  765. */
  766. function checkBoxKey(string $key) {
  767. if (explode('_', $key )[0] === 'check') {
  768. return true;
  769. }
  770. else {
  771. return false;
  772. }
  773. }
  774. /**
  775. * @param string $key
  776. * @return mixed|string
  777. */
  778. function getNombreCategoriaEnCheckBoxes(string $key) {
  779. return explode('_', $key)[1];
  780. }
  781. }