MainController.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Requirement\Requirement;
  6. use Symfony\Component\Routing\Attribute\Route;
  7. use App\Repository\EventRepository;
  8. use App\Entity\Event;
  9. use App\Entity\Gamemaster;
  10. use App\Entity\Game;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. final class MainController extends AbstractController
  13. {
  14. #[Route('/', name: 'app_main')]
  15. public function index(EventRepository $repository): Response
  16. {
  17. // Est-ce qu'un utilisateur est connecté et qu'il est au moins "staff" ?
  18. $user = $this->getUser();
  19. $onlyPublicAccess = true;
  20. if ($user) {
  21. $roles = $user->getRoles();
  22. if (in_array('ROLE_STAFF', $roles) || in_array('ROLE_MANAGER', $roles) || in_array('ROLE_ADMIN', $roles)) {
  23. $onlyPublicAccess = false;
  24. }
  25. }
  26. // Récupérer la liste des événements visibles
  27. $events = $repository->findEventsToCome($onlyPublicAccess);
  28. return $this->render('main/index.html.twig', [
  29. 'events' => $events,
  30. ]);
  31. }
  32. #[Route('/booking', name: 'app_main_booking_main')]
  33. public function bookingMain(EventRepository $repository): Response
  34. {
  35. // Est-ce qu'un utilisateur est connecté et qu'il est au moins "staff" ?
  36. $user = $this->getUser();
  37. $onlyPublicAccess = true;
  38. if ($user) {
  39. $roles = $user->getRoles();
  40. if (in_array('ROLE_STAFF', $roles) || in_array('ROLE_MANAGER', $roles) || in_array('ROLE_ADMIN', $roles)) {
  41. $onlyPublicAccess = false;
  42. }
  43. }
  44. // Récupérer la liste des événements visibles
  45. $events = $repository->findEventsToCome($onlyPublicAccess);
  46. if (!$events) {
  47. $this->addFlash('info', 'Aucun d\'événement n\'est plannifié pour le moment.');
  48. return $this->redirectToRoute('app_main');
  49. }
  50. $event = $events[0];
  51. return $this->redirectToRoute('app_main_booking', ['id' => $event->getId(), 'view' => 'pictures']);
  52. }
  53. #[Route('/booking/{id}/{view}', name: 'app_main_booking', requirements: ['id' => Requirement::UUID_V7, 'view' => '.*'], methods: ['GET', 'POST'])]
  54. public function booking(?Event $event, EventRepository $repository, string $view): Response
  55. {
  56. // Contrôler qu'un événement est bien ok
  57. if (!$event) {
  58. $this->addFlash('danger', 'Événement inconnu !');
  59. $this->redirectToRoute('app_main_booking_main');
  60. }
  61. // Est-ce qu'un utilisateur est connecté et qu'il est au moins "staff" ?
  62. $user = $this->getUser();
  63. $onlyPublicAccess = true;
  64. if ($user) {
  65. $roles = $user->getRoles();
  66. if (in_array('ROLE_STAFF', $roles) || in_array('ROLE_MANAGER', $roles) || in_array('ROLE_ADMIN', $roles)) {
  67. $onlyPublicAccess = false;
  68. }
  69. }
  70. // Est-ce qu'une vue est invoquée dans l'URL ? et est-ce une option valide ?
  71. if (!$view || !in_array($view, ['info', 'planning', 'pictures'])) {
  72. $view = 'pictures';
  73. }
  74. // Si le planning n'est pas affiché, planning et pictures -> info
  75. //if ($event.isHiddenPlanning()
  76. // Récupérer la liste des événements visibles
  77. $events = $repository->findEventsToCome($onlyPublicAccess);
  78. return $this->render('main/booking.'.$view.'.html.twig', [
  79. 'event' => $event,
  80. 'events' => $events
  81. ]);
  82. }
  83. #[Route('/charte-animations', name: 'app_code_of_conduct')]
  84. public function codeOfConduct(): Response
  85. {
  86. // Lire le contenu de la charte des animations depuis un fichier
  87. $codeContent = file_get_contents(__DIR__ . '/../../public/pages/code.md');
  88. return $this->render('main/markdown.html.twig', [
  89. 'codeContent' => $codeContent,
  90. ]);
  91. }
  92. #[Route('/cgu', name: 'app_terms')]
  93. public function terms(): Response
  94. {
  95. // Lire le contenu de la charte des animations depuis un fichier
  96. $codeContent = file_get_contents(__DIR__ . '/../../public/pages/terms.md');
  97. return $this->render('main/markdown.html.twig', [
  98. 'codeContent' => $codeContent,
  99. ]);
  100. }
  101. #[Route('/legal', name: 'app_legal')]
  102. public function legal(): Response
  103. {
  104. // Lire le contenu de la charte des animations depuis un fichier
  105. $codeContent = file_get_contents(__DIR__ . '/../../public/pages/legal.md');
  106. return $this->render('main/markdown.html.twig', [
  107. 'codeContent' => $codeContent,
  108. ]);
  109. }
  110. #[Route('/contact', name: 'app_contact')]
  111. public function contact(): Response
  112. {
  113. // TODO: formulaire de contact avec envoi d'un mail
  114. // Lire le contenu de la charte des animations depuis un fichier
  115. $codeContent = file_get_contents(__DIR__ . '/../../public/pages/legal.md');
  116. return $this->render('main/markdown.html.twig', [
  117. 'codeContent' => $codeContent,
  118. ]);
  119. }
  120. #[Route('/gamemaster/{id}', name: 'app_gamemaster_public_profile', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  121. public function gamemasterPublicProfile(?Gamemaster $gamemaster): Response
  122. {
  123. if ($gamemaster) {
  124. return $this->render('main/_modal.gamemaster.html.twig', [
  125. 'gamemaster' => $gamemaster,
  126. ]);
  127. } else {
  128. $this->addFlash('danger', 'Meneur(euse) de jeu inconnu(e).');
  129. return $this->redirectToRoute('app_main');
  130. }
  131. }
  132. #[Route('/game/{id}', name: 'app_game_public', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  133. public function gamePublic(?Game $game): Response
  134. {
  135. if ($game) {
  136. return $this->render('main/_modal.game.html.twig', [
  137. 'game' => $game,
  138. ]);
  139. } else {
  140. $this->addFlash('danger', 'Jeu inconnu.');
  141. return $this->redirectToRoute('app_main');
  142. }
  143. }
  144. // Gestion de la newsletter et des pièces jointes
  145. // ORGASSO permet uniquement de générer un template de newsletter, il ne gère pas l'envoi de celle-ci pour l'instant
  146. // Génération de la newsletter /newsletter/(annee)/(mois)
  147. #[Route('/newsletter/{year}/{month}', name: 'app_newsletter', requirements: ['year' => '\d{4}', 'month' => '0[1-9]|1[0-2]'], methods: ['GET'])]
  148. public function newsletter(EventRepository $repository, int $year, int $month): Response
  149. {
  150. // Lister tous les événements du mois et de l'année
  151. $events = $repository->findEventsOfMonth($month, $year, true);
  152. // Générer et retourner la newsletter
  153. return $this->render('main/mailing/simple.template.html.twig', ['events' => $events]);
  154. }
  155. // Génération de la newsletter d'un événement /newsletter/detail/(uuid)
  156. #[Route('/newsletter/detail/{id}', name: 'app_newsletter_detail', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  157. public function newsletterDetail(?Event $event, EventRepository $repository): Response
  158. {
  159. // Contrôle qu'un événement est bien transmis
  160. if (!$event) {
  161. $this->addFlash('danger', 'Événement inconnu !');
  162. $this->redirectToRoute('app_main_booking_main');
  163. }
  164. return $this->render('main/malling/detail.template.html.twig', ['event' => $event]);
  165. }
  166. // Génération des ICS pour la newsletter et l'affiche des événements
  167. #[Route('/ics/{id}.ics', name: 'app_main_ics', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  168. public function ics(?Event $event, EventRepository $repository): Response
  169. {
  170. // Contrôler qu'un événement est bien ok
  171. if (!$event) {
  172. $this->addFlash('danger', 'Événement inconnu !');
  173. $this->redirectToRoute('app_main_booking_main');
  174. }
  175. return $this->render('main/event.ics.twig', ['event' => $event]);
  176. }
  177. }