From 7b7f58363ae44cc7a5048613316668347fc51c07 Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 27 Aug 2025 16:49:16 +0200 Subject: [PATCH] Deactivate user --- src/Controller/UserController.php | 31 +++++++++++++++++++--- src/Service/UserOrganizationAppService.php | 25 +++++++++++++++++ src/Service/UserOrganizationService.php | 30 ++++++++++++++------- src/Service/UserService.php | 11 ++++---- templates/user/show.html.twig | 2 +- 5 files changed, 79 insertions(+), 20 deletions(-) diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index e0dd0b8..67dd19c 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -28,7 +28,7 @@ class UserController extends AbstractController public function __construct( private readonly EntityManagerInterface $entityManager, private readonly UserService $userService, - private readonly ActionService $actionService, private readonly UserOrganizationAppService $userOrganizationAppService, + private readonly ActionService $actionService, private readonly UserOrganizationAppService $userOrganizationAppService, private readonly UserOrganizationService $userOrganizationService, ) { } @@ -91,7 +91,7 @@ class UserController extends AbstractController } $uoa = $this->entityManager->getRepository(UserOrganizatonApp::class)->findBy(['userOrganization' => $uo, 'isActive' => true]); $uoa = $this->userOrganizationAppService->groupUserOrganizationAppsByApplication($uoa); - $this->actionService->createAction("View user information", $user, null, $user->getUserIdentifier()); + $this->actionService->createAction("View user information", $actingUser, null, $user->getUserIdentifier()); } catch (\Exception $e) { //ignore } @@ -130,7 +130,7 @@ class UserController extends AbstractController $user->setModifiedAt(new \DateTimeImmutable('now')); $this->entityManager->persist($user); $this->entityManager->flush(); - $this->actionService->createAction("Edit user information", $user, null, $user->getUserIdentifier()); + $this->actionService->createAction("Edit user information", $actingUser, null, $user->getUserIdentifier()); return $this->redirectToRoute('user_show', ['id' => $user->getId()]); } @@ -173,7 +173,7 @@ class UserController extends AbstractController } } else{ - $this->actionService->createAction("Create new user", $user, null, $user->getUserIdentifier()); + $this->actionService->createAction("Create new user", $actingUser, null, $user->getUserIdentifier()); } $this->entityManager->flush(); @@ -188,4 +188,27 @@ class UserController extends AbstractController } throw $this->createAccessDeniedException(self::ACCESS_DENIED); } + + #[Route('/deactivate/{id}', name: 'deactivate', methods: ['GET', 'POST'])] + public function deactivate(int $id): Response + { + $this->denyAccessUnlessGranted('ROLE_ADMIN'); + $actingUser = $this->userService->getUserByIdentifier($this->getUser()->getUserIdentifier()); + if ($this->userService->hasAccessTo($actingUser, true)) { + $user = $this->entityManager->getRepository(User::class)->find($id); + if (!$user) { + throw $this->createNotFoundException(self::NOT_FOUND); + } + $user->setIsActive(false); + $user->setModifiedAt(new \DateTimeImmutable('now')); + $this->userOrganizationService->deactivateAllUserOrganizationLinks($user, $actingUser); + $this->entityManager->persist($user); + $this->entityManager->flush(); + $this->actionService->createAction("Deactivate user", $actingUser, null, $user->getUserIdentifier()); + + return $this->redirectToRoute('user_index'); + } + + throw $this->createAccessDeniedException(self::ACCESS_DENIED); + } } diff --git a/src/Service/UserOrganizationAppService.php b/src/Service/UserOrganizationAppService.php index 8f8ac23..2023b05 100644 --- a/src/Service/UserOrganizationAppService.php +++ b/src/Service/UserOrganizationAppService.php @@ -3,10 +3,19 @@ namespace App\Service; use App\Entity\UserOrganizatonApp; +use App\Entity\UsersOrganizations; +use App\Service\ActionService; +use Doctrine\ORM\EntityManagerInterface; class UserOrganizationAppService { + public function __construct(private readonly EntityManagerInterface $entityManager, private readonly ActionService $actionService) + { + } + /** + * Groups UserOrganizationApp entities by their associated Application. + * * @param UserOrganizatonApp[] $userOrgApps * @return array */ @@ -37,4 +46,20 @@ class UserOrganizationAppService return array_values($grouped); } + /** + * Deactivates all the UserOrganizationApp entities for a given UserOrganization. + * + * @param UsersOrganizations $userOrganization + * @return void + */ + public function deactivateAllUserOrganizationsAppLinks(UsersOrganizations $userOrganization): void + { + $uoas = $this->entityManager->getRepository(UserOrganizatonApp::class)->findBy(['userOrganization' => $userOrganization, 'isActive' => true]); + foreach ($uoas as $uoa) { + $uoa->setIsActive(false); + $this->actionService->createAction("Deactivate UOA link", $userOrganization->getUsers(), + $userOrganization->getOrganization(), "App: " . $uoa->getApplication()->getName() . ", Role: " . $uoa->getRole()->getName()); + $this->entityManager->persist($uoa); + } + } } diff --git a/src/Service/UserOrganizationService.php b/src/Service/UserOrganizationService.php index 7900c31..9fcbe10 100644 --- a/src/Service/UserOrganizationService.php +++ b/src/Service/UserOrganizationService.php @@ -3,15 +3,11 @@ namespace App\Service; use App\Entity\Actions; -use App\Entity\Apps; -use App\Entity\Organizations; -use App\Entity\Roles; use App\Entity\User; -use App\Service\ActionService; -use App\Service\UserService; use App\Entity\UsersOrganizations; +use App\Service\ActionService; +use \App\Service\UserOrganizationAppService; use Doctrine\ORM\EntityManagerInterface; -use Symfony\Bundle\SecurityBundle\Security; /** * Service pour la gestion des organisations d'utilisateurs. @@ -21,12 +17,26 @@ readonly class UserOrganizationService { public function __construct( - private EntityManagerInterface $entityManager, - private UserService $userService, - private ActionService $actionService, - private Security $security + private userOrganizationAppService $userOrganizationAppService, private EntityManagerInterface $entityManager, private ActionService $actionService, ) { } + /** + * Deactive all user organization links. + * + * @param User $user + * @param User $actingUser + * @return void + */ + public function deactivateAllUserOrganizationLinks(User $user, User $actingUser): void{ + $uos = $this->entityManager->getRepository(UsersOrganizations::class)->findBy(['users' => $user, 'isActive' => true]); + foreach ($uos as $uo) { + $this->userOrganizationAppService->deactivateAllUserOrganizationsAppLinks($uo); + $uo->setIsActive(false); + $this->entityManager->persist($uo); + $this->actionService->createAction("Deactivate UO link", $actingUser, $uo->getOrganization(), $uo->getOrganization()->getName() ); + } + } + } diff --git a/src/Service/UserService.php b/src/Service/UserService.php index 4e5b427..913cc1a 100644 --- a/src/Service/UserService.php +++ b/src/Service/UserService.php @@ -79,15 +79,16 @@ class UserService * Check if the user have the rights to access the page * * @param User $user + * @param bool $skipSelfCheck * @return bool * @throws Exception */ - public function hasAccessTo(User $user): bool + public function hasAccessTo(User $user, bool $skipSelfCheck = false): bool { - if ($user->getUserIdentifier() === $this->security->getUser()->getUserIdentifier()) { + if (!$skipSelfCheck && $user->getUserIdentifier() === $this->security->getUser()->getUserIdentifier()) { return true; } - $userOrganization = $this->entityManager->getRepository(UserOrganizatonApp::class)->findBy(['user' => $user]); + $userOrganization = $this->entityManager->getRepository(UsersOrganizations::class)->findBy(['users' => $user]); if ($userOrganization) { foreach ($userOrganization as $uo) { if ($this->isAdminOfOrganization($uo)) { @@ -115,8 +116,8 @@ class UserService public function isAdminOfOrganization(UsersOrganizations $usersOrganizations): bool { $actingUser = $this->getUserByIdentifier($this->security->getUser()->getUserIdentifier()); - $uo = $this->entityManager->getRepository(UsersOrganizations::class)->findOneBy(['user' => $actingUser]); - $roleAdmin = $this->entityManager->getRepository(Roles::class)->findOneBy(['role' => 'ADMIN']); + $uo = $this->entityManager->getRepository(UsersOrganizations::class)->findOneBy(['users' => $actingUser]); + $roleAdmin = $this->entityManager->getRepository(Roles::class)->findOneBy(['name' => 'ADMIN']); if ($uo) { $uoa = $this->entityManager->getRepository(UserOrganizatonApp::class)->findOneBy(['userOrganization' => $uo, 'role' => $roleAdmin, diff --git a/templates/user/show.html.twig b/templates/user/show.html.twig index 292833b..906e047 100644 --- a/templates/user/show.html.twig +++ b/templates/user/show.html.twig @@ -6,7 +6,7 @@ {% if is_granted("ROLE_ADMIN") %}

Gestion Utilisateur

- {# Désactiver #} + Désactiver
{% endif %} {% include 'user/userInformation.html.twig' %}