feat(AvatarController): Génère un avatar SVG pour l'utilisateur authentifié.

♻️ refactor(DashboardController): Simplifie la méthode artemis.
🔒 fix(ProfilsController): Gère l'upload d'avatar et le changement de mot de passe.
🗑️ chore(RevendeurController): Améliore la gestion des revendeurs et l'ajout.
⚙️ refactor(AccountController): Améliore la gestion des comptes administrateurs.
This commit is contained in:
Serreau Jovann
2025-09-27 16:22:53 +02:00
parent 98f7581b22
commit 45d1f932e9
5 changed files with 193 additions and 115 deletions

View File

@@ -9,24 +9,28 @@ use Symfony\Component\Routing\Attribute\Route;
class AvatarController extends AbstractController
{
#[Route(path: '/artemis/lockdown',name: 'artemis_lockdown',methods: ['GET', 'POST'])]
#[Route('/artemis/lockdown', name: 'artemis_lockdown', methods: ['GET', 'POST'])]
public function artemisLockdown(): Response
{
return $this->json([
'lockdown' => false
]);
return $this->json(['lockdown' => false]);
}
#[Route(path: '/artemis/avatar',name: 'artemis_avatar',methods: ['GET', 'POST'])]
#[Route('/artemis/avatar', name: 'artemis_avatar', methods: ['GET', 'POST'])]
public function artemis(): Response
{
$avatar = new InitialAvatar();
$avatar->name($this->getUser()->getUserIdentifier());
$image = $avatar->generateSvg();
return new Response($image->toXMLString(),200,[
'Content-Type' => 'image/svg+xml'
]);
$user = $this->getUser();
if (!$user) {
throw $this->createAccessDeniedException('Utilisateur non authentifié.');
}
$avatar = new InitialAvatar();
$avatar->name($user->getUserIdentifier());
$image = $avatar->generateSvg();
return new Response(
$image->toXMLString(),
Response::HTTP_OK,
['Content-Type' => 'image/svg+xml']
);
}
}

View File

@@ -5,14 +5,12 @@ namespace App\Controller\Artemis;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class DashboardController extends AbstractController
{
#[Route(path: '/artemis',name: 'artemis_dashboard',methods: ['GET', 'POST'])]
public function artemis(AuthenticationUtils $authenticationUtils): Response
#[Route('/artemis', name: 'artemis_dashboard', methods: ['GET', 'POST'])]
public function artemis(): Response
{
return $this->render('artemis/dashboard.twig');
}
}

View File

@@ -7,39 +7,57 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
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\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
class ProfilsController extends AbstractController
{
#[Route(path: '/artemis/profils',name: 'artemis_profils',methods: ['GET', 'POST'])]
public function artemis(EntityManagerInterface $entityManager,UserPasswordHasherInterface $userPasswordHasher,RoleHierarchyInterface $hierarchy,Request $request): Response
{
if($request->isMethod('POST')) {
if($request->files->has('avatar_upload')) {
$file = $request->files->get('avatar_upload');
$user = $this->getUser();
#[Route('/artemis/profils', name: 'artemis_profils', methods: ['GET', 'POST'])]
public function artemis(
EntityManagerInterface $entityManager,
UserPasswordHasherInterface $userPasswordHasher,
RoleHierarchyInterface $hierarchy,
Request $request
): Response {
$user = $this->getUser();
if (!$user) {
throw $this->createAccessDeniedException();
}
if ($request->isMethod('POST')) {
// Gestion upload avatar
$file = $request->files->get('avatar_upload');
if ($file !== null) {
$user->setAvatar($file);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash("success","Mise à jour effectuée");
$this->addFlash('success', 'Mise à jour effectuée');
return $this->redirectToRoute('artemis_profils');
}
if($request->request->has('new_password') && $request->request->has('confirm_new_password')) {
if($request->request->get('new_password') == $request->request->get('confirm_new_password')) {
$user = $this->getUser();
$user->setPassword($userPasswordHasher->hashPassword($user,$request->request->get('new_password')));
// Gestion changement de mot de passe
$newPassword = $request->request->get('new_password');
$confirmPassword = $request->request->get('confirm_new_password');
if ($newPassword && $confirmPassword) {
if ($newPassword === $confirmPassword) {
$hashedPassword = $userPasswordHasher->hashPassword($user, $newPassword);
$user->setPassword($hashedPassword);
$entityManager->persist($user);
$entityManager->flush();
$this->addFlash("success","Mise à jour effectuée");
$this->addFlash('success', 'Mise à jour effectuée');
return $this->redirectToRoute('artemis_profils');
} else {
$this->addFlash('danger', 'Les mots de passe ne correspondent pas.');
}
}
}
return $this->render('artemis/profils.twig',[
'current' => $request->get('current','main'),
'roles' => $hierarchy->getReachableRoleNames($this->getUser()->getRoles()),
]);
return $this->render('artemis/profils.twig', [
'current' => $request->query->get('current', 'main'),
'roles' => $hierarchy->getReachableRoleNames($user->getRoles()),
]);
}
}

View File

@@ -7,7 +7,6 @@ use App\Form\Artemis\Revendeur\RevendeurType;
use App\Service\Revendeur\RevendeurService;
use App\Service\Revendeur\SendLinkEvent;
use Cocur\Slugify\Slugify;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -17,46 +16,80 @@ use Symfony\Component\Routing\Attribute\Route;
class RevendeurController extends AbstractController
{
#[Route(path: '/artemis/revendeur',name: 'artemis_revendeur')]
public function revendeur(EntityManagerInterface $entityManager,Request $request,EventDispatcherInterface $eventDispatcher,RevendeurService $revendeurService): Response
{
if($request->query->has('delete')) {
#[Route('/artemis/revendeur', name: 'artemis_revendeur')]
public function revendeur(
EntityManagerInterface $entityManager,
Request $request,
EventDispatcherInterface $eventDispatcher,
RevendeurService $revendeurService
): Response {
if ($request->query->has('delete')) {
$revendeur = $revendeurService->get($request->query->get('id'));
$entityManager->remove($revendeur);
$entityManager->flush();
$this->addFlash("success","Revendeur supprimer");
return $this->redirectToRoute('artemis_revendeur');
}
if($request->query->has('sendLink')) {
$revendeur = $revendeurService->get($request->query->get('id'));
$eventSendLink = new SendLinkEvent($revendeur);
$eventDispatcher->dispatch($eventSendLink);
$this->addFlash("success","Le lien à été envoyée");
if ($revendeur instanceof Revendeur) {
$entityManager->remove($revendeur);
$entityManager->flush();
$this->addFlash('success', 'Revendeur supprimé avec succès.');
} else {
$this->addFlash('error', 'Revendeur introuvable.');
}
return $this->redirectToRoute('artemis_revendeur');
}
return $this->render('artemis/revendeur/revendeur.twig', [
if ($request->query->has('sendLink')) {
$revendeur = $revendeurService->get($request->query->get('id'));
if ($revendeur instanceof Revendeur) {
$eventSendLink = new SendLinkEvent($revendeur);
$eventDispatcher->dispatch($eventSendLink);
$this->addFlash('success', 'Le lien a été envoyé.');
} else {
$this->addFlash('error', 'Revendeur introuvable.');
}
return $this->redirectToRoute('artemis_revendeur');
}
return $this->render('artemis/revendeur/revendeur.twig', [
'revendeurLists' => $revendeurService->list(),
]);
}
#[Route(path: '/artemis/revendeur/{id}',name: 'artemis_revendeur_view')]
public function revendeurVideo(EntityManagerInterface $entityManager,Request $request,EventDispatcherInterface $eventDispatcher,RevendeurService $revendeurService): Response
{
#[Route('/artemis/revendeur/{id}', name: 'artemis_revendeur_view')]
public function revendeurVideo(
EntityManagerInterface $entityManager,
Request $request,
EventDispatcherInterface $eventDispatcher,
RevendeurService $revendeurService,
?Revendeur $revendeur
): Response {
if (!$revendeur) {
$this->addFlash('error', 'Revendeur introuvable.');
return $this->redirectToRoute('artemis_revendeur');
}
// Votre logique ici (affichage, modification, etc.)
return $this->render('artemis/revendeur/revendeur_view.twig', [
'revendeur' => $revendeur,
]);
}
#[Route(path: '/artemis/revendeur/add',name: 'artemis_revendeur_add')]
public function revendeurAdd(Request $request,RevendeurService $revendeurService): Response
{
$r = new Revendeur();
$form = $this->createForm(RevendeurType::class,$r);
#[Route('/artemis/revendeur/add', name: 'artemis_revendeur_add')]
public function revendeurAdd(
Request $request,
RevendeurService $revendeurService
): Response {
$revendeur = new Revendeur();
$form = $this->createForm(RevendeurType::class, $revendeur);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$slugify = new Slugify();
$r->setCode($slugify->slugify($r->getRaisonSocial()));
$revendeurService->create($r);
$revendeur->setCode($slugify->slugify($revendeur->getRaisonSocial()));
$revendeurService->create($revendeur);
$this->addFlash('success', 'Revendeur créé avec succès.');
return $this->redirectToRoute('artemis_revendeur');
}
return $this->render('artemis/revendeur/revendeur_add.twig', [
return $this->render('artemis/revendeur/revendeur_add.twig', [
'form' => $form->createView(),
]);
}

View File

@@ -12,7 +12,6 @@ use App\Repository\AccountRepository;
use App\Service\Generator\TempPasswordGenerator;
use App\Service\Logger\LoggerService;
use App\Service\Mailer\Event\CreatedAdminEvent;
use AWS\CRT\Log;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
@@ -25,115 +24,141 @@ use Symfony\Component\Uid\Uuid;
class AccountController extends AbstractController
{
#[Route(path: '/artemis/settings/accountAdmin',name: 'artemis_settings_accountAdmin',methods: ['GET', 'POST'])]
public function accountAdmin(LoggerService $loggerService,AccountRepository $accountRepository,AccountLoginRegisterRepository $accountLoginRegisterRepository): Response
{
#[Route('/artemis/settings/accountAdmin', name: 'artemis_settings_accountAdmin', methods: ['GET', 'POST'])]
public function accountAdmin(
LoggerService $loggerService,
AccountRepository $accountRepository,
AccountLoginRegisterRepository $accountLoginRegisterRepository
): Response {
$admins = [];
foreach ($accountRepository->findAll() as $account) {
if(in_array("ROLE_ADMIN",$account->getRoles()) || in_array("ROLE_ROOT",$account->getRoles())) {
if (in_array('ROLE_ADMIN', $account->getRoles(), true) || in_array('ROLE_ROOT', $account->getRoles(), true)) {
$lastLogin = $accountLoginRegisterRepository->lastLogin($account);
if($lastLogin instanceof AccountLoginRegister) {
$account->lastLoginAt = $lastLogin[0];
if ($lastLogin instanceof AccountLoginRegister || (is_array($lastLogin) && isset($lastLogin[0]))) {
$account->lastLoginAt = is_array($lastLogin) ? $lastLogin[0] : $lastLogin;
}
$admins[] = $account;
}
}
$loggerService->log("ACCESS","Affichage list administrateur",$this->getUser());
return $this->render('artemis/settings/account/admin.twig',[
$loggerService->log('ACCESS', 'Affichage liste administrateur', $this->getUser());
return $this->render('artemis/settings/account/admin.twig', [
'admins' => $admins,
]);
}
#[Route(path: '/artemis/settings/accountAdmin/add',name: 'artemis_settings_accountAdmin_add',methods: ['GET', 'POST'])]
public function accountAdminAdd(LoggerService $loggerService,EntityManagerInterface $entityManager,EventDispatcherInterface $eventDispatcher,Request $request,AccountRepository $accountRepository,UserPasswordHasherInterface $userPasswordHasher): Response
{
#[Route('/artemis/settings/accountAdmin/add', name: 'artemis_settings_accountAdmin_add', methods: ['GET', 'POST'])]
public function accountAdminAdd(
LoggerService $loggerService,
EntityManagerInterface $entityManager,
EventDispatcherInterface $eventDispatcher,
Request $request,
AccountRepository $accountRepository,
UserPasswordHasherInterface $userPasswordHasher
): Response {
$account = new Account();
$form = $this->createForm(NewAdminType::class,$account);
$form = $this->createForm(NewAdminType::class, $account);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isSubmitted()) {
$accountExit = $accountRepository->findOneBy(['username'=>$account->getUsername()]);
if($accountExit instanceof Account) {
$this->addFlash("error","Nom utilisateur déja utilisée");
return $this->redirectToRoute('artemis_settings_accountAdmin_add');
}
$email = $account->getEmail();
if(!str_contains($email,"@siteconseil.fr")){
$this->addFlash("error","L'adresse email doit etre une email siteconseil.fr");
if ($form->isSubmitted() && $form->isValid()) {
$existingAccount = $accountRepository->findOneBy(['username' => $account->getUsername()]);
if ($existingAccount) {
$this->addFlash('error', "Nom d'utilisateur déjà utilisé.");
return $this->redirectToRoute('artemis_settings_accountAdmin_add');
}
$accountExitEmail = $accountRepository->findOneBy(['email'=>$account->getEmail()]);
if($accountExitEmail instanceof Account) {
$this->addFlash("error","Email déja utilisée");
$email = $account->getEmail();
if (str_contains($email, '@siteconseil.fr') === false) {
$this->addFlash('error', "L'adresse email doit être une adresse siteconseil.fr");
return $this->redirectToRoute('artemis_settings_accountAdmin_add');
}
$existingEmail = $accountRepository->findOneBy(['email' => $email]);
if ($existingEmail) {
$this->addFlash('error', "Email déjà utilisé.");
return $this->redirectToRoute('artemis_settings_accountAdmin_add');
}
$password = TempPasswordGenerator::generate();
$account->setIsActif(true);
$account->setRoles(['ROLE_ADMIN']);
$account->setUuid(Uuid::v4());
$account->setPassword($userPasswordHasher->hashPassword($account,$password));
$account->setPassword($userPasswordHasher->hashPassword($account, $password));
$account->setIsFirstLogin(true);
$account->setUpdateAt(new \DateTimeImmutable());
$entityManager->persist($account);
$entityManager->flush();
$event = new CreatedAdminEvent($account,$password);
$event = new CreatedAdminEvent($account, $password);
$eventDispatcher->dispatch($event);
$loggerService->log("CREATE","Création d'un compte administrateur - ".$account->getUsername()." - ".$account->getEmail(),$this->getUser());
$this->addFlash("error","Création du compte effectuée");
$loggerService->log('CREATE', "Création d'un compte administrateur - " . $account->getUsername() . " - " . $account->getEmail(), $this->getUser());
$this->addFlash('success', "Création du compte effectuée");
return $this->redirectToRoute('artemis_settings_accountAdmin');
}
return $this->render('artemis/settings/account/add.twig',[
'form' => $form->createView()
return $this->render('artemis/settings/account/add.twig', [
'form' => $form->createView(),
]);
}
#[Route(path: '/artemis/settings/accountAdmin/{id}',name: 'artemis_settings_accountAdmin_view',methods: ['GET', 'POST'])]
public function accountAdminView(PaginatorInterface $paginator,LoggerService $loggerService,?Account $account,UserPasswordHasherInterface $userPasswordHasher,EntityManagerInterface $entityManager,Request $request,AccountLoginRegisterRepository $accountLoginRegisterRepository): Response
{
if(!$account instanceof Account)
#[Route('/artemis/settings/accountAdmin/{id}', name: 'artemis_settings_accountAdmin_view', methods: ['GET', 'POST'])]
public function accountAdminView(
PaginatorInterface $paginator,
LoggerService $loggerService,
?Account $account,
UserPasswordHasherInterface $userPasswordHasher,
EntityManagerInterface $entityManager,
Request $request,
AccountLoginRegisterRepository $accountLoginRegisterRepository
): Response {
if (!$account instanceof Account) {
return $this->redirectToRoute('artemis_settings_accountAdmin');
}
$current = $request->get('type','main');
$loggerService->log("ACCESS","Affichage Compte Administrateur - ".$account->getUsername()." - ".$current,$this->getUser());
$current = $request->query->get('type', 'main');
$loggerService->log('ACCESS', "Affichage Compte Administrateur - " . $account->getUsername() . " - " . $current, $this->getUser());
$form = $this->createForm(AdminFormType::class,$account);
$form = $this->createForm(AdminFormType::class, $account);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($account);
$entityManager->flush();
$this->addFlash("success","Mise à jour effectuée");
$loggerService->log("UPDATE","Mise à jour du compte Administrateur - ".$account->getUsername(),$this->getUser());
$this->addFlash('success', 'Mise à jour effectuée');
$loggerService->log('UPDATE', "Mise à jour du compte Administrateur - " . $account->getUsername(), $this->getUser());
return $this->redirectToRoute('artemis_settings_accountAdmin_view',['id'=>$account->getId()]);
return $this->redirectToRoute('artemis_settings_accountAdmin_view', ['id' => $account->getId()]);
}
$lastLogin = $accountLoginRegisterRepository->lastLogin($account);
$account->lastLoginAt = $lastLogin[0] ?? new AccountLoginRegister();
$account->lastLoginAt = $lastLogin[0] ?? null;
$formPassword = $this->createForm(AdminPasswordType::class);
$formPassword->handleRequest($request);
if($formPassword->isSubmitted() && $formPassword->isValid()) {
if ($formPassword->isSubmitted() && $formPassword->isValid()) {
$password = $formPassword->get('password')->getData();
$account->setPassword($userPasswordHasher->hashPassword($account,$password));
$account->setPassword($userPasswordHasher->hashPassword($account, $password));
$entityManager->persist($account);
$entityManager->flush();
$this->addFlash("success","Mise à jour effectuée");
$loggerService->log("UPDATE","Mise à jour du mot de passe du compte Administrateur - ".$account->getUsername(),$this->getUser());
return $this->redirectToRoute('artemis_settings_accountAdmin_view',['id'=>$account->getId()]);
$this->addFlash('success', 'Mise à jour effectuée');
$loggerService->log('UPDATE', "Mise à jour du mot de passe du compte Administrateur - " . $account->getUsername(), $this->getUser());
return $this->redirectToRoute('artemis_settings_accountAdmin_view', ['id' => $account->getId()]);
}
$logs = $loggerService->load($account);
$logs = $loggerService->load($account);
return $this->render('artemis/settings/account/view.twig',[
return $this->render('artemis/settings/account/view.twig', [
'account' => $account,
'formAccount' => $form->createView(),
'formPassword' => $formPassword->createView(),
'current' => $current,
'logs' => $accountLoginRegisterRepository->findBy(['account'=>$account],['id'=>'asc']),
'actions' => $paginator->paginate($logs,$request->get('page',1),20)
'logs' => $accountLoginRegisterRepository->findBy(['account' => $account], ['id' => 'asc']),
'actions' => $paginator->paginate($logs, $request->query->getInt('page', 1), 20),
]);
}
}