Нет описания

SendingQueuesRepository.php 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php declare(strict_types = 1);
  2. namespace MailPoet\Newsletter\Sending;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Doctrine\Repository;
  5. use MailPoet\Entities\NewsletterEntity;
  6. use MailPoet\Entities\ScheduledTaskEntity;
  7. use MailPoet\Entities\SendingQueueEntity;
  8. use MailPoet\Entities\SubscriberEntity;
  9. use MailPoetVendor\Doctrine\ORM\EntityManager;
  10. /**
  11. * @extends Repository<SendingQueueEntity>
  12. */
  13. class SendingQueuesRepository extends Repository {
  14. /** @var ScheduledTaskSubscribersRepository */
  15. private $scheduledTaskSubscribersRepository;
  16. public function __construct(
  17. EntityManager $entityManager,
  18. ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository
  19. ) {
  20. parent::__construct($entityManager);
  21. $this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository;
  22. }
  23. protected function getEntityClassName() {
  24. return SendingQueueEntity::class;
  25. }
  26. public function findOneByNewsletterAndTaskStatus(NewsletterEntity $newsletter, string $status): ?SendingQueueEntity {
  27. return $this->entityManager->createQueryBuilder()
  28. ->select('s')
  29. ->from(SendingQueueEntity::class, 's')
  30. ->join('s.task', 't')
  31. ->where('t.status = :status')
  32. ->andWhere('s.newsletter = :newsletter')
  33. ->setParameter('status', $status)
  34. ->setParameter('newsletter', $newsletter)
  35. ->getQuery()
  36. ->getOneOrNullResult();
  37. }
  38. public function isSubscriberProcessed(SendingQueueEntity $queue, SubscriberEntity $subscriber): bool {
  39. $task = $queue->getTask();
  40. if (is_null($task)) return false;
  41. return $this->scheduledTaskSubscribersRepository->isSubscriberProcessed($task, $subscriber);
  42. }
  43. /**
  44. * @return SendingQueueEntity[]
  45. */
  46. public function findAllForSubscriberSentBetween(
  47. SubscriberEntity $subscriber,
  48. ?\DateTimeInterface $dateTo,
  49. ?\DateTimeInterface $dateFrom
  50. ): array {
  51. $qb = $this->entityManager->createQueryBuilder()
  52. ->select('s, n')
  53. ->from(SendingQueueEntity::class, 's')
  54. ->join('s.task', 't')
  55. ->join('t.subscribers', 'tsub')
  56. ->join('s.newsletter', 'n')
  57. ->where('t.status = :status')
  58. ->setParameter('status', ScheduledTaskEntity::STATUS_COMPLETED)
  59. ->andWhere('t.type = :sendingType')
  60. ->setParameter('sendingType', 'sending')
  61. ->andWhere('tsub.subscriber = :subscriber')
  62. ->setParameter('subscriber', $subscriber);
  63. if ($dateTo) {
  64. $qb->andWhere('t.updatedAt < :dateTo')
  65. ->setParameter('dateTo', $dateTo);
  66. }
  67. if ($dateFrom) {
  68. $qb->andWhere('t.updatedAt > :dateFrom')
  69. ->setParameter('dateFrom', $dateFrom);
  70. }
  71. return $qb->getQuery()->getResult();
  72. }
  73. }