Refactor getNewsletterFromQueue() to use Doctrine instead of Paris

[MAILPOET-4363]
This commit is contained in:
Rodrigo Primo
2022-08-29 15:37:09 -03:00
committed by Aschepikov
parent 4ca656a217
commit ccbdbd3e93
4 changed files with 76 additions and 67 deletions

View File

@@ -15,6 +15,7 @@ use MailPoet\Logging\LoggerFactory;
use MailPoet\Mailer\MailerError;
use MailPoet\Mailer\MailerLog;
use MailPoet\Mailer\MetaInfo;
use MailPoet\Models\Newsletter;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\StatisticsNewsletters as StatisticsNewslettersModel;
use MailPoet\Models\Subscriber as SubscriberModel;
@@ -150,12 +151,13 @@ class SendingQueue {
['task_id' => $queue->taskId]
);
$newsletter = $this->newsletterTask->getNewsletterFromQueue($queue);
if (!$newsletter) {
$newsletterEntity = $this->newsletterTask->getNewsletterFromQueue($queue);
if (!$newsletterEntity) {
return;
}
$newsletterEntity = $this->newslettersRepository->findOneById($newsletter->id);
if (!$newsletterEntity) {
$newsletter = Newsletter::findOne($newsletterEntity->getId());
if (!$newsletter) {
return;
}

View File

@@ -97,32 +97,32 @@ class Newsletter {
$this->newsletterSegmentRepository = ContainerWrapper::getInstance()->get(NewsletterSegmentRepository::class);
}
public function getNewsletterFromQueue(Sending $sendingTask) {
public function getNewsletterFromQueue(Sending $sendingTask): ?NewsletterEntity {
// get existing active or sending newsletter
$sendingQueue = $sendingTask->queue();
$newsletter = $sendingQueue->newsletter()
->whereNull('deleted_at')
->whereAnyIs(
[
['status' => NewsletterEntity::STATUS_ACTIVE],
['status' => NewsletterEntity::STATUS_SENDING],
]
)
->findOne();
if (!$newsletter) return false;
// if this is a notification history, get existing active or sending parent newsletter
if ($newsletter->type == NewsletterEntity::TYPE_NOTIFICATION_HISTORY) {
$parentNewsletter = $newsletter->parent()
->whereNull('deleted_at')
->whereAnyIs(
[
['status' => NewsletterEntity::STATUS_ACTIVE],
['status' => NewsletterEntity::STATUS_SENDING],
]
)
->findOne();
if (!$parentNewsletter) return false;
$sendingQueue = $sendingTask->getSendingQueueEntity();
$newsletter = $sendingQueue->getNewsletter();
if (
is_null($newsletter)
|| $newsletter->getDeletedAt() !== null
|| !in_array($newsletter->getStatus(), [NewsletterEntity::STATUS_ACTIVE, NewsletterEntity::STATUS_SENDING])
) {
return null;
}
// if this is a notification history, get existing active or sending parent newsletter
if ($newsletter->getType() == NewsletterEntity::TYPE_NOTIFICATION_HISTORY) {
$parentNewsletter = $newsletter->getParent();
if (
is_null($parentNewsletter)
|| $parentNewsletter->getDeletedAt() !== null
|| !in_array($parentNewsletter->getStatus(), [NewsletterEntity::STATUS_ACTIVE, NewsletterEntity::STATUS_SENDING])
) {
return null;
}
}
return $newsletter;
}

View File

@@ -3,10 +3,13 @@
namespace MailPoet\Tasks;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueAlias;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Logging\LoggerFactory;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\SendingQueue;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Util\Helpers;
/**
@@ -188,6 +191,13 @@ class Sending {
return $this->queue;
}
public function getSendingQueueEntity(): SendingQueueEntity {
$sendingQueuesRepository = ContainerWrapper::getInstance()->get(SendingQueuesRepository::class);
$sendingQueueEntity = $sendingQueuesRepository->findOneById($this->queue->id);
return $sendingQueueEntity;
}
public function task() {
return $this->task;
}

View File

@@ -75,7 +75,6 @@ class NewsletterTest extends \MailPoetTest {
$this->parentNewsletter->type = NewsletterEntity::TYPE_STANDARD;
$this->parentNewsletter->status = NewsletterEntity::STATUS_ACTIVE;
$this->parentNewsletter->subject = 'parent newsletter';
$this->parentNewsletter->body = 'parent body';
$this->parentNewsletter->preheader = '';
$this->parentNewsletter->save();
$this->sendingTask = SendingTask::create();
@@ -93,59 +92,57 @@ class NewsletterTest extends \MailPoetTest {
public function testItDoesNotGetNewsletterWhenStatusIsNotActiveOrSending() {
// draft or any other status return false
$newsletter = $this->newsletter;
$newsletter->status = NewsletterEntity::STATUS_DRAFT;
$newsletter->save();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->false();
$newsletterEntity = $this->newslettersRepository->findOneById($this->newsletter->id);
$this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity);
$newsletterEntity->setStatus(NewsletterEntity::STATUS_DRAFT);
$this->newslettersRepository->persist($newsletterEntity);
$this->newslettersRepository->flush();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->null();
// active or sending statuses return newsletter
$newsletter = $this->newsletter;
$newsletter->status = NewsletterEntity::STATUS_ACTIVE;
$newsletter->save();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->isInstanceOf('Mailpoet\Models\Newsletter');
$newsletterEntity->setStatus(NewsletterEntity::STATUS_ACTIVE);
$this->newslettersRepository->persist($newsletterEntity);
$this->newslettersRepository->flush();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->isInstanceOf(NewsletterEntity::class);
$newsletter = $this->newsletter;
$newsletter->status = NewsletterEntity::STATUS_SENDING;
$newsletter->save();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->isInstanceOf('Mailpoet\Models\Newsletter');
$newsletterEntity->setStatus(NewsletterEntity::STATUS_SENDING);
$this->newslettersRepository->persist($newsletterEntity);
$this->newslettersRepository->flush();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->isInstanceOf(NewsletterEntity::class);
}
public function testItDoesNotGetDeletedNewsletter() {
$newsletter = $this->newsletter;
$newsletter->set_expr('deleted_at', 'NOW()');
$newsletter->save();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->false();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->null();
}
public function testItDoesNotGetNewsletterWhenParentNewsletterStatusIsNotActiveOrSending() {
// draft or any other status return false
$parentNewsletter = $this->parentNewsletter;
$parentNewsletter->status = NewsletterEntity::STATUS_DRAFT;
$parentNewsletter->save();
$newsletter = $this->newsletter;
$newsletter->type = NewsletterEntity::TYPE_NOTIFICATION_HISTORY;
$newsletter->parentId = $parentNewsletter->id;
$newsletter->save();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->false();
$parentNewsletterEntity = $this->newslettersRepository->findOneById($this->parentNewsletter->id);
$this->assertInstanceOf(NewsletterEntity::class, $parentNewsletterEntity);
$parentNewsletterEntity->setStatus( NewsletterEntity::STATUS_DRAFT);
$this->newslettersRepository->persist($parentNewsletterEntity);
$this->newslettersRepository->flush();
$newsletterEntity = $this->newslettersRepository->findOneById($this->newsletter->id);
$this->assertInstanceOf(NewsletterEntity::class, $newsletterEntity);
$newsletterEntity->setType(NewsletterEntity::TYPE_NOTIFICATION_HISTORY);
$newsletterEntity->setParent($parentNewsletterEntity);
$this->newslettersRepository->persist($newsletterEntity);
$this->newslettersRepository->flush();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->null();
// active or sending statuses return newsletter
$parentNewsletter = $this->parentNewsletter;
$parentNewsletter->status = NewsletterEntity::STATUS_ACTIVE;
$parentNewsletter->save();
$newsletter = $this->newsletter;
$newsletter->type = NewsletterEntity::TYPE_NOTIFICATION_HISTORY;
$newsletter->parentId = $parentNewsletter->id;
$newsletter->save();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->isInstanceOf('Mailpoet\Models\Newsletter');
$parentNewsletterEntity->setStatus(NewsletterEntity::STATUS_ACTIVE);
$this->newslettersRepository->persist($parentNewsletterEntity);
$this->newslettersRepository->flush();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->isInstanceOf(NewsletterEntity::class);
$parentNewsletter = $this->parentNewsletter;
$parentNewsletter->status = NewsletterEntity::STATUS_SENDING;
$parentNewsletter->save();
$newsletter = $this->newsletter;
$newsletter->type = NewsletterEntity::TYPE_NOTIFICATION_HISTORY;
$newsletter->parentId = $parentNewsletter->id;
$newsletter->save();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->isInstanceOf('Mailpoet\Models\Newsletter');
$parentNewsletterEntity->setStatus(NewsletterEntity::STATUS_SENDING);
$this->newslettersRepository->persist($parentNewsletterEntity);
$this->newslettersRepository->flush();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->isInstanceOf(NewsletterEntity::class);
}
public function testItDoesNotGetDeletedNewsletterWhenParentNewsletterIsDeleted() {
@@ -156,7 +153,7 @@ class NewsletterTest extends \MailPoetTest {
$newsletter->type = NewsletterEntity::TYPE_NOTIFICATION_HISTORY;
$newsletter->parentId = $parentNewsletter->id;
$newsletter->save();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->false();
expect($this->newsletterTask->getNewsletterFromQueue($this->sendingTask))->null();
}
public function testItReturnsNewsletterObjectWhenRenderedNewsletterBodyExistsInTheQueue() {