diff --git a/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php b/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php index be141158b7..17d6c92d5d 100644 --- a/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php +++ b/lib/Newsletter/Sending/ScheduledTaskSubscribersRepository.php @@ -1,9 +1,11 @@ - @@ -12,4 +14,18 @@ class ScheduledTaskSubscribersRepository extends Repository { protected function getEntityClassName() { return ScheduledTaskSubscriberEntity::class; } + + public function isSubscriberProcessed(ScheduledTaskEntity $task, SubscriberEntity $subscriber): bool { + $scheduledTaskSubscriber = $this + ->doctrineRepository + ->createQueryBuilder('sts') + ->andWhere('sts.processed = 1') + ->andWhere('sts.task = :task') + ->andWhere('sts.subscriber = :subscriber') + ->setParameter('subscriber', $subscriber) + ->setParameter('task', $task) + ->getQuery() + ->getOneOrNullResult(); + return !empty($scheduledTaskSubscriber); + } } diff --git a/lib/Newsletter/Sending/SendingQueuesRepository.php b/lib/Newsletter/Sending/SendingQueuesRepository.php index 6aade37157..ca7d5648be 100644 --- a/lib/Newsletter/Sending/SendingQueuesRepository.php +++ b/lib/Newsletter/Sending/SendingQueuesRepository.php @@ -1,15 +1,28 @@ - */ class SendingQueuesRepository extends Repository { + /** @var ScheduledTaskSubscribersRepository */ + private $scheduledTaskSubscribersRepository; + + public function __construct( + EntityManager $entityManager, + ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository + ) { + parent::__construct($entityManager); + $this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository; + } + protected function getEntityClassName() { return SendingQueueEntity::class; } @@ -26,4 +39,10 @@ class SendingQueuesRepository extends Repository { ->getQuery() ->getOneOrNullResult(); } + + public function isSubscriberProcessed(SendingQueueEntity $queue, SubscriberEntity $subscriber): bool { + $task = $queue->getTask(); + if (is_null($task)) return false; + return $this->scheduledTaskSubscribersRepository->isSubscriberProcessed($task, $subscriber); + } } diff --git a/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php b/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php new file mode 100644 index 0000000000..85525a4f94 --- /dev/null +++ b/tests/integration/Newsletter/Sending/SendingQueuesRepositoryTest.php @@ -0,0 +1,101 @@ +cleanup(); + $this->repository = $this->diContainer->get(SendingQueuesRepository::class); + } + + public function testIsSubscriberProcessedTaskMissing() { + $task = $this->createTask(); + $queue = $this->createQueue($task); + $subscriber = $this->createSubscriber(); + $this->entityManager->flush(); + + $this->entityManager->remove($task); + $this->entityManager->flush(); + $this->entityManager->refresh($queue); + + $result = $this->repository->isSubscriberProcessed($queue, $subscriber); + expect($result)->false(); + } + + public function testIsSubscriberProcessedUnprocessed() { + $task = $this->createTask(); + $queue = $this->createQueue($task); + $subscriber = $this->createSubscriber(); + $this->createTaskSubscriber($task, $subscriber, 0); + $this->entityManager->flush(); + + $result = $this->repository->isSubscriberProcessed($queue, $subscriber); + expect($result)->false(); + } + + public function testIsSubscriberProcessedProcessed() { + $task = $this->createTask(); + $queue = $this->createQueue($task); + $subscriber = $this->createSubscriber(); + $this->createTaskSubscriber($task, $subscriber, 1); + $this->entityManager->flush(); + + $result = $this->repository->isSubscriberProcessed($queue, $subscriber); + expect($result)->true(); + } + + private function createTaskSubscriber(ScheduledTaskEntity $task, SubscriberEntity $subscriber, int $processed) { + $taskSubscriber = new ScheduledTaskSubscriberEntity( + $task, + $subscriber, + $processed + ); + $this->entityManager->persist($taskSubscriber); + } + + private function createTask(): ScheduledTaskEntity { + $task = new ScheduledTaskEntity(); + $this->entityManager->persist($task); + return $task; + } + + private function createQueue(ScheduledTaskEntity $task): SendingQueueEntity { + $newsletter = new NewsletterEntity(); + $newsletter->setType('type'); + $newsletter->setSubject('Subject'); + $this->newsletter = $newsletter; + $this->entityManager->persist($newsletter); + + $queue = new SendingQueueEntity(); + $queue->setNewsletter($this->newsletter); + $queue->setTask($task); + $this->entityManager->persist($queue); + + return $queue; + } + + private function createSubscriber(): SubscriberEntity { + $subscriber = new SubscriberEntity(); + $subscriber->setStatus(SubscriberEntity::STATUS_SUBSCRIBED); + $subscriber->setEmail('a@example.com'); + $this->entityManager->persist($subscriber); + return $subscriber; + } + + public function cleanup() { + $this->truncateEntity(NewsletterEntity::class); + $this->truncateEntity(SubscriberEntity::class); + $this->truncateEntity(ScheduledTaskEntity::class); + $this->truncateEntity(ScheduledTaskSubscriberEntity::class); + } +}