Pause all scheduled tasks when pausing newsletter
[MAILPOET-3481]
This commit is contained in:
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user