380 lines
16 KiB
PHP
380 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\ParticipantRepository;
|
|
use App\Repository\SiteRepository;
|
|
use App\Repository\VilleRepository;
|
|
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
|
|
{
|
|
#[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',
|
|
]);
|
|
}
|
|
|
|
//Gestion des utilisateurs
|
|
#[Route('/admin/user', name: 'app_adminUser')]
|
|
public function adminUser(ParticipantRepository $participantRepository, TokenStorageInterface $tokenStorage): Response
|
|
{
|
|
$token = $tokenStorage->getToken();
|
|
$userConnect = $token?->getUser();
|
|
return $this->render('admin/user.html.twig', [
|
|
'profile' => $userConnect,
|
|
'participants' => $participantRepository->findAll(),
|
|
'controller_name' => 'AdminController',
|
|
]);
|
|
}
|
|
#[Route('/admin/user/disable/{id}', name: 'app_adminUserDisable')]
|
|
public function disableParticipant(string $id, ParticipantRepository $participantRepository, EntityManagerInterface $entityManager): RedirectResponse
|
|
{
|
|
// Récupérer le participant à partir de l'id
|
|
$participant = $participantRepository->find($id);
|
|
|
|
// Vérifier si le participant existe
|
|
if (!$participant) {
|
|
$this->addFlash('error', 'Le participant demandé n\'existe pas.');
|
|
return $this->redirectToRoute('app_adminUser'); // Redirigez vers une liste ou une autre page
|
|
}
|
|
|
|
// Désactiver le participant (par exemple, définir une propriété "isActive" à false)
|
|
if ($participant->isActif()){
|
|
$participant->setActif(false);
|
|
}else{
|
|
$participant->setActif(true);
|
|
}
|
|
|
|
// Sauvegarder la modification en base de données
|
|
$entityManager->persist($participant);
|
|
$entityManager->flush();
|
|
|
|
// Ajouter un message de succès et rediriger
|
|
$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
|
|
{
|
|
// Récupérer l'utilisateur ou le participant à partir de l'id
|
|
$participant = $participantRepository->find($id);
|
|
|
|
// Vérifier si l'utilisateur existe
|
|
if (!$participant) {
|
|
$this->addFlash('error', 'L\'utilisateur demandé n\'existe pas.');
|
|
return $this->redirectToRoute('app_adminUser'); // Redirigez vers une liste ou une autre page
|
|
}
|
|
|
|
// Supprimer l'utilisateur
|
|
$entityManager->remove($participant);
|
|
$entityManager->flush();
|
|
|
|
// Ajouter un message de succès et rediriger
|
|
$this->addFlash('success', 'Utilisateur supprimé avec succès.');
|
|
return $this->redirectToRoute('app_adminUser'); // Redirigez vers la liste des utilisateurs
|
|
}
|
|
#[Route('/admin/user/add', name: 'app_adminUserAdd', methods: ['POST'])]
|
|
public function userAdd(Request $request, EntityManagerInterface $entityManager, MailerInterface $mailer, UrlGeneratorInterface $urlGenerator): Response
|
|
{
|
|
try {
|
|
// Récupérer les données envoyées par le formulaire
|
|
$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');
|
|
|
|
// Vérifier que les champs ne sont pas vides
|
|
if (!$mail || !$pseudo) {
|
|
$this->addFlash('error', 'Tous les champs sont requis.');
|
|
return $this->redirectToRoute('app_adminUser');
|
|
}
|
|
|
|
// Vérifier que le mail est valide avec une regex
|
|
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));
|
|
|
|
$entityManager->persist($participant);
|
|
|
|
// Générer un token unique
|
|
$token = bin2hex(random_bytes(32));
|
|
|
|
// Enregistrer le token dans la base de données
|
|
$passwordResetToken = new PasswordResetToken();
|
|
$passwordResetToken->setToken($token)
|
|
->setEmail($participant->getEmail())
|
|
->setCreatedAt(new \DateTime());
|
|
|
|
$entityManager->persist($passwordResetToken);
|
|
$entityManager->flush();
|
|
|
|
// Générer un lien de réinitialisation
|
|
$resetLink = $urlGenerator->generate(
|
|
'app_password_reset',
|
|
['token' => $token],
|
|
UrlGeneratorInterface::ABSOLUTE_URL
|
|
);
|
|
|
|
// Envoyer un email de notification
|
|
$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
|
|
{
|
|
$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));
|
|
$em->persist($participant);
|
|
|
|
// Générer un token unique
|
|
$token = bin2hex(random_bytes(32));
|
|
|
|
// Enregistrer le token dans la base de données
|
|
$passwordResetToken = new PasswordResetToken();
|
|
$passwordResetToken->setToken($token)
|
|
->setEmail($participant->getEmail())
|
|
->setCreatedAt(new \DateTime());
|
|
|
|
$em->persist($passwordResetToken);
|
|
|
|
// Générer un lien de réinitialisation
|
|
$resetLink = $urlGenerator->generate(
|
|
'app_password_reset',
|
|
['token' => $token],
|
|
UrlGeneratorInterface::ABSOLUTE_URL
|
|
);
|
|
|
|
// Envoyer un email de notification
|
|
$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');
|
|
}
|
|
#[Route('/admin/user/export', name: 'participant_export')]
|
|
public function export(ParticipantRepository $participantRepository): Response
|
|
{
|
|
$participants = $participantRepository->findAll();
|
|
$csv = "Nom,Prénom,Pseudo,Téléphone,Email,Administrateur,Actif,Rôles,Password\n";
|
|
foreach ($participants as $participant) {
|
|
$csv .= sprintf(
|
|
"%s,%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()),
|
|
$participant->getPassword()
|
|
);
|
|
}
|
|
$response = new Response($csv);
|
|
$response->headers->set('Content-Type', 'text/csv');
|
|
$response->headers->set('Content-Disposition', 'attachment;filename="participants.csv"');
|
|
return $response;
|
|
}
|
|
|
|
//Gestion des villes
|
|
#[Route('/admin/city', name: 'app_adminCity')]
|
|
public function adminCity(VilleRepository $villeRepository, TokenStorageInterface $tokenStorage): Response
|
|
{
|
|
$token = $tokenStorage->getToken();
|
|
$userConnect = $token?->getUser();
|
|
return $this->render('admin/city.html.twig', [
|
|
'profile' => $userConnect,
|
|
'citys' => $villeRepository->findAll(),
|
|
'controller_name' => 'AdminController',
|
|
]);
|
|
}
|
|
#[Route('/admin/city/add', name: 'app_adminCityAdd', methods: ['POST'])]
|
|
public function adminCityAdd(Request $request, EntityManagerInterface $entityManager): Response
|
|
{
|
|
try {
|
|
// Récupérer les données envoyées par le formulaire
|
|
$postalCode = $request->request->get('postalCode');
|
|
$cityName = $request->request->get('citySelect');
|
|
|
|
// Vérifier que les champs ne sont pas vides
|
|
if (!$postalCode || !$cityName) {
|
|
return new Response('Tous les champs sont requis.', Response::HTTP_BAD_REQUEST);
|
|
}
|
|
|
|
// Créer une nouvelle entité City et définir ses propriétés
|
|
$city = new Ville();
|
|
$city->setNom($cityName);
|
|
$city->setCodePostal($postalCode);
|
|
|
|
// Enregistrer la ville dans la base de données
|
|
$entityManager->persist($city);
|
|
$entityManager->flush();
|
|
$this->addFlash('success', "Ville ajouté !");
|
|
return $this->redirectToRoute('app_adminCity');
|
|
} catch(\Exception $e) {
|
|
$this->addFlash('error', "Erreur : " . $e->getMessage());
|
|
return $this->redirectToRoute('app_adminCity');
|
|
}
|
|
}
|
|
#[Route('/admin/city/delete/{id}', name: 'app_adminCityDelete')]
|
|
public function adminCityDelete(string $id, VilleRepository $villeRepository, EntityManagerInterface $entityManager): RedirectResponse
|
|
{
|
|
// Récupérer la ville à supprimer
|
|
$city = $villeRepository->find($id);
|
|
|
|
// Vérifier si la ville existe
|
|
if (!$city) {
|
|
// Si la ville n'existe pas, rediriger avec un message d'erreur
|
|
$this->addFlash('error', 'La ville demandée n\'existe pas.');
|
|
return $this->redirectToRoute('app_adminCity'); // Rediriger vers la liste des villes
|
|
}
|
|
|
|
// Supprimer la ville
|
|
$entityManager->remove($city);
|
|
$entityManager->flush();
|
|
|
|
// Ajouter un message de succès et rediriger vers la liste des villes
|
|
$this->addFlash('success', 'Ville supprimée avec succès.');
|
|
return $this->redirectToRoute('app_adminCity');
|
|
}
|
|
|
|
//Gestion des sites
|
|
#[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 {
|
|
// Récupérer les données envoyées par le formulaire
|
|
$nom = $request->request->get('nom');
|
|
|
|
// Vérifier que les champs ne sont pas vides
|
|
if (!$nom) {
|
|
return new Response('Tous les champs sont requis.', Response::HTTP_BAD_REQUEST);
|
|
}
|
|
|
|
// Créer une nouvelle entité City et définir ses propriétés
|
|
$site = new Site();
|
|
$site->setNom($nom);
|
|
|
|
// Enregistrer la ville dans la base de données
|
|
$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
|
|
{
|
|
// Récupérer la ville à supprimer
|
|
$site = $siteRepository->find($id);
|
|
|
|
// Vérifier si la ville existe
|
|
if (!$site) {
|
|
// Si la ville n'existe pas, rediriger avec un message d'erreur
|
|
$this->addFlash('error', 'Le site demandée n\'existe pas.');
|
|
return $this->redirectToRoute('app_adminSite'); // Rediriger vers la liste des villes
|
|
}
|
|
|
|
// Supprimer la ville
|
|
$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');
|
|
}
|
|
}
|