|  | @@ -0,0 +1,174 @@
 | 
	
		
			
				|  |  | +<?php
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +namespace App\Controller\Admin;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 | 
	
		
			
				|  |  | +use Symfony\Component\HttpFoundation\Request;
 | 
	
		
			
				|  |  | +use Symfony\Component\HttpFoundation\Response;
 | 
	
		
			
				|  |  | +use Symfony\Component\Routing\Requirement\Requirement;
 | 
	
		
			
				|  |  | +use Symfony\Component\Routing\Attribute\Route;
 | 
	
		
			
				|  |  | +use Doctrine\ORM\EntityManagerInterface;
 | 
	
		
			
				|  |  | +use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
 | 
	
		
			
				|  |  | +use App\Security\EmailVerifier;
 | 
	
		
			
				|  |  | +use Symfony\Bridge\Twig\Mime\TemplatedEmail;
 | 
	
		
			
				|  |  | +use Symfony\Component\Mime\Address;
 | 
	
		
			
				|  |  | +use Symfony\Component\Mailer\MailerInterface;
 | 
	
		
			
				|  |  | +use Symfony\Component\Mime\Email;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +use App\Entity\User;
 | 
	
		
			
				|  |  | +use App\Form\UserType;
 | 
	
		
			
				|  |  | +use App\Repository\UserRepository;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +final class UserController extends AbstractController
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    public function __construct(private EmailVerifier $emailVerifier)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  | +     * Lister tous les utilisateurs
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    #[Route('/admin/user', name: 'app_admin_user', methods: ['GET'])]
 | 
	
		
			
				|  |  | +    public function index(UserRepository $repository): Response
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        // Extraire l'ensemble des utilisateurs
 | 
	
		
			
				|  |  | +       $users = $repository->findAll(); 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Retourner la page
 | 
	
		
			
				|  |  | +        return $this->render('admin/user/index.html.twig', [
 | 
	
		
			
				|  |  | +            'users' => $users,
 | 
	
		
			
				|  |  | +        ]);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  | +     * Supprimer un utilisateur
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    #[Route('/admin/user/{id}/delete', name: 'app_admin_user_delete', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
 | 
	
		
			
				|  |  | +    public function delete(?User $user, Request $request, EntityManagerInterface $manager): Response
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $form = $this->createFormBuilder(FormType::class)->getForm();
 | 
	
		
			
				|  |  | +        $form->handleRequest($request);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Suppression de l'utilisateur si le formulaire a été soumis
 | 
	
		
			
				|  |  | +        if ($form->isSubmitted() && $form->isValid()) {
 | 
	
		
			
				|  |  | +            $manager->remove($user);
 | 
	
		
			
				|  |  | +            $manager->flush();
 | 
	
		
			
				|  |  | +            $this->addFlash('success', 'Utilisateur supprimé avec succès.');
 | 
	
		
			
				|  |  | +            return $this->redirectToRoute('app_admin_user');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Affichage du formualaire de confirmation
 | 
	
		
			
				|  |  | +        return $this->render('admin/user/delete.html.twig', [
 | 
	
		
			
				|  |  | +            'form' => $form,
 | 
	
		
			
				|  |  | +            'user' => $user
 | 
	
		
			
				|  |  | +        ]);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  | +     * Modifier un utilisateur
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    #[Route('/admin/user/{id}/edit', name: 'app_admin_user_edit', requirements: ['id' => Requirement::UUID_V7], methods: ['GET', 'POST'])]
 | 
	
		
			
				|  |  | +    public function edit(?User $user, Request $request, UserPasswordHasherInterface $userPasswordHasher, EntityManagerInterface $manager,  MailerInterface $mailer): Response
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $form = $this->createForm(UserType::class, $user);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Mise à jour de l'utilisateur à partir du formaulaire
 | 
	
		
			
				|  |  | +        $form->handleRequest($request);
 | 
	
		
			
				|  |  | +        if ($form->isSubmitted() && $form->isValid()) {
 | 
	
		
			
				|  |  | +            // Si un nouveau mot de passe a été proposé
 | 
	
		
			
				|  |  | +            if ($form->get('newPassword')->getData()) {
 | 
	
		
			
				|  |  | +                // Encoder le mot de passe
 | 
	
		
			
				|  |  | +                $newPassword = $form->get('newPassword')->getData();
 | 
	
		
			
				|  |  | +                $user->setPassword($userPasswordHasher->hashPassword($user, $newPassword));
 | 
	
		
			
				|  |  | +                // Prévenir l'utilisateur de la modification de son mot de passe
 | 
	
		
			
				|  |  | +                $email = (new TemplatedEmail())
 | 
	
		
			
				|  |  | +                    ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
 | 
	
		
			
				|  |  | +                    ->to((string) $user->getEmail())
 | 
	
		
			
				|  |  | +                    ->subject('Votre mot de passe a été modifié')
 | 
	
		
			
				|  |  | +                    ->htmlTemplate('admin/user/edit.email.html.twig')
 | 
	
		
			
				|  |  | +                    ->textTemplate('admin/user/edit.email.txt.twig')
 | 
	
		
			
				|  |  | +                    ->context([
 | 
	
		
			
				|  |  | +                        'user' => $user,
 | 
	
		
			
				|  |  | +                        'clearPassword' => $newPassword,
 | 
	
		
			
				|  |  | +                    ]);
 | 
	
		
			
				|  |  | +                $mailer->send($email);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // Mettre à jour l'utilisateur
 | 
	
		
			
				|  |  | +            $user->setLastUpdate();
 | 
	
		
			
				|  |  | +            $manager->persist($user);
 | 
	
		
			
				|  |  | +            $manager->flush();
 | 
	
		
			
				|  |  | +            $this->addFlash('success', 'Utilisateur modifié avec succès.');
 | 
	
		
			
				|  |  | +            return $this->redirectToRoute('app_admin_user');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Affichage du formulaire de modification
 | 
	
		
			
				|  |  | +        return $this->render('admin/user/edit.html.twig', [
 | 
	
		
			
				|  |  | +            'form' => $form,
 | 
	
		
			
				|  |  | +            'user' => $user
 | 
	
		
			
				|  |  | +        ]);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  | +     * Ajouter un utilisateur
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    #[Route('/admin/user/add', name: 'app_admin_user_add', methods: ['GET', 'POST'])]
 | 
	
		
			
				|  |  | +    public function add(Request $request, UserPasswordHasherInterface $userPasswordHasher,EntityManagerInterface $manager,  MailerInterface $mailer): Response
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $user = new User();
 | 
	
		
			
				|  |  | +        $form = $this->createForm(UserType::class, $user);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Mise à jour de l'utilisateur à partir du formaulaire
 | 
	
		
			
				|  |  | +        $form->handleRequest($request);
 | 
	
		
			
				|  |  | +        if ($form->isSubmitted() && $form->isValid()) {
 | 
	
		
			
				|  |  | +            // Générer un mot de passe aléatoire et le mailler
 | 
	
		
			
				|  |  | +            if ($form->get('newPassword')->getData()) {
 | 
	
		
			
				|  |  | +                // Encoder le mot de passe
 | 
	
		
			
				|  |  | +                $newPassword = $form->get('newPassword')->getData();
 | 
	
		
			
				|  |  | +                $user->setPassword($userPasswordHasher->hashPassword($user, $newPassword));
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                // Générer un mot de passe aléatoire
 | 
	
		
			
				|  |  | +                $newPassword = bin2hex(random_bytes(8));
 | 
	
		
			
				|  |  | +                $user->setPassword($userPasswordHasher->hashPassword($user, $newPassword));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            // Enregisrer ce nouvel utilisateur
 | 
	
		
			
				|  |  | +            $manager->persist($user);
 | 
	
		
			
				|  |  | +            $manager->flush();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // Prévenir l'utilisateur de la création de son compte
 | 
	
		
			
				|  |  | +            $email = (new TemplatedEmail())
 | 
	
		
			
				|  |  | +                    ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
 | 
	
		
			
				|  |  | +                    ->to((string) $user->getEmail())
 | 
	
		
			
				|  |  | +                    ->subject('Votre mot de passe a été modifié')
 | 
	
		
			
				|  |  | +                    ->htmlTemplate('admin/user/add.email.html.twig')
 | 
	
		
			
				|  |  | +                    ->textTemplate('admin/user/add.email.txt.twig')
 | 
	
		
			
				|  |  | +                    ->context([
 | 
	
		
			
				|  |  | +                        'user' => $user,
 | 
	
		
			
				|  |  | +                        'clearPassword' => $newPassword,
 | 
	
		
			
				|  |  | +                    ]);
 | 
	
		
			
				|  |  | +            $mailer->send($email);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // Vérification de l'email, si nécessaire
 | 
	
		
			
				|  |  | +            if (!$user->isVerified()) {
 | 
	
		
			
				|  |  | +                $this->emailVerifier->sendEmailConfirmation('app_verify_email', $user,
 | 
	
		
			
				|  |  | +                   (new TemplatedEmail())
 | 
	
		
			
				|  |  | +                        ->from(new Address($_ENV['CONTACT_EMAIL'], $_ENV['CONTACT_NAME']))
 | 
	
		
			
				|  |  | +                        ->to((string) $user->getEmail())
 | 
	
		
			
				|  |  | +                        ->subject('Merci de confirmer votre adresse email')
 | 
	
		
			
				|  |  | +                        ->htmlTemplate('registration/confirmation_email.html.twig')
 | 
	
		
			
				|  |  | +                        ->textTemplate('registration/confirmation_email.txt.twig')
 | 
	
		
			
				|  |  | +                );
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            $this->addFlash('success', 'Utilisateur créé avec succès.');
 | 
	
		
			
				|  |  | +            return $this->redirectToRoute('app_admin_user');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // Affichage du formulaire d'ajout
 | 
	
		
			
				|  |  | +        return $this->render('admin/user/edit.html.twig', [
 | 
	
		
			
				|  |  | +            'form' => $form,
 | 
	
		
			
				|  |  | +        ]);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +}
 |