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");
$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,
]);
}

View File

@ -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<User>
@ -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);
}
}