src/Repository/User/UserRepository.php line 78

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Repository\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Doctrine\ORM\EntityRepository;
  6. use Doctrine\ORM\Mapping\ClassMetadata;
  7. use Doctrine\ORM\NonUniqueResultException;
  8. use Doctrine\ORM\Query\Expr\Join;
  9. use Slivki\Entity\Director;
  10. use Slivki\Entity\MobileUserToken;
  11. use Slivki\Entity\User;
  12. use Slivki\Entity\User\Employee;
  13. use Slivki\Exception\UserNotFoundException;
  14. use function mb_strtolower;
  15. final class UserRepository extends EntityRepository implements UserRepositoryInterface
  16. {
  17.     public function __construct(EntityManagerInterface $entityManager)
  18.     {
  19.         parent::__construct($entityManager, new ClassMetadata(User::class));
  20.     }
  21.     public function save(User $user): void
  22.     {
  23.         $this->_em->persist($user);
  24.         $this->_em->flush($user);
  25.     }
  26.     public function getById(int $id): User
  27.     {
  28.         $qb $this->createQueryBuilder('u');
  29.         $expr $qb->expr();
  30.         $user $qb
  31.             ->andWhere($expr->eq('u.ID'':id'))
  32.             ->setParameter('id'$id)
  33.             ->getQuery()
  34.             ->getOneOrNullResult();
  35.         if (!$user instanceof User) {
  36.             throw UserNotFoundException::missingId($id);
  37.         }
  38.         return $user;
  39.     }
  40.     public function findByToken(string $token): ?User
  41.     {
  42.         $qb $this->createQueryBuilder('user');
  43.         $expr $qb->expr();
  44.         return $qb
  45.             ->andWhere($expr->eq('user.token'':token'))
  46.             ->setParameter('token'$token)
  47.             ->getQuery()
  48.             ->getOneOrNullResult();
  49.     }
  50.     public function findByMobileToken(string $token): ?User
  51.     {
  52.         $qb $this->createQueryBuilder('user');
  53.         $expr $qb->expr();
  54.         return $qb
  55.             ->innerJoin(
  56.                 MobileUserToken::class,
  57.                 'mobileUserToken',
  58.                 Join::WITH,
  59.                 $expr->eq('user''mobileUserToken.user'),
  60.             )
  61.             ->andWhere($expr->eq('mobileUserToken.token'':token'))
  62.             ->setParameter('token'$token)
  63.             ->getQuery()
  64.             ->getOneOrNullResult();
  65.     }
  66.     /**
  67.      * @throws NonUniqueResultException
  68.      */
  69.     public function findByPhoneNumber(string $phoneNumber): ?User
  70.     {
  71.         $qb $this->createQueryBuilder('user');
  72.         $expr $qb->expr();
  73.         return $qb
  74.             ->innerJoin('user.phones''userPhone')
  75.             ->andWhere($expr->eq('userPhone.confirmed'':confirmed'))
  76.             ->andWhere($expr->eq('userPhone.phoneNumber'':phoneNumber'))
  77.             ->setParameter('confirmed'true)
  78.             ->setParameter('phoneNumber'$phoneNumber)
  79.             ->getQuery()
  80.             ->getOneOrNullResult();
  81.     }
  82.     public function getByEmail(string $email): User
  83.     {
  84.         $qb $this->createQueryBuilder('u');
  85.         $expr $qb->expr();
  86.         $user $qb
  87.             ->andWhere($expr->eq($expr->lower('u.email'), ':email'))
  88.             ->setParameter('email'mb_strtolower($email))
  89.             ->getQuery()
  90.             ->getOneOrNullResult();
  91.         if (!$user instanceof User) {
  92.             throw UserNotFoundException::missingByEmail($email);
  93.         }
  94.         return $user;
  95.     }
  96.     public function findDirectorUserByEmployeeUserId(int $userId): ?User
  97.     {
  98.         $qb $this->createQueryBuilder('user');
  99.         $expr $qb->expr();
  100.         return $qb
  101.             ->innerJoin(Director::class, 'director'Join::WITH$expr->eq('director.email''user.email'))
  102.             ->innerJoin(Employee::class, 'employee'Join::WITH$expr->eq('employee.company''director'))
  103.             ->andWhere($expr->eq('employee.user'':userId'))
  104.             ->setParameter('userId'$userId)
  105.             ->getQuery()
  106.             ->getOneOrNullResult();
  107.     }
  108. }