Pause all scheduled tasks when pausing newsletter

[MAILPOET-3481]
This commit is contained in:
Pavel Dohnal
2021-03-17 11:42:01 +01:00
committed by Veljko V
parent 791c3f7a53
commit 2dcf9a8a8f
3 changed files with 84 additions and 3 deletions

View File

@ -10,6 +10,7 @@ use MailPoet\Doctrine\EntityTraits\SafeToOneAssociationLoadTrait;
use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait; use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use MailPoetVendor\Doctrine\Common\Collections\ArrayCollection; use MailPoetVendor\Doctrine\Common\Collections\ArrayCollection;
use MailPoetVendor\Doctrine\Common\Collections\Collection;
use MailPoetVendor\Doctrine\Common\Collections\Criteria; use MailPoetVendor\Doctrine\Common\Collections\Criteria;
use MailPoetVendor\Doctrine\ORM\Mapping as ORM; use MailPoetVendor\Doctrine\ORM\Mapping as ORM;
use MailPoetVendor\Symfony\Component\Validator\Constraints as Assert; use MailPoetVendor\Symfony\Component\Validator\Constraints as Assert;
@ -257,6 +258,25 @@ class NewsletterEntity {
*/ */
public function setStatus($status) { public function setStatus($status) {
$this->status = $status; $this->status = $status;
$queues = $this->getUnfinishedQueues();
$newTaskStatus = null;
$typesWithActivation = [self::TYPE_NOTIFICATION, self::TYPE_WELCOME, self::TYPE_AUTOMATIC];
if (($status === self::STATUS_DRAFT) && in_array($this->type, $typesWithActivation)) {
$newTaskStatus = ScheduledTaskEntity::STATUS_PAUSED;
}
if (($status === self::STATUS_ACTIVE) && in_array($this->type, $typesWithActivation)) {
$newTaskStatus = ScheduledTaskEntity::STATUS_SCHEDULED;
}
if (!$newTaskStatus) return;
foreach ($queues as $queue) {
/** @var SendingQueueEntity $queue */
$task = $queue->getTask();
if ($task === null) continue;
$task->setStatus($newTaskStatus);
}
} }
/** /**
@ -421,4 +441,11 @@ class NewsletterEntity {
$criteria->setMaxResults(1); $criteria->setMaxResults(1);
return $this->queues->matching($criteria)->first() ?: null; return $this->queues->matching($criteria)->first() ?: null;
} }
private function getUnfinishedQueues(): Collection {
$criteria = new Criteria();
$expr = Criteria::expr();
$criteria->where($expr->neq('countToProcess', 0));
return $this->queues->matching($criteria);
}
} }

View File

@ -79,7 +79,7 @@ class SendingQueueEntity {
private $meta; private $meta;
/** /**
* @ORM\OneToOne(targetEntity="MailPoet\Entities\ScheduledTaskEntity") * @ORM\OneToOne(targetEntity="MailPoet\Entities\ScheduledTaskEntity", fetch="EAGER")
* @var ScheduledTaskEntity|null * @var ScheduledTaskEntity|null
*/ */
private $task; private $task;

View File

@ -6,9 +6,9 @@ use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Options\NewsletterOptionsRepository; use MailPoet\Newsletter\Options\NewsletterOptionsRepository;
use MailPoet\Newsletter\Segment\NewsletterSegmentRepository; use MailPoet\Newsletter\Segment\NewsletterSegmentRepository;
use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SegmentsRepository;
use MailPoet\Tasks\Sending as SendingTask;
class NewsletterEntityTest extends \MailPoetTest { class NewsletterEntityTest extends \MailPoetTest {
/** @var NewslettersRepository */ /** @var NewslettersRepository */
private $newsletterRepository; private $newsletterRepository;
@ -63,7 +63,7 @@ class NewsletterEntityTest extends \MailPoetTest {
$optionField = $this->createOptionField(NewsletterOptionFieldEntity::NAME_EVENT); $optionField = $this->createOptionField(NewsletterOptionFieldEntity::NAME_EVENT);
$newsletterOption = new NewsletterOptionEntity($newsletter, $optionField); $newsletterOption = new NewsletterOptionEntity($newsletter, $optionField);
$newsletterOption->setValue($optionValue); $newsletterOption->setValue($optionValue);
$this->entityManager->persist($newsletterOption); $this->entityManager->persist($newsletterOption);
$this->entityManager->flush(); $this->entityManager->flush();
$this->entityManager->clear(); $this->entityManager->clear();
@ -79,6 +79,58 @@ class NewsletterEntityTest extends \MailPoetTest {
expect($newsletter->getOption(NewsletterOptionFieldEntity::NAME_SEGMENT))->null(); expect($newsletter->getOption(NewsletterOptionFieldEntity::NAME_SEGMENT))->null();
} }
public function testItPausesTaskWhenPausingNewsletter() {
// prepare
$newsletter = $this->createNewsletter();
$newsletter->setType(NewsletterEntity::TYPE_WELCOME);
$newsletter->setStatus(NewsletterEntity::STATUS_SCHEDULED);
$task = new ScheduledTaskEntity();
$task->setType(SendingTask::TASK_TYPE);
$task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
$this->entityManager->persist($task);
$queue = new SendingQueueEntity();
$queue->setNewsletter($newsletter);
$queue->setCountToProcess(10);
$queue->setTask($task);
$this->entityManager->persist($queue);
$newsletter->getQueues()->add($queue);
$this->entityManager->flush();
// act
$newsletter->setStatus(NewsletterEntity::STATUS_DRAFT);
// verify
expect($task->getStatus())->equals(ScheduledTaskEntity::STATUS_PAUSED);
}
public function testItActivatesTaskWhenActivatingNewsletter() {
// prepare
$newsletter = $this->createNewsletter();
$newsletter->setType(NewsletterEntity::TYPE_WELCOME);
$newsletter->setStatus(NewsletterEntity::STATUS_DRAFT);
$task = new ScheduledTaskEntity();
$task->setType(SendingTask::TASK_TYPE);
$task->setStatus(ScheduledTaskEntity::STATUS_PAUSED);
$this->entityManager->persist($task);
$queue = new SendingQueueEntity();
$queue->setNewsletter($newsletter);
$queue->setCountToProcess(10);
$queue->setTask($task);
$this->entityManager->persist($queue);
$newsletter->getQueues()->add($queue);
$this->entityManager->flush();
// act
$newsletter->setStatus(NewsletterEntity::STATUS_ACTIVE);
// verify
expect($task->getStatus())->equals(ScheduledTaskEntity::STATUS_SCHEDULED);
}
public function _after() { public function _after() {
$this->cleanup(); $this->cleanup();
} }
@ -105,5 +157,7 @@ class NewsletterEntityTest extends \MailPoetTest {
$this->truncateEntity(NewsletterOptionFieldEntity::class); $this->truncateEntity(NewsletterOptionFieldEntity::class);
$this->truncateEntity(NewsletterSegmentEntity::class); $this->truncateEntity(NewsletterSegmentEntity::class);
$this->truncateEntity(SegmentEntity::class); $this->truncateEntity(SegmentEntity::class);
$this->truncateEntity(ScheduledTaskEntity::class);
$this->truncateEntity(SendingQueueEntity::class);
} }
} }