<?php
namespace App\Repository;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* @method User|null find($id, $lockMode = null, $lockVersion = null)
* @method User|null findOneBy(array $criteria, array $orderBy = null)
* @method User[] findAll()
* @method User[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class UserRepository extends ServiceEntityRepository implements PasswordUpgraderInterface
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, User::class);
}
/**
* Used to upgrade (rehash) the user's password automatically over time.
*/
public function upgradePassword(UserInterface $user, string $newEncodedPassword): void
{
if (!$user instanceof User) {
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', \get_class($user)));
}
$user->setPassword($newEncodedPassword);
$this->_em->persist($user);
$this->_em->flush();
}
public function findByRole(string $role)
{
$roleQuery = "'%".$role."%'";
return $this
->createQueryBuilder('qb')
->where('qb.roles LIKE '.$roleQuery)
->getQuery()
->getResult()
;
}
public function findActiveUsersByRole(string $role)
{
$roleQuery = "'%".$role."%'";
return $this
->createQueryBuilder('qb')
->where('qb.roles LIKE '.$roleQuery)
->andWhere('qb.status = 1')
->getQuery()
->getResult()
;
}
public function findAllBySearchParams(array $searchParams, array $paginationParams)
{
$results = [];
$qb = $this->createQueryBuilder('qb');
// User Id filter
if (array_key_exists('userId', $searchParams)) {
$qb->andWhere('qb.id = '.$searchParams['userId']);
}
// Name filter
if (array_key_exists('term', $searchParams)) {
$termQuery = "'%".$searchParams['term']."%'";
$qb
->andWhere('qb.firstname LIKE '.$termQuery)
->orWhere('qb.lastname LIKE '.$termQuery)
;
}
// Roles[] filter
if (array_key_exists('roles', $searchParams)) {
foreach ($searchParams['roles'] as $key => $role) {
$roleQuery = "'%".$role."%'";
if (0 === $key) {
$qb->andWhere('qb.roles LIKE '.$roleQuery);
} else {
$qb->orWhere('qb.roles LIKE '.$roleQuery);
}
}
}
// Status[] filter
if (array_key_exists('status', $searchParams)) {
foreach ($searchParams['status'] as $key => $status) {
if (0 === $key) {
$qb->andWhere('qb.status = '.$status);
} else {
$qb->orWhere('qb.status = '.$status);
}
}
}
$pageCount = count($qb->getQuery()->getScalarResult()) / $paginationParams['perPage'];
$results['pageCount'] = $pageCount > (int) $pageCount ? round((int) $pageCount + 1, 0, PHP_ROUND_HALF_DOWN) : ($pageCount);
$qb
->addOrderBy('qb.status', 'DESC')
->addOrderBy('qb.lastname', 'ASC')
->setFirstResult($paginationParams['offset'])
->setMaxResults($paginationParams['perPage'])
;
$results['data'] = $qb->getQuery()->getResult();
return $results;
}
}