<?php
namespace App\Repository;
use App\Entity\User;
use App\Model\UserFilter;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr;
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)
*
* @extends ServiceEntityRepository<User>
*/
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();
}
/**
* @return array<User>|null
*/
public function findByFilter(UserFilter $filter): ?array
{
$queryBuilder = $this->createQueryBuilder('user');
if (null !== $filter->getShift()) {
$queryBuilder->andWhere('user.shift = :shift')->setParameter(':shift', $filter->getShift());
}
if (null !== $filter->getDepartment()) {
$queryBuilder->andWhere('user.department = :department')->setParameter(':department', $filter->getDepartment());
}
if (count($filter->getCountries()) > 0) {
$queryBuilder->innerJoin('user.countries', 'countries', Expr\Join::WITH)
->andWhere('countries in (:c)')
->setParameter(':c', $filter->getCountries());
}
$roles = $filter->getRoles();
if (count($roles) > 0) {
foreach ($roles as $role) {
$queryBuilder->andWhere("JSONB_CONTAINS(user.roles, '[\"$role\"]') = true");
}
}
return $queryBuilder->getQuery()->getResult();
}
}