PartyController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Requirement\Requirement;
  7. use Symfony\Component\Routing\Attribute\Route;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use App\Entity\Slot;
  10. use App\Entity\Party;
  11. use App\Entity\Gamemaster;
  12. use App\Entity\Game;
  13. use App\Entity\Event;
  14. use App\Repository\SlotRepository;
  15. use App\Repository\GamemasterRepository;
  16. use App\Repository\GameRepository;
  17. use App\Form\PartyType;
  18. use App\Security\Voter\EventAccessVoter;
  19. final class PartyController extends AbstractController
  20. {
  21. // supprimer une partie
  22. #[Route('/party/delete/{id}', name: 'app_party_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  23. public function delete(?Party $party, Request $request, EntityManagerInterface $manager, SlotRepository $slotRepository): Response
  24. {
  25. // Seuls admin (ADMIN)
  26. $user = $this->getUser();
  27. $roles = $user->getRoles();
  28. if (in_array('ROLE_ADMIN', $roles)) {
  29. if ($party) {
  30. $party->purgeSlots();
  31. $manager->remove($party);
  32. $manager->flush($party);
  33. $this->addFlash('success', 'Partie supprimée !');
  34. } else {
  35. $this->addFlash('danger', 'Partie inexistante');
  36. }
  37. } else {
  38. $this->addFlash('danger', 'Seuls les admins peuvent supprimer une partie.');
  39. }
  40. $referer = $request->headers->get('referer');
  41. return $this->redirect($referer);
  42. }
  43. // valider une partie proposée par un MJ
  44. #[Route('/party/validate/{id}', name: 'app_party_validate', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  45. public function validate(?Party $party, Request $request, EntityManagerInterface $manager, SlotRepository $slotRepository): Response
  46. {
  47. // Seuls gestionnaires (MANAGER), admin (ADMIN)
  48. $user = $this->getUser();
  49. $roles = $user->getRoles();
  50. if (in_array('ROLE_ADMIN', $roles) || in_array('ROLE_MANAGER', $roles)) {
  51. if ($party) {
  52. $party->setValidated(true);
  53. $manager->persist($party);
  54. $manager->flush($party);
  55. $this->addFlash('success', 'Partie validée !');
  56. } else {
  57. $this->addFlash('danger', 'Partie inexistante');
  58. }
  59. } else {
  60. $this->addFlash('danger', 'Seuls les rôles Gestionnaires et Admin peuvent valider une partie');
  61. }
  62. $referer = $request->headers->get('referer');
  63. return $this->redirect($referer);
  64. }
  65. // modifier une partie
  66. #[Route('/party/modify/{id}', name: 'app_party_modify', requirements: ['id' => '\d+'], methods: ['GET','POST'])]
  67. public function modify(?Slot $slot, Request $request, SlotRepository $slotRepository, GamemasterRepository $gamemasterRepository, GameRepository $gameRepository, EntityManagerInterface $manager): Response
  68. {
  69. // Seuls gestionnaires (MANAGER), admin (ADMIN) ou un MJ de l'asso (STAFF) qui est associé à l'événement
  70. $this->denyAccessUnlessGranted(EventAccessVoter::ACCESS_EVENT, $slot->getEvent());
  71. $user = $this->getUser();
  72. $party = $slot->getParty();
  73. if (!$party) {
  74. $this->addFlash('danger', 'Pas de partie trouvée.');
  75. $referer = $request->headers->get('referer');
  76. return $this->redirect($referer);
  77. }
  78. $roles = $user->getRoles();
  79. // Check MJ
  80. if (in_array('ROLE_STAFF', $roles) && !(in_array('ROLE_ADMIN', $roles) || in_array('ROLE_MANAGER', $roles))) {
  81. // C'est un MJ, est-ce qu'il édite bien l'une de ses parties
  82. $gamemasters[] = $user->getLinkToGamemaster();
  83. if ($party->gamemaster != $gamemasters[0]) {
  84. // Alors dégage !
  85. $this->addFlash('danger', 'Un MJ ne peut éditer que ses parties.');
  86. $referer = $request->headers->get('referer');
  87. return $this->redirect($referer);
  88. }
  89. } else {
  90. $gamemasters = $slot->getEvent()->getGamemastersAssigned();
  91. }
  92. // Création des valeurs dispo pour les formulaire
  93. $games = $slot->getEvent()->getGameAssigned();
  94. $lastSlot = $party->getSlots()->last();
  95. $getSlotsAvailables = $slotRepository->findNextsAvailables($lastSlot);
  96. $slotStart = $slot;
  97. $slotsAvailables = array_merge($party->getSlots()->toArray(), $getSlotsAvailables);
  98. $form = $this->createForm(PartyType::class, $party);
  99. $form->handleRequest($request);
  100. if ($form->isSubmitted() && $form->isValid()) {
  101. // Ajouter les slots séléctionnés
  102. $slotsString = $request->request->get('party_slots');
  103. $gamemasterSelectedId = $request->request->get('party_gamemaster');
  104. $gamemasterSelected = $gamemasterRepository->findByStrID($gamemasterSelectedId);
  105. $gameSelectedId = $request->request->get('party_game');
  106. $gameSelected = $gameRepository->findByStrID($gameSelectedId);
  107. if ($gameSelected && $gamemasterSelected) {
  108. $party->purgeSlots();
  109. $new_slots = explode("|", $slotsString);
  110. foreach($new_slots as $add_this_slot) {
  111. $add_this_slot_obj = $slotRepository->findById($add_this_slot);
  112. $party->addSlot($add_this_slot_obj);
  113. }
  114. $slots = $party->getSlots();
  115. $party->setStartOn(clone $slots->first()->getStartOn());
  116. $party->setEndOn(clone $slots->last()->getEndOn());
  117. $party->setGamemaster($gamemasterSelected);
  118. $party->setGame($gameSelected);
  119. // Si gamemaster = author, alors !
  120. if (in_array($party->getGame(), $party->getGamemaster()->getAuthorOfGames()->toArray())) {
  121. $party->setGamemasterIsAuthor(true);
  122. } else {
  123. $party->setGamemasterIsAuthor(false);
  124. }
  125. $manager->persist($party);
  126. $manager->flush();
  127. // TODO: si c'est une partie non validée, envoyer un mail aux admin+gestionnaires pour validation
  128. $this->addFlash('success', 'Partie modifiée.');
  129. } else {
  130. $this->addFlash('danger', 'Pas de MJ ou de jeu sélectionné.');
  131. }
  132. $referer = $request->headers->get('referer');
  133. return $this->redirect($referer);
  134. }
  135. return $this->render('party/_modal.edit.html.twig', [
  136. 'form' => $form,
  137. 'party' => $party,
  138. 'gamemasters' => $gamemasters,
  139. 'games' => $games,
  140. 'slotStart' => $slotStart,
  141. 'slotsAvailables' => $slotsAvailables,
  142. 'mod' => true,
  143. 'pathController' => 'app_party_modify'
  144. ]);
  145. }
  146. // ajouter une partie
  147. #[Route('/party/add/{id}', name: 'app_party_add', requirements: ['id' => '\d+'], methods: ['GET','POST'])]
  148. public function add(?Slot $slot, Request $request, SlotRepository $slotRepository, GamemasterRepository $gamemasterRepository, GameRepository $gameRepository, EntityManagerInterface $manager): Response
  149. {
  150. // Seuls gestionnaires (MANAGER), admin (ADMIN) ou un MJ de l'asso (STAFF) qui est associé à l'événement
  151. $this->denyAccessUnlessGranted(EventAccessVoter::ACCESS_EVENT, $slot->getEvent());
  152. $user = $this->getUser();
  153. // Création de l'objet minimaliste
  154. $party = new Party();
  155. $party->setEvent($slot->getEvent());
  156. $party->setSubmitter($user);
  157. $party->setSubmittedDate(new \Datetime('now'));
  158. $party->setMinParticipants($_ENV['APP_DEFAULT_MIN_PARTICIPANTS']);
  159. $party->setMaxParticipants($_ENV['APP_DEFAULT_MAX_PARTICIPANTS']);
  160. $roles = $user->getRoles();
  161. if (in_array('ROLE_ADMIN', $roles) || in_array('ROLE_MANAGER', $roles)) {
  162. $party->setValidated(true);
  163. $gamemasters = $slot->getEvent()->getGamemastersAssigned();
  164. } else {
  165. // Note, le rôle admin et/ou manager prend le pas sur le rôle Staff/MJ
  166. $party->setValidated(false);
  167. $gamemasters = array();
  168. $gamemasters[] = $user->getLinkToGamemaster();
  169. }
  170. // Création des valeurs dispo pour les formulaire
  171. $games = $slot->getEvent()->getGameAssigned();
  172. $getSlotsAvailables = $slotRepository->findNextsAvailables($slot);
  173. $slotStart = $slot;
  174. $slotsAvailables = array_merge([$slotStart], $getSlotsAvailables);
  175. $form = $this->createForm(PartyType::class, $party);
  176. $form->handleRequest($request);
  177. if ($form->isSubmitted() && $form->isValid()) {
  178. // Ajouter les slots séléctionnés
  179. $slotsString = $request->request->get('party_slots');
  180. $gamemasterSelectedId = $request->request->get('party_gamemaster');
  181. $gamemasterSelected = $gamemasterRepository->findByStrID($gamemasterSelectedId);
  182. $gameSelectedId = $request->request->get('party_game');
  183. $gameSelected = $gameRepository->findByStrID($gameSelectedId);
  184. if ($gameSelected && $gamemasterSelected) {
  185. $new_slots = explode("|", $slotsString);
  186. foreach($new_slots as $add_this_slot) {
  187. $add_this_slot_obj = $slotRepository->findById($add_this_slot);
  188. $party->addSlot($add_this_slot_obj);
  189. }
  190. $party->setStartOn(clone $party->getSlots()[0]->getStartOn());
  191. $party->setEndOn(clone $party->getSlots()->last()->getEndOn());
  192. $party->setGamemaster($gamemasterSelected);
  193. $party->setGame($gameSelected);
  194. // Si gamemaster = author, alors !
  195. if (in_array($party->getGame(), $party->getGamemaster()->getAuthorOfGames()->toArray())) {
  196. $party->setGamemasterIsAuthor(true);
  197. } else {
  198. $party->setGamemasterIsAuthor(false);
  199. }
  200. $manager->persist($party);
  201. $manager->flush();
  202. // TODO: si c'est une partie non validée, envoyer un mail aux admin+gestionnaires pour validation
  203. $this->addFlash('success', 'Partie ajoutée au planning.');
  204. } else {
  205. $this->addFlash('danger', 'Pas de MJ ou de jeu sélectionné.');
  206. }
  207. $referer = $request->headers->get('referer');
  208. return $this->redirect($referer);
  209. }
  210. return $this->render('party/_modal.edit.html.twig', [
  211. 'form' => $form,
  212. 'party' => $party,
  213. 'gamemasters' => $gamemasters,
  214. 'games' => $games,
  215. 'slotStart' => $slotStart,
  216. 'slotsAvailables' => $slotsAvailables,
  217. 'mod' => false,
  218. 'pathController' => 'app_party_add'
  219. ]);
  220. }
  221. }