UserController.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <?php
  2. namespace App\Controller\Admin;
  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 App\Security\EmailVerifier;
  11. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  12. use Symfony\Component\Mime\Address;
  13. use Symfony\Component\Mailer\MailerInterface;
  14. use Symfony\Component\Mime\Email;
  15. use Symfony\Component\String\Slugger\AsciiSlugger;
  16. use App\Entity\User;
  17. use App\Entity\Gamemaster;
  18. use App\Form\UserType;
  19. use App\Repository\UserRepository;
  20. use App\Repository\GamemasterRepository;
  21. final class UserController extends AbstractController
  22. {
  23. public function __construct(private EmailVerifier $emailVerifier)
  24. {
  25. }
  26. /*
  27. * Lister tous les utilisateurs
  28. */
  29. #[Route('/admin/user', name: 'app_admin_user', methods: ['GET'])]
  30. public function index(UserRepository $repository): Response
  31. {
  32. // Extraire l'ensemble des utilisateurs
  33. $users = $repository->findAll();
  34. // Retourner la page
  35. return $this->render('admin/user/index.html.twig', [
  36. 'users' => $users,
  37. ]);
  38. }
  39. /*
  40. * Supprimer un utilisateur
  41. */
  42. #[Route('/admin/user/{id}/delete', name: 'app_admin_user_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  43. public function delete(?User $user, EntityManagerInterface $manager): Response
  44. {
  45. if (!$user) {
  46. $this->addFlash('danger', 'Aucun utilisateur sélectionné.');
  47. return $this->redirectToRoute('app_admin_user');
  48. }
  49. // Si MJ, supprimer le lien avant de supprimer
  50. if ($user->getLinkToGamemaster()) {
  51. $user->setLinkToGamemaster(null);
  52. $manager->persist($user);
  53. }
  54. $manager->remove($user);
  55. $manager->flush();
  56. $this->addFlash('success', 'Utilisateur supprimé avec succès.');
  57. return $this->redirectToRoute('app_admin_user');
  58. }
  59. /*
  60. * Créer un MJ à partir d'un utitlisateur
  61. */
  62. #[Route('/admin/user/{id}/create_gamemaster', name: 'app_admin_user_create_gm', requirements: ['id' => Requirement::UUID_V7], methods: ['GET'])]
  63. public function createGamemaster(?User $user, EntityManagerInterface $manager, GamemasterRepository $gmRepo): Response
  64. {
  65. if (!$user) {
  66. $this->addFlash('danger', 'Aucun utilisateur sélectionné.');
  67. return $this->redirectToRoute('app_admin_user');
  68. }
  69. if ($gmRepo->findByEmail($user->getEmail())) {
  70. $this->addFlash('danger', 'Un profil meneur(euse) de jeu existe déjà avec cet email. Associez le depuis la gestion des meneur(euse)s de jeux.');
  71. return $this->redirectToRoute('app_admin_user');
  72. }
  73. if ($user->getLinkToGamemaster()) {
  74. $this->addFlash('danger', 'Profil meneur(euse) de jeu déjà existant.');
  75. return $this->redirectToRoute('app_admin_user');
  76. }
  77. $gamemaster = new Gamemaster();
  78. $gamemaster->setFirstName($user->getFirstName());
  79. $gamemaster->setLastName($user->getLastName());
  80. $gamemaster->setPreferedName($user->getFullName());
  81. $slugger = new AsciiSlugger('fr_FR');
  82. $slug = $slugger->slug(strtolower($user->getFullName()));
  83. $gamemaster->setSlug($slug);
  84. $gamemaster->setEmail($user->getEmail());
  85. $phone = $user->getPhone();
  86. if ($phone) { $gamemaster->setPhone($phone); }
  87. $gamemaster->setLinkToUser($user);
  88. $manager->persist($gamemaster);
  89. $manager->flush();
  90. $this->addFlash('success', 'Meneur.euse de jeu créé.e avec succès.');
  91. return $this->redirectToRoute('app_admin_user');
  92. }
  93. /*
  94. * Modifier un utilisateur
  95. */
  96. #[Route('/admin/user/{id}/edit', name: 'app_admin_user_edit', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
  97. public function edit(?User $user, Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $manager, MailerInterface $mailer): Response
  98. {
  99. $form = $this->createForm(UserType::class, $user);
  100. // Mise à jour de l'utilisateur à partir du formaulaire
  101. $form->handleRequest($request);
  102. if ($form->isSubmitted() && $form->isValid()) {
  103. // Si un nouveau mot de passe a été proposé
  104. if ($form->get('newPassword')->getData()) {
  105. // Encoder le mot de passe
  106. $newPassword = $form->get('newPassword')->getData();
  107. $user->setPassword($userPasswordHasher->hashPassword($user, $newPassword));
  108. // Prévenir l'utilisateur de la modification de son mot de passe
  109. $email = (new TemplatedEmail())
  110. ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
  111. ->to((string) $user->getEmail())
  112. ->subject('Votre mot de passe a été modifié')
  113. ->htmlTemplate('admin/user/edit.email.html.twig')
  114. ->textTemplate('admin/user/edit.email.txt.twig')
  115. ->context([
  116. 'user' => $user,
  117. 'clearPassword' => $newPassword,
  118. ]);
  119. $mailer->send($email);
  120. }
  121. // Mettre à jour l'utilisateur
  122. $user->setLastUpdate();
  123. $manager->persist($user);
  124. $manager->flush();
  125. $this->addFlash('success', 'Utilisateur modifié avec succès.');
  126. return $this->redirectToRoute('app_admin_user');
  127. }
  128. // Affichage du formulaire de modification
  129. return $this->render('admin/user/edit.html.twig', [
  130. 'form' => $form,
  131. 'user' => $user
  132. ]);
  133. }
  134. /*
  135. * Ajouter un utilisateur
  136. */
  137. #[Route('/admin/user/add', name: 'app_admin_user_add', methods: ['GET', 'POST'])]
  138. public function add(Request $request, UserPasswordHasherInterface $userPasswordHasher,EntityManagerInterface $manager, MailerInterface $mailer): Response
  139. {
  140. $user = new User();
  141. $form = $this->createForm(UserType::class, $user);
  142. // Mise à jour de l'utilisateur à partir du formaulaire
  143. $form->handleRequest($request);
  144. if ($form->isSubmitted() && $form->isValid()) {
  145. // Générer un mot de passe aléatoire et le mailler
  146. if ($form->get('newPassword')->getData()) {
  147. // Encoder le mot de passe
  148. $newPassword = $form->get('newPassword')->getData();
  149. $user->setPassword($userPasswordHasher->hashPassword($user, $newPassword));
  150. } else {
  151. // Générer un mot de passe aléatoire
  152. $newPassword = bin2hex(random_bytes(8));
  153. $user->setPassword($userPasswordHasher->hashPassword($user, $newPassword));
  154. }
  155. // Enregisrer ce nouvel utilisateur
  156. $manager->persist($user);
  157. $manager->flush();
  158. // Prévenir l'utilisateur de la création de son compte
  159. $email = (new TemplatedEmail())
  160. ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
  161. ->to((string) $user->getEmail())
  162. ->subject('Votre mot de passe a été modifié')
  163. ->htmlTemplate('admin/user/add.email.html.twig')
  164. ->textTemplate('admin/user/add.email.txt.twig')
  165. ->context([
  166. 'user' => $user,
  167. 'clearPassword' => $newPassword,
  168. ]);
  169. $mailer->send($email);
  170. // Vérification de l'email, si nécessaire
  171. if (!$user->isVerified()) {
  172. $this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
  173. (new TemplatedEmail())
  174. ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
  175. ->to((string) $user->getEmail())
  176. ->subject('Merci de confirmer votre adresse email')
  177. ->htmlTemplate('registration/confirmation_email.html.twig')
  178. ->textTemplate('registration/confirmation_email.txt.twig')
  179. );
  180. }
  181. $this->addFlash('success', 'Utilisateur créé avec succès.');
  182. return $this->redirectToRoute('app_admin_user');
  183. }
  184. // Affichage du formulaire d'ajout
  185. return $this->render('admin/user/edit.html.twig', [
  186. 'form' => $form,
  187. ]);
  188. }
  189. }