moved logic to repository

This commit is contained in:
Charles 2026-02-11 12:01:42 +01:00
parent 8587798619
commit 6a286bff0a
2 changed files with 32 additions and 47 deletions

View File

@ -519,40 +519,14 @@ class UserController extends AbstractController
{ {
$this->denyAccessUnlessGranted("ROLE_ADMIN"); $this->denyAccessUnlessGranted("ROLE_ADMIN");
$page = max(1, (int)$request->query->get('page', 1)); $page = max(1, $request->query->getInt('page', 1));
$size = max(1, (int)$request->query->get('size', 10)); $size = max(1, $request->query->getInt('size', 10));
// Get filter parameters
$filters = $request->query->all('filter', []); $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) { $data = array_map(function (User $user) {
return [ return [
'id' => $user->getId(), 'id' => $user->getId(),
@ -564,12 +538,11 @@ class UserController extends AbstractController
'showUrl' => $this->generateUrl('user_show', ['id' => $user->getId()]), 'showUrl' => $this->generateUrl('user_show', ['id' => $user->getId()]),
'statut' => $user->isActive(), 'statut' => $user->isActive(),
]; ];
}, $rows); }, iterator_to_array($paginator));
$lastPage = (int)ceil($total / $size);
return $this->json([ return $this->json([
'data' => $data, 'data' => $data,
'last_page' => $lastPage, 'last_page' => (int)ceil($total / $size),
'total' => $total, 'total' => $total,
]); ]);
} }

View File

@ -4,11 +4,11 @@ namespace App\Repository;
use App\Entity\User; use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException; use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface; use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
use App\Entity\UsersOrganizations;
/** /**
* @extends ServiceEntityRepository<User> * @extends ServiceEntityRepository<User>
@ -35,21 +35,33 @@ class UserRepository extends ServiceEntityRepository implements PasswordUpgrader
} }
/** /**
* Returns active users that are NOT in any UsersOrganizations mapping. * @param int $page
* Returns User entities. * @param int $size
* * @param array $filters
* @return User[] * @return Paginator
*/ */
public function findUsersWithoutOrganization(): array public function findActiveUsersForTabulator(int $page, int $size, array $filters = []): Paginator
{ {
$qb = $this->createQueryBuilder('u') $qb = $this->createQueryBuilder('u')
->select('u') ->where('u.isDeleted = :del')
->leftJoin(UsersOrganizations::class, 'uo', 'WITH', 'uo.users = u') ->setParameter('del', false);
->andWhere('u.isDeleted = :uDeleted')
->andWhere('uo.id IS NULL')
->orderBy('u.surname', 'ASC')
->setParameter('uDeleted', 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);
} }
} }