ProfileController.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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 Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  10. use Symfony\Component\String\Slugger\AsciiSlugger;
  11. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  12. use App\Form\UserProfileType;
  13. use App\Form\GamemasterProfileType;
  14. use App\Form\GameProfileType;
  15. use App\Repository\GameRepository;
  16. use App\Entity\User;
  17. use App\Entity\Gamemaster;
  18. use App\Entity\Game;
  19. use App\Service\PictureService;
  20. use App\Entity\Participation;
  21. use App\Repository\ParticipationRepository;
  22. final class ProfileController extends AbstractController
  23. {
  24. #[Route('/profile', name: 'app_profile', methods: ['GET', 'POST'])]
  25. public function index(Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $manager): Response
  26. {
  27. $user = $this->getUser();
  28. $form = $this->createForm(UserProfileType::class, $user);
  29. // Mise à jour de l'utilisateur à partir du formulaire
  30. $form->handleRequest($request);
  31. if ($form->isSubmitted() && $form->isValid()) {
  32. // Si un nouveau mot de passe a été proposé
  33. if ($form->get('newPassword')->getData()) {
  34. // Encoder le mot de passe
  35. $newPassword = $form->get('newPassword')->getData();
  36. $user->setPassword($userPasswordHasher->hashPassword($user, $newPassword));
  37. }
  38. if ($user->getLinkToGamemaster()) {
  39. $user->getLinkToGamemaster()->setPhone($user->getPhone());
  40. $user->getLinkToGamemaster()->setFirstName($user->getFirstName());
  41. $user->getLinkToGamemaster()->setLastName($user->getLastName());
  42. }
  43. // Mettre à jour l'utilisateur
  44. $user->setLastUpdate();
  45. $manager->persist($user);
  46. $manager->flush();
  47. $this->addFlash('success', 'Compte modifié avec succès.');
  48. return $this->redirectToRoute('app_profile');
  49. }
  50. return $this->render('profile/index.html.twig', [
  51. 'form' => $form,
  52. 'user' => $user,
  53. ]);
  54. }
  55. #[Route('/profile/gamemaster', name: 'app_profile_gamemaster', methods: ['GET', 'POST'])]
  56. public function gamemasterProfile(Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $manager, PictureService $pictureService): Response
  57. {
  58. $user = $this->getUser();
  59. $gamemaster = $user->getLinkToGamemaster();
  60. if (!$gamemaster) {
  61. $this->addFlash('error', 'Vous n\'avez pas de profil de meneur(euse) de jeu.');
  62. return $this->redirectToRoute('app_profile');
  63. }
  64. $form = $this->createForm(GamemasterProfileType::class, $gamemaster);
  65. // Mise à jour de l'utilisateur à partir du formulaire
  66. $form->handleRequest($request);
  67. if ($form->isSubmitted() && $form->isValid()) {
  68. if (!$form->get('preferedName')->getData()) {
  69. $gamemaster->setPreferedName($form->get('firstName')->getData() ." ". $form->get('lastName')->getData());
  70. }
  71. $slug = $form->get('slug')->getData();
  72. // Aucun slug n'a été proposé par l'utilisateur
  73. if (!$slug) {
  74. $slugger = new AsciiSlugger('fr_FR');
  75. $slug = $slugger->slug(strtolower($gamemaster->getPreferedName()));
  76. $gamemaster->setSlug($slug);
  77. }
  78. // Traiter l'image proposée
  79. $tmpPicture = $form->get('picture')->getData();
  80. if ($tmpPicture) {
  81. $picture = $pictureService->square($tmpPicture, '/gamemasters/', $slug);
  82. $gamemaster->setPicture($picture);
  83. }
  84. // Mettre à jour l'utilisateur
  85. $manager->persist($gamemaster);
  86. $manager->flush();
  87. $this->addFlash('success', 'Profil MJ modifié avec succès.');
  88. return $this->redirectToRoute('app_profile_gamemaster');
  89. }
  90. return $this->render('profile/gamemaster.html.twig', [
  91. 'form' => $form,
  92. 'gamemaster' => $gamemaster,
  93. ]);
  94. }
  95. /*
  96. * Supprimer l'image du MJ
  97. */
  98. #[Route('/profile/gamemaster/{id}/del-pic', name: 'app_profile_gamemaster_del_pic', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  99. public function deletePicture(?Gamemaster $gamemaster, EntityManagerInterface $manager, ParameterBagInterface $params): Response
  100. {
  101. $user = $this->getUser();
  102. $gamemaster = $user->getLinkToGamemaster();
  103. if (!$gamemaster) {
  104. $this->addFlash('error', 'Vous n\'avez pas de profil de meneur(euse) de jeu.');
  105. return $this->redirectToRoute('app_profile');
  106. }
  107. // Effacer toutes images associée
  108. if ($gamemaster->getPicture()) {
  109. $fullPath = $params->get('upload_images_directory') . '/gamemasters/' . $gamemaster->getPicture();
  110. unlink($fullPath);
  111. }
  112. $gamemaster->setPicture(null);
  113. $manager->flush();
  114. $this->addFlash('success', 'Illustration supprimée avec succès.');
  115. return $this->redirectToRoute('app_profile_gamemaster');
  116. }
  117. #[Route('/profile/gamelist', name: 'app_profile_gamelist')]
  118. public function gameList(GameRepository $repository): Response
  119. {
  120. $user = $this->getUser();
  121. $gamemaster = $user->getLinkToGamemaster();
  122. if (!$gamemaster) {
  123. $this->addFlash('error', 'Vous n\'avez pas de profil de meneur(euse) de jeu.');
  124. return $this->redirectToRoute('app_profile');
  125. }
  126. $games = $repository->findAllValid();
  127. return $this->render('profile/gamelist.html.twig', [
  128. 'games' => $games,
  129. ]);
  130. }
  131. #[Route('/profile/gameadd', name: 'app_profile_gameadd', methods: ['GET', 'POST'])]
  132. public function gameAdd(Request $request, EntityManagerInterface $manager, PictureService $pictureService): Response
  133. {
  134. $user = $this->getUser();
  135. $gamemaster = $user->getLinkToGamemaster();
  136. if (!$gamemaster) {
  137. $this->addFlash('error', 'Vous n\'avez pas de profil de meneur(euse) de jeu.');
  138. return $this->redirectToRoute('app_profile');
  139. }
  140. // Initialisation d'un nouveau jeu
  141. $game = new Game();
  142. // Initialisaiton des valeurs par défaut
  143. $game->setAddBy($this->getUser());
  144. $game->setAddDatetime(new \Datetime('now'));
  145. $form = $this->createForm(GameProfileType::class, $game);
  146. $form->handleRequest($request);
  147. if ($form->isSubmitted() && $form->isValid()) {
  148. $slug = $form->get('slug')->getData();
  149. // Aucun slug n'a été proposé par l'utilisateur
  150. if (!$slug) {
  151. $slugger = new AsciiSlugger('fr_FR');
  152. $slug = $slugger->slug(strtolower($game->getName()));
  153. $game->setSlug($slug);
  154. }
  155. // Traiter l'image proposée
  156. $tmpPicture = $form->get('picture')->getData();
  157. if ($tmpPicture) {
  158. $picture = $pictureService->banner($tmpPicture, '/games/', $slug);
  159. $game->setPicture($picture);
  160. }
  161. $manager->persist($game);
  162. $manager->flush();
  163. $this->addFlash('success', 'Jeu ajouté à la base de données avec succès. Il sera prochainement validé par l\'équipe d\'administration.');
  164. return $this->redirectToRoute('app_profile_gamelist');
  165. }
  166. return $this->render('profile/gameadd.html.twig', [
  167. 'form' => $form,
  168. 'game' => $game
  169. ]);
  170. }
  171. #[Route('/profile/participations', name: 'app_profile_participations')]
  172. public function participations(ParticipationRepository $repository): Response
  173. {
  174. $user = $this->getUser();
  175. if (!$user) {
  176. $this->addFlash('danger', 'Aucun utilisateur connecté');
  177. }
  178. // Retrouver le mail de l'utilisateur
  179. $email = $user->getEmail();
  180. $participations = $repository->findAllByEmail($email);
  181. return $this->render('profile/participations.html.twig', [
  182. 'participations' => $participations,
  183. 'user' => $user
  184. ]);
  185. }
  186. #[Route('/profile/participations/gamemastering', name: 'app_profile_participations_gming')]
  187. public function participationsGM(): Response
  188. {
  189. $user = $this->getUser();
  190. if (!$user) {
  191. $this->addFlash('danger', 'Aucun utilisateur connecté');
  192. $this->redirectToRoute('app_main');
  193. }
  194. $gamemaster = $user->getLinkToGamemaster();
  195. if (!$gamemaster) {
  196. $this->addFlash('danger', 'Profil non MJ !');
  197. $this->redirectToRoute('app_profile_participations');
  198. }
  199. $participations = $gamemaster->getParties();
  200. return $this->render('profile/gamemastering.html.twig', [
  201. 'participations' => $participations,
  202. 'user' => $user
  203. ]);
  204. }
  205. #[Route('/profile/participations/requests', name: 'app_prodile_participations_requests')]
  206. public function participationRequests(): Response
  207. {
  208. $user = $this->getUser();
  209. if (!$user) {
  210. $this->addFlash('danger', 'Aucun utilisateur connecté');
  211. $this->redirectToRoute('app_main');
  212. }
  213. $partyRequests = $user->getPartyRequests();
  214. return $this->render('profile/partyrequests.html.twig', [
  215. 'user' => $user,
  216. 'partyRequests' => $partyRequests
  217. ]);
  218. }
  219. }