src/Repository/Company/UserRepository.php line 39

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Harmonizely\Repository\Company;
  4. use DateTime;
  5. use DateTimeZone;
  6. use Doctrine\Common\Persistence\ManagerRegistry;
  7. use Doctrine\ORM\NonUniqueResultException;
  8. use Doctrine\ORM\OptimisticLockException;
  9. use Doctrine\ORM\ORMException;
  10. use Doctrine\ORM\Query\Expr\Join;
  11. use Harmonizely\Core\ORM\Tools\Contract\IPaginator;
  12. use Harmonizely\Core\ORM\Tools\Paginator;
  13. use Harmonizely\DTO\SuperAdmin\Customer\Request\GetCustomerListRequestDTO;
  14. use Harmonizely\Model\DomainAwareInterface;
  15. use Harmonizely\Model\Organization;
  16. use Harmonizely\Model\User;
  17. use Harmonizely\Model\UserInterface;
  18. use Harmonizely\Repository\Company\Contract\IUserRepository;
  19. use Psr\Log\LoggerInterface;
  20. class UserRepository extends EntityRepository implements IUserRepositoryDomainAwareEntityRepositoryInterface
  21. {
  22.     private LoggerInterface $logger;
  23.     /**
  24.      * UserRepository constructor.
  25.      *
  26.      * @param ManagerRegistry $registry
  27.      * @param LoggerInterface $logger
  28.      */
  29.     public function __construct(
  30.         ManagerRegistry $registry,
  31.         LoggerInterface $logger
  32.     )
  33.     {
  34.         parent::__construct($registryUser::class);
  35.         $this->logger $logger;
  36.     }
  37.     public function findOneEnabledBySlug(string $slug): ?UserInterface
  38.     {
  39. //        $database = $this->getEntityManager()->getConnection()->getDatabase();
  40. //        $this->logger->critical('findOneEnabledBySlug: SLUG = ' . $slug);
  41. //        $this->logger->critical('findOneEnabledBySlug: DATABASE = ' . $database);
  42.         return $this->createQueryBuilder('u')
  43.             ->where('u.slug = :slug')
  44.             ->andWhere('u.enabled = 1')
  45.             ->setParameter('slug'$slug)
  46.             ->getQuery()
  47.             ->getOneOrNullResult();
  48.     }
  49.     /**
  50.      * @param string $slug
  51.      * @return UserInterface|null
  52.      * @throws NonUniqueResultException
  53.      */
  54.     public function findOneBySlug(string $slug): ?UserInterface
  55.     {
  56.         return $this->createQueryBuilder('u')
  57.             ->where('u.slug = :slug')
  58.             ->setParameter('slug'$slug)
  59.             ->getQuery()
  60.             ->getOneOrNullResult();
  61.     }
  62.     /**
  63.      * @param int $id
  64.      * @return UserInterface|null
  65.      * @throws NonUniqueResultException
  66.      */
  67.     public function findOneById(int $id): ?UserInterface
  68.     {
  69.         return $this->createQueryBuilder('u')
  70.             ->where('u.id = :id')
  71.             ->setParameter('id'$id)
  72.             ->getQuery()
  73.             ->getOneOrNullResult();
  74.     }
  75.     /**
  76.      * @param string $verificationCode
  77.      * @param string $confirmationToken
  78.      * @return UserInterface|null
  79.      * @throws NonUniqueResultException
  80.      */
  81.     public function findOneByVerificationCodeAndConfirmationToken(string $verificationCodestring $confirmationToken): ?UserInterface
  82.     {
  83.         return $this->createQueryBuilder('u')
  84.             ->where('u.verificationCode = :verificationCode')
  85.             ->andWhere('u.confirmationToken = :confirmationToken')
  86.             ->setParameters([
  87.                 'verificationCode' => $verificationCode,
  88.                 'confirmationToken' => $confirmationToken
  89.             ])
  90.             ->getQuery()
  91.             ->getOneOrNullResult();
  92.     }
  93.     /**
  94.      * {@inheritdoc}
  95.      */
  96.     public function countUsersBySlug(string $slug): int
  97.     {
  98.         return (int)$this->createQueryBuilder('u')
  99.             ->select('count(u)')
  100.             ->where('u.slug = :slug')
  101.             ->setParameter('slug'$slug)
  102.             ->getQuery()
  103.             ->getSingleScalarResult();
  104.     }
  105.     public function findUsersWithExpiredSubscriptions(): array
  106.     {
  107.         $now = new DateTime('now', new DateTimeZone('UTC'));
  108.         return $this->createQueryBuilder('u')
  109.             ->leftJoin('u.subscription''s')
  110.             ->where('s.expireAt <= :now')
  111.             ->setParameter('now'$now)
  112.             ->getQuery()
  113.             ->getResult();
  114.     }
  115.     public function findOneByDomain(string $domain): ?DomainAwareInterface
  116.     {
  117.         /** @var DomainAwareInterface $object */
  118.         $object $this->findOneBy(['domain' => $domain]);
  119.         return $object;
  120.     }
  121.     /**
  122.      * @param UserInterface $user
  123.      * @return UserInterface
  124.      * @throws ORMException
  125.      * @throws OptimisticLockException
  126.      */
  127.     public function save(UserInterface $user): UserInterface
  128.     {
  129.         $this->_em->persist($user);
  130.         $this->_em->flush();
  131.         return $user;
  132.     }
  133.     /**
  134.      * @param Organization $organization
  135.      * @return array|UserInterface[]
  136.      */
  137.     public function getList(Organization $organization): array
  138.     {
  139.         return $this->createQueryBuilder('u')
  140.             ->innerJoin('u.members''om')
  141.             ->andWhere('om.organization = :organization')
  142.             ->andWhere('u.enabled = 1')
  143.             ->setParameter('organization'$organization)
  144.             ->getQuery()
  145.             ->getResult();
  146.     }
  147.     /**
  148.      * @param string $email
  149.      * @return UserInterface|null
  150.      */
  151.     public function findByEmail(string $email): ?UserInterface
  152.     {
  153.         return $this->findOneBy(['email' => $email]);
  154.     }
  155.     /**
  156.      * @param string $token
  157.      * @return UserInterface|null
  158.      */
  159.     public function findByConfirmationToken(string $token): ?UserInterface
  160.     {
  161.         return $this->findOneBy(['confirmationToken' => $token]);
  162.     }
  163.     /**
  164.      * @param DateTime $createdAt
  165.      * @param string|null $template
  166.      * @return array|UserInterface[]
  167.      */
  168.     public function getListByCreatedAtForEmail(DateTime $createdAt, ?string $template): array
  169.     {
  170.         $query $this->createQueryBuilder('u')
  171.             ->where('DATE(u.createdAt) = :createdAt')
  172.             ->setParameter('createdAt'$createdAt->format('Y-m-d'))
  173.             ->andWhere('u.enabled = 1')
  174.             ->leftJoin('u.userEmailUnsubscribe''ueu')
  175.             ->andWhere('ueu.id IS NULL');
  176.         if ($template) {
  177.             $query->leftJoin('u.userEmailLog''uel',Join::WITH'uel.template = :template')
  178.                 ->andWhere('uel.id IS NULL')
  179.                 ->setParameter('template'$template);
  180.         }
  181.         return $query->getQuery()
  182.             ->getResult();
  183.     }
  184.     /**
  185.      * @param GetCustomerListRequestDTO $request
  186.      * @return IPaginator
  187.      */
  188.     public function getCustomerList(GetCustomerListRequestDTO $request): IPaginator
  189.     {
  190.         $qb $this->createQueryBuilder('u')
  191.             ->leftJoin('u.members''m')
  192.             ->leftJoin('m.organization''o');
  193.         switch ($request->getOrderField()) {
  194.             case 'email':
  195.             case 'fullName':
  196.             case 'slug':
  197.             case 'domain':
  198.             case 'createdAt':
  199.             case 'lastLogin':
  200.                 $qb->orderBy('u.' $request->getOrderField(), $request->getOrderDirection());
  201.                 break;
  202.             case 'phone':
  203.                 $qb->orderBy('u.phoneNumber'$request->getOrderDirection());
  204.                 break;
  205.             case 'isEnabled':
  206.                 $qb->orderBy('u.enabled'$request->getOrderDirection());
  207.                 break;
  208.             case 'organizationSlug':
  209.                 $qb->orderBy('o.slug'$request->getOrderDirection());
  210.                 break;
  211.             default:
  212.                 $qb->orderBy('u.createdAt'$request->getOrderDirection());
  213.                 break;
  214.         }
  215.         if ($request->getFilter()) {
  216.             if ($request->getFilter()->getSearch()) {
  217.                 $qb->andWhere('u.username LIKE :search OR u.email LIKE :search OR u.fullName LIKE :search OR u.slug LIKE :search')
  218.                     ->setParameter('search''%' $request->getFilter()->getSearch() . '%');
  219.             }
  220.             if ($request->getFilter()->getId()) {
  221.                 $qb->andWhere('u.id = :id')
  222.                     ->setParameter('id'$request->getFilter()->getId());
  223.             }
  224.             if ($request->getFilter()->getCreatedAtFrom()) {
  225.                 $qb->andWhere('DATE(u.createdAt) >= :createdAtFrom')
  226.                     ->setParameter('createdAtFrom'$request->getFilter()->getCreatedAtFrom());
  227.             }
  228.             if ($request->getFilter()->getCreatedAtTo()) {
  229.                 $qb->andWhere('DATE(u.createdAt) <= :createdAtTo')
  230.                     ->setParameter('createdAtTo'$request->getFilter()->getCreatedAtTo());
  231.             }
  232.             if ($request->getFilter()->getOrganizationId()) {
  233.                 $qb->andWhere('o.id = :organizationId')
  234.                     ->setParameter('organizationId'$request->getFilter()->getOrganizationId());
  235.             }
  236.         }
  237.         if (!$request->isSkipPagination()) {
  238.             $qb->setMaxResults($request->getOnPage())
  239.                 ->setFirstResult($request->getOffset());
  240.         }
  241.         return new Paginator($qb->getQuery());
  242.     }
  243.     /**
  244.      * @return array|UserInterface[]
  245.      */
  246.     public function getListWithDeviceToken(): array
  247.     {
  248.         return $this->createQueryBuilder('u')
  249.             ->innerJoin('u.userDeviceToken''udt')
  250.             ->getQuery()
  251.             ->getResult();
  252.     }
  253. }