src/Controller/Front/HomeController.php line 56

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Entity\ApiUser;
  4. use App\Entity\User;
  5. use App\Entity\Visitor;
  6. use App\Form\UserType;
  7. use App\Form\VisitorDetailType;
  8. use App\Form\VisitorEmailType;
  9. use App\Form\VisitorRegistrationType;
  10. use App\Form\VisitorType;
  11. use App\Repository\ApiUserRepository;
  12. use App\Repository\DirectorRepository;
  13. use App\Repository\ModuleNoticeRepository;
  14. use App\Repository\ModuleRepository;
  15. use App\Repository\QuoteRepository;
  16. use App\Repository\UserRepository;
  17. use App\Utils\Constants;
  18. use Doctrine\Persistence\ManagerRegistry;
  19. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  20. use Symfony\Component\HttpFoundation\JsonResponse;
  21. use Symfony\Component\HttpFoundation\Request;
  22. use Symfony\Component\HttpFoundation\Response;
  23. use Symfony\Component\HttpFoundation\Session\Session;
  24. use Symfony\Component\Notifier\NotifierInterface;
  25. use Symfony\Component\Notifier\Recipient\Recipient;
  26. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Security\Http\LoginLink\LoginLinkHandlerInterface;
  29. use Symfony\Component\Security\Http\LoginLink\LoginLinkNotification;
  30. use App\Controller\API\V1\Game\WordSearchController;
  31. use App\Repository\Game\WordSearch\GridRepository;
  32. use JMS\Serializer\SerializerInterface;
  33. use App\Entity\Game\WordSearch\Grid;
  34. use App\Entity\Game\WordSearch\Word;
  35. use App\Helper\ControllerHelper;
  36. use App\Repository\CourseRepository;
  37. use App\Repository\Game\WordSearch\WordRepository;
  38. use App\Repository\LiveRepository;
  39. class HomeController extends AbstractController
  40. {
  41. use ControllerHelper;
  42. private WordSearchController $wordSearchController;
  43. public function __construct(WordSearchController $wordSearchController)
  44. {
  45. $this->wordSearchController = $wordSearchController;
  46. }
  47. /**
  48. * @Route("", name="app_front_homepage")
  49. */
  50. public function index(QuoteRepository $quoteRepository, DirectorRepository $directorRepository, ModuleRepository $moduleRepository, ModuleNoticeRepository $moduleNoticeRepository, CourseRepository $courseRepository, UserRepository $userRepository, LiveRepository $liveRepository): Response
  51. {
  52. // return $this->redirectToRoute("app_front_library_page");
  53. $session = new Session();
  54. if (!$session->has('visitor-email') && $this->getUser() === null) {
  55. return $this->redirectToRoute("app_login");
  56. }
  57. $quote = $quoteRepository->findActiveQuote();
  58. $director = $directorRepository->findActiveDirector();
  59. $modules = $moduleRepository->findPublishedModules();
  60. $notices = $moduleNoticeRepository->findBy(['module' => null, 'isPublished' => true]);
  61. $courseCount = $courseRepository->getTotalCourse();
  62. $learnerCount = $userRepository->getLearnersCount(null, null);
  63. $topLive = $liveRepository->getTopActiveLive("live");
  64. $topLiveHasModule = ($topLive != null) ? $this->getActiveModule($topLive) : null;
  65. return $this->render('front/index.html.twig', [
  66. 'quote' => $quote,
  67. 'director' => $director,
  68. 'modules' => $modules,
  69. 'notices' => $notices,
  70. 'courseCount' => $courseCount,
  71. 'learnerCount' => $learnerCount,
  72. 'topLive' => ($topLiveHasModule != null) ? $topLive : null
  73. ]);
  74. }
  75. /**
  76. * @Route("/visiteur", name="app_front_visitor_registration_page")
  77. */
  78. public function visitorRegistrationPage(NotifierInterface $notifier, LoginLinkHandlerInterface $loginLinkHandler, UserRepository $userRepository, Request $request, ManagerRegistry $doctrine, UserPasswordHasherInterface $passwordHasher): Response
  79. {
  80. $entityManager = $doctrine->getManager();
  81. $visitor = new User();
  82. $form = $this->createForm(VisitorRegistrationType::class, $visitor);
  83. $form->handleRequest($request);
  84. // if ($form->isSubmitted() && $form->isValid()) {
  85. if ($request->isXmlHttpRequest()) {
  86. // $session = new Session();
  87. // $session->set('visitor-email', $form->get('email')->getData());
  88. // $email = $form->get('email')->getData();
  89. // $user = $userRepository->findOneBy(['email' => $email]);
  90. $email = $request->request->get('email');
  91. $user = $userRepository->findOneBy(['email' => $email]);
  92. if ($user === null) {
  93. // $session = new Session();
  94. // $session->set('visitor-email', $form->get('email')->getData());
  95. $visitor->setRoles(['ROLE_VISITOR']);
  96. $hashedPassword = $passwordHasher->hashPassword(
  97. $visitor,
  98. Constants::VISITOR_DEFAULT_PASSWORD_PREFIX."_".$email
  99. );
  100. $visitor->setPassword($hashedPassword);
  101. $userRepository->add($visitor, true);
  102. // $entityManager->persist($visitor);
  103. // $entityManager->flush();
  104. // create a login link for $user this returns an instance
  105. // of LoginLinkDetails
  106. $loginLinkDetails = $loginLinkHandler->createLoginLink($visitor);
  107. //$loginLink = $loginLinkDetails->getUrl();
  108. // create a notification based on the login link details
  109. $notification = new LoginLinkNotification(
  110. $loginLinkDetails,
  111. 'Bienvenue sur le site de Cofina Academy !' // email subject
  112. );
  113. // create a recipient for this user
  114. $recipient = new Recipient($visitor->getEmail());
  115. try {
  116. // send the notification to the user
  117. $notifier->send($notification, $recipient);
  118. } catch (\Throwable $th) {
  119. //throw $th;
  120. }
  121. // $this->addFlash(
  122. // 'visitor_login_notice',
  123. // 'Un lien de connexion vous a été envoyé à votre adresse'
  124. // );
  125. // return $this->redirectToRoute("app_login");
  126. return new JsonResponse([
  127. 'response' => 'Un lien de connexion vous a été envoyé à votre adresse'
  128. ], Response::HTTP_OK);
  129. }
  130. // create a login link for $user this returns an instance
  131. // of LoginLinkDetails
  132. $loginLinkDetails = $loginLinkHandler->createLoginLink($user);
  133. $loginLink = $loginLinkDetails->getUrl();
  134. // return $this->redirect($loginLink);
  135. return new JsonResponse([
  136. 'login_url' => $loginLink
  137. ], Response::HTTP_OK);
  138. }
  139. return $this->render('front/pages/authentication/visitor_registration_page.html.twig', [
  140. 'form' => $form->createView(),
  141. ]);
  142. }
  143. /**
  144. * @Route("/check-visitor", name="app_front_check_visitor")
  145. */
  146. public function checkEmailVisitor(LoginLinkHandlerInterface $loginLinkHandler, UserRepository $userRepository, Request $request): Response
  147. {
  148. if ($request->isXmlHttpRequest()) {
  149. $email = $request->request->get('email');
  150. $user = $userRepository->findOneBy(['email' => $email]);
  151. if ($user !== null) {
  152. if(in_array('ROLE_VISITOR', $user->getRoles())) {
  153. $loginLinkDetails = $loginLinkHandler->createLoginLink($user);
  154. $loginLink = $loginLinkDetails->getUrl();
  155. if($user->isIsFirstConnexion()) {
  156. return new JsonResponse([
  157. 'login_url' => null
  158. ], Response::HTTP_NO_CONTENT);
  159. }
  160. return new JsonResponse([
  161. 'login_url' => $loginLink
  162. ], Response::HTTP_OK);
  163. } else {
  164. return new JsonResponse([
  165. 'message' => "Ce compte n'est pas un compte visiteur."
  166. ], Response::HTTP_OK);
  167. }
  168. }
  169. }
  170. return new JsonResponse([
  171. 'login_url' => null
  172. ], Response::HTTP_NO_CONTENT);
  173. }
  174. /**
  175. * @Route("/sso-login", name="app_front_sso_login")
  176. */
  177. public function ssoLogin(LoginLinkHandlerInterface $loginLinkHandler, UserRepository $userRepository, Request $request): Response
  178. {
  179. if ($request->isXmlHttpRequest()) {
  180. $email = $request->request->get('email');
  181. $user = $userRepository->findOneBy(['email' => $email]);
  182. if ($user !== null) {
  183. $loginLinkDetails = $loginLinkHandler->createLoginLink($user);
  184. $loginLink = $loginLinkDetails->getUrl();
  185. return new JsonResponse([
  186. 'login_url' => $loginLink
  187. ], Response::HTTP_OK);
  188. }
  189. }
  190. return new JsonResponse([
  191. 'login_url' => null
  192. ], Response::HTTP_NO_CONTENT);
  193. }
  194. /**
  195. * @Route("/visiteur/details", name="app_front_visitor_details_page")
  196. */
  197. public function visitorDetailsPage(Request $request, ManagerRegistry $doctrine): Response
  198. {
  199. $entityManager = $doctrine->getManager();
  200. $visitor = new User();
  201. $form = $this->createForm(VisitorDetailType::class, $visitor);
  202. $form->handleRequest($request);
  203. if ($form->isSubmitted() && $form->isValid()) {
  204. $session = new Session();
  205. if ($session->has('visitor-email')) {
  206. $visitor->setEmail($session->get('visitor-email'));
  207. $visitor->setRoles(['ROLE_VISITOR']);
  208. } else {
  209. return $this->redirectToRoute("app_front_visitor_registration_page");
  210. }
  211. $entityManager->persist($visitor);
  212. $entityManager->flush();
  213. return $this->redirectToRoute("app_front_homepage");
  214. }
  215. return $this->render('front/pages/authentication/visitor_registration_details_page.html.twig', [
  216. 'form' => $form->createView(),
  217. ]);
  218. }
  219. /**
  220. * @Route("/message", name="app_front_message_page")
  221. */
  222. public function messagePage(Request $request): Response
  223. {
  224. return $this->render('front/pages/random_page/message.html.twig');
  225. }
  226. /**
  227. * @Route("/bienvenue", name="app_front_welcome_page")
  228. */
  229. public function welcomePage(Request $request): Response
  230. {
  231. $user = new User();
  232. $form = $this->createForm(UserType::class, $user);
  233. $form->handleRequest($request);
  234. if ($form->isSubmitted() && $form->isValid()) {
  235. return $this->redirectToRoute("app_front_homepage");
  236. }
  237. return $this->render('front/pages/authentication/welcome_page.html.twig', [
  238. 'form' => $form->createView(),
  239. ]);
  240. }
  241. /**
  242. * @Route("/quiz", name="app_front_dashboard_quiz_page")
  243. */
  244. public function quiz(): Response
  245. {
  246. $user = $this->getUser();
  247. return $this->render('front/pages/dashboard/quiz.html.twig', [
  248. 'controller_name' => 'DashboardController',
  249. 'user'=>$user
  250. ]);
  251. }
  252. /**
  253. * @Route("/jeux", name="app_front_game_page")
  254. */
  255. public function game(): Response
  256. {
  257. return $this->render('front/game/index.html.twig', [
  258. 'user' => $this->getUser()
  259. ]);
  260. }
  261. /**
  262. * @Route("/jeux/quiz", name="app_front_game_quiz_time_page", methods={"GET"})
  263. */
  264. public function playQuizTime(Request $request): Response
  265. {
  266. $user = $this->getUser();
  267. $game = [
  268. "question" => "Quand et par qui a été fondé COFINA ?",
  269. "response_1" => "Jean Luc GASSE, 1999",
  270. "response_2" => "Jean PIQUET, 2005",
  271. "response_3" => "Carlos GOSHN, 2001",
  272. "response_4" => "Jean-Luc KONAN, 2003",
  273. "number_of_response" => 1,
  274. "correct_response" => "Carlos GOSHN, 2001"
  275. ];
  276. return $this->render('front/game/quiz-time.html.twig', [
  277. 'controller_name' => 'QuizTimeController',
  278. 'user'=>$user,
  279. 'game' => $game
  280. ]);
  281. }
  282. }