Files
ludikevent_crm/src/Controller/Dashboard/AccountController.php
Serreau Jovann 98937f9164 ```
 feat(admin): Ajoute gestion des administrateurs avec création et suppression.

Ajoute la gestion complète des administrateurs : création, suppression,
logs d'audit, notifications mail (création/suppression) et désinscription.
```
2026-01-15 19:44:51 +01:00

164 lines
6.1 KiB
PHP

<?php
namespace App\Controller\Dashboard;
use App\Entity\Account;
use App\Event\Object\EventAdminCreate;
use App\Event\Object\EventAdminDeleted;
use App\Form\AccountType;
use App\Logger\AppLogger;
use App\Repository\AccountRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Uid\Uuid;
class AccountController extends AbstractController
{
/**
* Liste des administrateurs
*/
#[Route(path: '/crm/administrateur', name: 'app_crm_administrateur', options: ['sitemap' => false], methods: ['GET'])]
public function administrateur(AccountRepository $accountRepository, AppLogger $appLogger,EventDispatcherInterface $eventDispatcher): Response
{
// Audit Log : On trace la consultation de la liste
$appLogger->record('VIEW', 'Consultation de la liste des administrateurs');
$eventDispatcher->dispatch(new EventAdminCreate($accountRepository->findAdmin()[0], $this->getUser()));
return $this->render('dashboard/administrateur.twig', [
'admins' => $accountRepository->findAdmin(),
]);
}
/**
* Ajouter un administrateur
*/
#[Route(path: '/crm/administrateur/add', name: 'app_crm_administrateur_add', options: ['sitemap' => false], methods: ['GET', 'POST'])]
public function administrateurAdd(
Request $request,
EntityManagerInterface $entityManager,
UserPasswordHasherInterface $passwordHasher,
AppLogger $appLogger,
EventDispatcherInterface $eventDispatcher
): Response {
$account = new Account();
// Initialisation des valeurs par défaut
$account->setIsFirstLogin(true);
$account->setIsActif(false);
$account->setUuid(Uuid::v4()->toRfc4122());
$account->setRoles(['ROLE_ADMIN']);
$form = $this->createForm(AccountType::class, $account);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Hachage du mot de passe temporaire
$tempPassword = bin2hex(random_bytes(20));
$hashedPassword = $passwordHasher->hashPassword($account, $tempPassword);
$account->setPassword($hashedPassword);
$entityManager->persist($account);
$entityManager->flush();
// Audit Log : Enregistrement de la création
$appLogger->record(
'CREATE',
sprintf("Création de l'administrateur : %s %s (%s)",
$account->getFirstName(),
$account->getName(),
$account->getEmail()
)
);
// Notification : Envoi du mail d'activation
$eventDispatcher->dispatch(new EventAdminCreate($account, $this->getUser()));
$this->addFlash('success', 'Le compte administrateur de ' . $account->getFirstName() . ' a été créé avec succès.');
return $this->redirectToRoute('app_crm_administrateur');
}
return $this->render('dashboard/administrateur/add.twig', [
'form' => $form->createView(),
]);
}
/**
* Voir la fiche d'un administrateur
*/
#[Route(path: '/crm/administrateur/{id}', name: 'app_crm_administrateur_view', options: ['sitemap' => false], methods: ['GET'])]
public function administrateurView(?Account $account, AppLogger $appLogger): Response
{
if (!$account) {
$this->addFlash('error', 'Administrateur introuvable.');
return $this->redirectToRoute('app_crm_administrateur');
}
// Audit Log : On trace la consultation d'une fiche spécifique
$appLogger->record(
'VIEW',
sprintf("Consultation du profil de : %s %s (ID: %d)",
$account->getFirstName(),
$account->getName(),
$account->getId()
)
);
return $this->render('dashboard/administrateur/view.twig', [
'admin' => $account,
]);
}
/**
* Supprimer un administrateur
*/
#[Route(path: '/crm/administrateur/delete/{id}', name: 'app_crm_administrateur_delete', options: ['sitemap' => false], methods: ['POST'])]
public function administrateurDelete(
EventDispatcherInterface $eventDispatcher,
?Account $account,
Request $request,
AppLogger $appLogger,
EntityManagerInterface $entityManager
): Response {
if (!$account) {
$this->addFlash('error', 'Administrateur introuvable.');
return $this->redirectToRoute('app_crm_administrateur');
}
if ($account === $this->getUser()) {
$this->addFlash('error', 'Vous ne pouvez pas supprimer votre propre compte.');
return $this->redirectToRoute('app_crm_administrateur');
}
// Récupération du token CSRF (compatible Turbo)
$token = $request->request->get('_token') ?? $request->query->get('_token');
if ($this->isCsrfTokenValid('delete' . $account->getId(), $token)) {
$name = $account->getFirstName() . ' ' . $account->getName();
$email = $account->getEmail();
// Audit Log : On trace avant la suppression pour garder les infos
$appLogger->record(
'DELETE',
sprintf("Suppression définitive de l'administrateur : %s (%s)", $name, $email)
);
// Dispatch pour notification mail
$eventDispatcher->dispatch(new EventAdminDeleted($account, $this->getUser()));
$entityManager->remove($account);
$entityManager->flush();
$this->addFlash('success', "Le compte de $name a été supprimé.");
} else {
$this->addFlash('error', 'Jeton de sécurité invalide.');
}
return $this->redirectToRoute('app_crm_administrateur');
}
}