From 6a286bff0a14aa2790a10986c8822cb701b60c2e Mon Sep 17 00:00:00 2001 From: Charles Date: Wed, 11 Feb 2026 12:01:42 +0100 Subject: [PATCH] moved logic to repository --- src/Controller/UserController.php | 41 ++++++------------------------- src/Repository/UserRepository.php | 38 ++++++++++++++++++---------- 2 files changed, 32 insertions(+), 47 deletions(-) diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index ce4cd64..f6bc9be 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -519,40 +519,14 @@ class UserController extends AbstractController { $this->denyAccessUnlessGranted("ROLE_ADMIN"); - $page = max(1, (int)$request->query->get('page', 1)); - $size = max(1, (int)$request->query->get('size', 10)); - - // Get filter parameters + $page = max(1, $request->query->getInt('page', 1)); + $size = max(1, $request->query->getInt('size', 10)); $filters = $request->query->all('filter', []); - $repo = $this->userRepository; + // Call the repository + $paginator = $this->userRepository->findActiveUsersForTabulator($page, $size, $filters); + $total = count($paginator); - // Base query - $qb = $repo->createQueryBuilder('u') - ->where('u.isDeleted = :del')->setParameter('del', false); - - // Apply filters - if (!empty($filters['name'])) { - $qb->andWhere('u.surname LIKE :name') - ->setParameter('name', '%' . $filters['name'] . '%'); - } - if (!empty($filters['prenom'])) { - $qb->andWhere('u.name LIKE :prenom') - ->setParameter('prenom', '%' . $filters['prenom'] . '%'); - } - if (!empty($filters['email'])) { - $qb->andWhere('u.email LIKE :email') - ->setParameter('email', '%' . $filters['email'] . '%'); - } - - $countQb = clone $qb; - $total = (int)$countQb->select('COUNT(u.id)')->getQuery()->getSingleScalarResult(); - - // Pagination - $offset = ($page - 1) * $size; - $rows = $qb->setFirstResult($offset)->setMaxResults($size)->getQuery()->getResult(); - - // Map to array $data = array_map(function (User $user) { return [ 'id' => $user->getId(), @@ -564,12 +538,11 @@ class UserController extends AbstractController 'showUrl' => $this->generateUrl('user_show', ['id' => $user->getId()]), 'statut' => $user->isActive(), ]; - }, $rows); - $lastPage = (int)ceil($total / $size); + }, iterator_to_array($paginator)); return $this->json([ 'data' => $data, - 'last_page' => $lastPage, + 'last_page' => (int)ceil($total / $size), 'total' => $total, ]); } diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index 0af98d0..9cb0b71 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -4,11 +4,11 @@ namespace App\Repository; use App\Entity\User; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; +use Doctrine\ORM\Tools\Pagination\Paginator; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\PasswordUpgraderInterface; -use App\Entity\UsersOrganizations; /** * @extends ServiceEntityRepository @@ -35,21 +35,33 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader } /** - * Returns active users that are NOT in any UsersOrganizations mapping. - * Returns User entities. - * - * @return User[] + * @param int $page + * @param int $size + * @param array $filters + * @return Paginator */ - public function findUsersWithoutOrganization(): array + public function findActiveUsersForTabulator(int $page, int $size, array $filters = []): Paginator { $qb = $this->createQueryBuilder('u') - ->select('u') - ->leftJoin(UsersOrganizations::class, 'uo', 'WITH', 'uo.users = u') - ->andWhere('u.isDeleted = :uDeleted') - ->andWhere('uo.id IS NULL') - ->orderBy('u.surname', 'ASC') - ->setParameter('uDeleted', false); + ->where('u.isDeleted = :del') + ->setParameter('del', false); - return $qb->getQuery()->getResult(); + if (!empty($filters['name'])) { + $qb->andWhere('u.surname LIKE :name') + ->setParameter('name', '%' . $filters['name'] . '%'); + } + if (!empty($filters['prenom'])) { + $qb->andWhere('u.name LIKE :prenom') + ->setParameter('prenom', '%' . $filters['prenom'] . '%'); + } + if (!empty($filters['email'])) { + $qb->andWhere('u.email LIKE :email') + ->setParameter('email', '%' . $filters['email'] . '%'); + } + + $qb->setFirstResult(($page - 1) * $size) + ->setMaxResults($size); + + return new Paginator($qb); } }