refactor: improve MembresController and ProfilController quality

- src/Controller/Admin/MembresController.php: reduce return statements in 'create' and add error logging
- src/Controller/Admin/ProfilController.php: reduce return statements in 'password' and 'update', and fill empty catch blocks with logging
This commit is contained in:
Serreau Jovann
2026-04-01 18:10:35 +02:00
parent fd822b5b7f
commit 466b05bfe2
2 changed files with 91 additions and 97 deletions

View File

@@ -7,6 +7,7 @@ use App\Repository\UserRepository;
use App\Service\KeycloakAdminService;
use App\Service\MailerService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -19,6 +20,11 @@ use Twig\Environment;
#[IsGranted('ROLE_ROOT')]
class MembresController extends AbstractController
{
public function __construct(
private LoggerInterface $logger,
) {
}
#[Route('', name: '')]
public function index(KeycloakAdminService $keycloak, UserRepository $userRepository): Response
{
@@ -43,7 +49,8 @@ class MembresController extends AbstractController
'localUser' => $localUser,
];
}
} catch (\Throwable) {
} catch (\Throwable $e) {
$this->logger->error('Keycloak: Failed to list users: '.$e->getMessage());
$this->addFlash('error', 'Impossible de recuperer la liste des membres depuis Keycloak.');
}
@@ -69,67 +76,59 @@ class MembresController extends AbstractController
if ('' === $firstName || '' === $lastName || '' === $email) {
$this->addFlash('error', 'Veuillez remplir tous les champs.');
return $this->redirectToRoute('app_admin_membres');
}
// Verifier si l'email existe deja en BDD
if (null !== $userRepository->findOneBy(['email' => $email])) {
} elseif (null !== $userRepository->findOneBy(['email' => $email])) {
$this->addFlash('error', 'Un compte existe deja avec cet email.');
} else {
try {
// 1. Creer le user dans Keycloak
$kcResult = $keycloak->createUser($email, $firstName, $lastName);
return $this->redirectToRoute('app_admin_membres');
}
if (!$kcResult['created'] || null === $kcResult['keycloakId']) {
$this->addFlash('error', 'Erreur lors de la creation du compte Keycloak. L\'email existe peut-etre deja.');
} else {
$keycloakId = $kcResult['keycloakId'];
$tempPassword = $kcResult['tempPassword'];
try {
// 1. Creer le user dans Keycloak
$kcResult = $keycloak->createUser($email, $firstName, $lastName);
// 2. Ajouter aux groupes Keycloak
foreach ($groups as $group) {
$keycloak->addUserToGroup($keycloakId, $group);
}
if (!$kcResult['created'] || null === $kcResult['keycloakId']) {
$this->addFlash('error', 'Erreur lors de la creation du compte Keycloak. L\'email existe peut-etre deja.');
// 3. Creer le user en BDD locale
$user = new User();
$user->setEmail($email);
$user->setFirstName($firstName);
$user->setLastName($lastName);
$user->setKeycloakId($keycloakId);
$user->setRoles(\in_array('super_admin_asso', $groups, true) ? ['ROLE_ROOT'] : ['ROLE_EMPLOYE']);
$user->setPassword($passwordHasher->hashPassword($user, $tempPassword));
$user->setTempPassword($tempPassword);
return $this->redirectToRoute('app_admin_membres');
$em->persist($user);
$em->flush();
// 4. Envoyer le mail avec les identifiants
$mailer->sendEmail(
$email,
'CRM Ecosplay - Votre compte a ete cree',
$twig->render('emails/membre_created.html.twig', [
'firstName' => $firstName,
'lastName' => $lastName,
'email' => $email,
'tempPassword' => $tempPassword,
'groups' => $groups,
]),
null,
null,
false,
);
$this->addFlash('success', 'Le membre '.$firstName.' '.$lastName.' a ete cree. Un email avec les identifiants lui a ete envoye.');
}
} catch (\Throwable $e) {
$this->logger->error('Keycloak: Failed to create user '.$email.': '.$e->getMessage());
$this->addFlash('error', 'Erreur lors de la creation : '.$e->getMessage());
}
$keycloakId = $kcResult['keycloakId'];
$tempPassword = $kcResult['tempPassword'];
// 2. Ajouter aux groupes Keycloak
foreach ($groups as $group) {
$keycloak->addUserToGroup($keycloakId, $group);
}
// 3. Creer le user en BDD locale
$user = new User();
$user->setEmail($email);
$user->setFirstName($firstName);
$user->setLastName($lastName);
$user->setKeycloakId($keycloakId);
$user->setRoles(\in_array('super_admin_asso', $groups, true) ? ['ROLE_ROOT'] : ['ROLE_EMPLOYE']);
$user->setPassword($passwordHasher->hashPassword($user, $tempPassword));
$user->setTempPassword($tempPassword);
$em->persist($user);
$em->flush();
// 4. Envoyer le mail avec les identifiants
$mailer->sendEmail(
$email,
'CRM Ecosplay - Votre compte a ete cree',
$twig->render('emails/membre_created.html.twig', [
'firstName' => $firstName,
'lastName' => $lastName,
'email' => $email,
'tempPassword' => $tempPassword,
'groups' => $groups,
]),
null,
null,
false,
);
$this->addFlash('success', 'Le membre '.$firstName.' '.$lastName.' a ete cree. Un email avec les identifiants lui a ete envoye.');
} catch (\Throwable $e) {
$this->addFlash('error', 'Erreur lors de la creation : '.$e->getMessage());
}
return $this->redirectToRoute('app_admin_membres');

View File

@@ -5,6 +5,7 @@ namespace App\Controller\Admin;
use App\Entity\User;
use App\Service\KeycloakAdminService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -16,6 +17,11 @@ use Symfony\Component\Security\Http\Attribute\IsGranted;
#[IsGranted('ROLE_EMPLOYE')]
class ProfilController extends AbstractController
{
public function __construct(
private LoggerInterface $logger,
) {
}
#[Route('', name: '')]
public function index(): Response
{
@@ -38,37 +44,27 @@ class ProfilController extends AbstractController
if (!$passwordHasher->isPasswordValid($user, $currentPassword)) {
$this->addFlash('error', 'Le mot de passe actuel est incorrect.');
return $this->redirectToRoute('app_admin_profil');
}
if (\strlen($newPassword) < 8) {
} elseif (\strlen($newPassword) < 8) {
$this->addFlash('error', 'Le nouveau mot de passe doit contenir au moins 8 caracteres.');
return $this->redirectToRoute('app_admin_profil');
}
if ($newPassword !== $confirmPassword) {
} elseif ($newPassword !== $confirmPassword) {
$this->addFlash('error', 'Les mots de passe ne correspondent pas.');
} else {
// Mettre à jour en BDD
$user->setPassword($passwordHasher->hashPassword($user, $newPassword));
$user->clearTempPassword();
$em->flush();
return $this->redirectToRoute('app_admin_profil');
}
// Mettre à jour en BDD
$user->setPassword($passwordHasher->hashPassword($user, $newPassword));
$user->clearTempPassword();
$em->flush();
// Mettre à jour dans Keycloak si compte lié
if (null !== $user->getKeycloakId()) {
try {
$keycloak->resetPassword($user->getKeycloakId(), $newPassword);
} catch (\Throwable) {
// Best-effort
// Mettre à jour dans Keycloak si compte lié
if (null !== $user->getKeycloakId()) {
try {
$keycloak->resetPassword($user->getKeycloakId(), $newPassword);
} catch (\Throwable $e) {
$this->logger->error('Keycloak: Failed to reset password for user '.$user->getUserIdentifier().': '.$e->getMessage());
}
}
}
$this->addFlash('success', 'Mot de passe modifie avec succes.');
$this->addFlash('success', 'Mot de passe modifie avec succes.');
}
return $this->redirectToRoute('app_admin_profil');
}
@@ -86,24 +82,23 @@ class ProfilController extends AbstractController
if ('' === $firstName || '' === $lastName || '' === $email) {
$this->addFlash('error', 'Tous les champs sont requis.');
} else {
$user->setFirstName($firstName);
$user->setLastName($lastName);
$user->setEmail($email);
$em->flush();
return $this->redirectToRoute('app_admin_profil');
}
$user->setFirstName($firstName);
$user->setLastName($lastName);
$user->setEmail($email);
$em->flush();
// Sync Keycloak
if (null !== $user->getKeycloakId()) {
try {
$keycloak->updateUser($user->getKeycloakId(), $firstName, $lastName, $email);
} catch (\Throwable) {
// Sync Keycloak
if (null !== $user->getKeycloakId()) {
try {
$keycloak->updateUser($user->getKeycloakId(), $firstName, $lastName, $email);
} catch (\Throwable $e) {
$this->logger->error('Keycloak: Failed to update user '.$email.': '.$e->getMessage());
}
}
}
$this->addFlash('success', 'Informations mises a jour.');
$this->addFlash('success', 'Informations mises a jour.');
}
return $this->redirectToRoute('app_admin_profil');
}