✨ 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.
```
164 lines
6.1 KiB
PHP
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');
|
|
}
|
|
}
|