Files
ENI-sortir/src/Controller/AdminController.php
mepiphana2023 bd9b98b0d1 des trucs
2024-11-29 13:32:01 +01:00

384 lines
16 KiB
PHP

<?php
namespace App\Controller;
use App\Entity\Participant;
use App\Entity\PasswordResetToken;
use App\Entity\Site;
use App\Entity\Ville;
use App\Repository\EtatRepository;
use App\Repository\ParticipantRepository;
use App\Repository\SiteRepository;
use App\Repository\SortieRepository;
use App\Repository\VilleRepository;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
class AdminController extends AbstractController
{
private ParticipantRepository $participantRepository;
private SiteRepository $siteRepository;
public function __construct(ParticipantRepository $participantRepository, SiteRepository $siteRepository){
$this->participantRepository = $participantRepository;
$this->siteRepository = $siteRepository;
}
#[Route('/admin', name: 'app_admin')]
public function index(TokenStorageInterface $tokenStorage): Response
{
$token = $tokenStorage->getToken();
$userConnect = $token?->getUser();
return $this->render('admin/index.html.twig', [
'profile' => $userConnect,
'controller_name' => 'AdminController',
]);
}
#[Route('/admin/user', name: 'app_adminUser')]
public function adminUser(TokenStorageInterface $tokenStorage): Response
{
$participants = $this->participantRepository->findAll();
$sites = $this->siteRepository->findAll();
return $this->render('admin/user.html.twig', [
'participants' => $participants,
'sites' => $sites,
'controller_name' => 'AdminController',
]);
}
#[Route('/admin/user/disable/{id}', name: 'app_adminUserDisable')]
public function disableParticipant(string $id, ParticipantRepository $participantRepository, EntityManagerInterface $entityManager): RedirectResponse
{
$participant = $participantRepository->find($id);
if (!$participant) {
$this->addFlash('error', 'Le participant demandé n\'existe pas.');
return $this->redirectToRoute('app_adminUser');
}
if ($participant->isActif()){
$participant->setActif(false);
}else{
$participant->setActif(true);
}
$entityManager->persist($participant);
$entityManager->flush();
$this->addFlash('success', 'Participant désactivé avec succès.');
return $this->redirectToRoute('app_adminUser');
}
#[Route('/admin/user/delete/{id}', name: 'app_adminUserDelete')]
public function deleteUser(string $id, ParticipantRepository $participantRepository, EntityManagerInterface $entityManager): RedirectResponse
{
$participant = $participantRepository->find($id);
if (!$participant) {
$this->addFlash('error', 'L\'utilisateur demandé n\'existe pas.');
return $this->redirectToRoute('app_adminUser'); // Redirigez vers une liste ou une autre page
}
$entityManager->remove($participant);
$entityManager->flush();
$this->addFlash('success', 'Utilisateur supprimé avec succès.');
return $this->redirectToRoute('app_adminUser');
}
#[Route('/admin/user/add', name: 'app_adminUserAdd', methods: ['POST'])]
public function userAdd(Request $request, EntityManagerInterface $entityManager, MailerInterface $mailer, UrlGeneratorInterface $urlGenerator): Response
{
try {
$nom = $request->request->get('nom');
$prenom = $request->request->get('prenom');
$pseudo = $request->request->get('pseudo');
$telephone = $request->request->get('phone');
$mail = $request->request->get('mail');
if (!$mail || !$pseudo) {
$this->addFlash('error', 'Tous les champs sont requis.');
return $this->redirectToRoute('app_adminUser');
}
if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
$this->addFlash('error', 'L\'adresse e-mail n\'est pas valide.');
return $this->redirectToRoute('app_adminUser');
}
$participant = new Participant();
$participant->setNom($nom);
$participant->setPrenom($prenom);
$participant->setPseudo($pseudo);
$participant->setTelephone($telephone);
$participant->setEmail($mail);
$participant->setAdministrateur(false);
$participant->setActif(false);
$participant->setRoles(['ROLE_USER']);
$participant->setPassword(password_hash("aChanger44!", PASSWORD_BCRYPT));
$participant->setPending(true);
$entityManager->persist($participant);
$token = bin2hex(random_bytes(32));
$passwordResetToken = new PasswordResetToken();
$passwordResetToken->setToken($token)
->setEmail($participant->getEmail())
->setCreatedAt(new \DateTime());
$entityManager->persist($passwordResetToken);
$entityManager->flush();
$resetLink = $urlGenerator->generate(
'app_password_reset',
['token' => $token],
UrlGeneratorInterface::ABSOLUTE_URL
);
$email = (new Email())
->from('contact@sortir.com')
->to($participant->getEmail())
->subject('Sortir.com | Bienvenue sur notre site !')
->html("
<h1>Bonjour $pseudo,</h1>
<p>Un administrateur du site vous a créé un compte !</p>
<p>Terminer la création de cotre compte : <a href='$resetLink' target='_blank'>Sortir.com</a></p>
<p>Toute l'équipe de Sortir vous souhaite la bienvenue !</p>
");
$mailer->send($email);
$this->addFlash('success', "Utilisateur ajouté ! Un email lui a été envoyé !");
return $this->redirectToRoute('app_adminUser');
} catch(UniqueConstraintViolationException $e) {
$this->addFlash('error', "Le pseudo et/ou l'email est déjà utilisé");
return $this->redirectToRoute('app_adminUser');
} catch (TransportExceptionInterface $e) {
$this->addFlash('error', "Erreur : " . $e->getMessage());
return $this->redirectToRoute('app_adminUser');
}
}
#[Route('/admin/user/import', name: 'participant_import', methods: ['POST'])]
public function import(Request $request, EntityManagerInterface $em, MailerInterface $mailer, UrlGeneratorInterface $urlGenerator): RedirectResponse
{
try{
$file = $request->files->get('csv_file');
if ($file) {
$csvData = array_map('str_getcsv', file($file->getPathname()));
foreach ($csvData as $index => $row) {
if ($index === 0) continue;
$participant = new Participant();
$participant->setNom($row[0]);
$participant->setPrenom($row[1]);
$participant->setPseudo($row[2]);
$participant->setTelephone($row[3]);
$participant->setEmail($row[4]);
$participant->setAdministrateur(false);
$participant->setActif(false);
$participant->setRoles(explode('|', $row[7]));
$participant->setPassword(password_hash("aChanger44!", PASSWORD_BCRYPT));
$participant->setPending(true);
$em->persist($participant);
$token = bin2hex(random_bytes(32));
$passwordResetToken = new PasswordResetToken();
$passwordResetToken->setToken($token)
->setEmail($participant->getEmail())
->setCreatedAt(new \DateTime());
$em->persist($passwordResetToken);
$resetLink = $urlGenerator->generate(
'app_password_reset',
['token' => $token],
UrlGeneratorInterface::ABSOLUTE_URL
);
$email = (new Email())
->from('contact@sortir.com')
->to($participant->getEmail())
->subject('Sortir.com | Bienvenue sur notre site !')
->html("
<h1>Bonjour $row[2],</h1>
<p>Un administrateur du site vous a créé un compte !</p>
<p>Terminer la création de cotre compte : <a href='$resetLink' target='_blank'>Sortir.com</a></p>
<p>Toute l'équipe de Sortir vous souhaite la bienvenue !</p>
");
$mailer->send($email);
}
$em->flush();
}
return $this->redirectToRoute('app_adminUser');
}catch(\Exception $e){
$this->addFlash('error', "Votre fichier contient des erreurs : " . $e->getMessage());
return $this->redirectToRoute('app_adminUser');
}
}
#[Route('/admin/user/export', name: 'participant_export')]
public function export(ParticipantRepository $participantRepository, Request $request): Response
{
// $participants = $participantRepository->findAll();
$userList = $request->request->all('userList');
if (empty($userList)) {
$this->addFlash('warning', 'Veuillez sélectionner au moins un utilisateur.');
return $this->redirectToRoute('app_adminUser');
}
$participants = $participantRepository->findBy([
'idParticipant' => $userList,
]);
$csv = "Nom,Prénom,Pseudo,Téléphone,Email,Administrateur,Actif,Rôles\n";
foreach ($participants as $participant) {
$csv .= sprintf(
"%s,%s,%s,%s,%s,%s,%s,%s\n",
$participant->getNom(),
$participant->getPrenom(),
$participant->getPseudo(),
$participant->getTelephone(),
$participant->getEmail(),
$participant->isAdministrateur() ? '1' : '0',
$participant->isActif() ? '1' : '0',
implode('|', $participant->getRoles()),
);
}
$response = new Response($csv);
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set('Content-Disposition', 'attachment;filename="participants.csv"');
return $response;
}
#[Route('/admin/site', name: 'app_adminSite')]
public function adminSite(SiteRepository $siteRepository, TokenStorageInterface $tokenStorage): Response
{
$token = $tokenStorage->getToken();
$userConnect = $token?->getUser();
return $this->render('admin/site.html.twig', [
'profile' => $userConnect,
'sites' => $siteRepository->findAll(),
'controller_name' => 'AdminController',
]);
}
#[Route('/admin/site/add', name: 'app_adminSiteAdd', methods: ['POST'])]
public function adminSiteAdd(Request $request, EntityManagerInterface $entityManager): Response
{
try {
$nom = $request->request->get('nom');
if (!$nom) {
return new Response('Tous les champs sont requis.', Response::HTTP_BAD_REQUEST);
}
$site = new Site();
$site->setNom($nom);
$entityManager->persist($site);
$entityManager->flush();
$this->addFlash('success', "Site ajouté !");
return $this->redirectToRoute('app_adminSite');
} catch(\Exception $e) {
$this->addFlash('error', "Erreur : " . $e->getMessage());
return $this->redirectToRoute('app_adminSite');
}
}
#[Route('/admin/site/delete/{id}', name: 'app_adminSiteDelete')]
public function adminSiteDelete(string $id, SiteRepository $siteRepository, EntityManagerInterface $entityManager): RedirectResponse
{
$site = $siteRepository->find($id);
if (!$site) {
$this->addFlash('error', 'Le site demandée n\'existe pas.');
return $this->redirectToRoute('app_adminSite'); // Rediriger vers la liste des villes
}
$entityManager->remove($site);
$entityManager->flush();
// Ajouter un message de succès et rediriger vers la liste des villes
$this->addFlash('success', 'Site supprimée avec succès.');
return $this->redirectToRoute('app_adminSite');
}
#[Route('/admin/accept', name: 'app_acceptUser', methods: ['POST'])]
public function acceptUser(Request $request, EntityManagerInterface $entityManager, ParticipantRepository $participantRepository, SiteRepository $siteRepository): Response
{
try {
$user = $participantRepository->findOneBy(["idParticipant" => $request->request->get('id')]);
$site = $siteRepository->findOneBy(['idSite' => $request->request->get('site')]);
if(!$user || !$site) {
$this->addFlash('error', 'L\'utilisateur ou le site n\'existe pas.');
return $this->redirectToRoute('app_adminUser');
}
$user->setSite($site);
$user->setPending(false);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash('success', "L'utilisateur à bien été accepté et peut maintenant se connecter");
return $this->redirectToRoute('app_adminUser');
} catch(\Exception $e) {
$this->addFlash('error', "Erreur : " . $e->getMessage());
return $this->redirectToRoute('home');
}
}
#[Route('/admin/deny', name: 'app_denyUser')]
public function denyUser(Request $request, EntityManagerInterface $entityManager, ParticipantRepository $participantRepository): Response
{
try {
$user = $participantRepository->findOneBy(["idParticipant" => $request->get('id')]);
if(!$user) {
$this->addFlash('error', 'Le utilisateur n\'existe pas.');
return $this->redirectToRoute('app_adminUser');
}
$entityManager->remove($user);
$entityManager->flush();
$this->addFlash('success', "L'utilisateur à bien été refusé et ne pourra pas se connecter");
return $this->redirectToRoute('app_adminUser');
} catch(\Exception $e) {
$this->addFlash('error', "Erreur : " . $e->getMessage());
return $this->redirectToRoute('home');
}
}
#[Route('/admin/sortie', name: 'app_adminSortie')]
public function sortie(TokenStorageInterface $tokenStorage, SortieRepository $sortieRepository): Response
{
$token = $tokenStorage->getToken();
$userConnect = $token?->getUser();
return $this->render('admin/sortie.html.twig', [
'profile' => $userConnect,
'controller_name' => 'AdminController',
'sorties' => $sortieRepository->findAll(),
]);
}
#[Route('/admin/sortie/annuler/{id}', name: 'app_adminSortieAnnuler')]
public function sortieAnuler(String $id, EntityManagerInterface $entityManager,
SortieRepository $sortieRepository, EtatRepository $etatRepository): Response
{
$etat = $etatRepository->findOneBy(["libelle" => "Annulée"]);
$sortie = $sortieRepository->find($id);
$sortie->setEtat($etat);
$entityManager->persist($sortie);
$entityManager->flush();
$this->addFlash('success', "La sortie a bien été annuler");
return $this->redirectToRoute('app_adminSortie');
}
}