Replace old ScheduledTask model with ScheduledTaskEntity in SubscribersFinder

[MAILPOET-3925]
This commit is contained in:
Rodrigo Primo
2022-03-16 10:47:55 -03:00
committed by Veljko V
parent da5537b9fe
commit 54ecb6065c
5 changed files with 82 additions and 28 deletions

View File

@@ -8,11 +8,13 @@ use MailPoet\API\JSON\Response;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Cron\Triggers\WordPress; use MailPoet\Cron\Triggers\WordPress;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue as SendingQueueModel; use MailPoet\Models\SendingQueue as SendingQueueModel;
use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Newsletter\Scheduler\Scheduler;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Segments\SubscribersFinder; use MailPoet\Segments\SubscribersFinder;
use MailPoet\Services\Bridge; use MailPoet\Services\Bridge;
@@ -39,18 +41,23 @@ class SendingQueue extends APIEndpoint {
/** @var SendingQueuesRepository */ /** @var SendingQueuesRepository */
private $sendingQueuesRepository; private $sendingQueuesRepository;
/** @var ScheduledTasksRepository */
private $scheduledTasksRepository;
public function __construct( public function __construct(
SubscribersFeature $subscribersFeature, SubscribersFeature $subscribersFeature,
NewslettersRepository $newsletterRepository, NewslettersRepository $newsletterRepository,
SendingQueuesRepository $sendingQueuesRepository, SendingQueuesRepository $sendingQueuesRepository,
Bridge $bridge, Bridge $bridge,
SubscribersFinder $subscribersFinder SubscribersFinder $subscribersFinder,
ScheduledTasksRepository $scheduledTasksRepository
) { ) {
$this->subscribersFeature = $subscribersFeature; $this->subscribersFeature = $subscribersFeature;
$this->subscribersFinder = $subscribersFinder; $this->subscribersFinder = $subscribersFinder;
$this->newsletterRepository = $newsletterRepository; $this->newsletterRepository = $newsletterRepository;
$this->bridge = $bridge; $this->bridge = $bridge;
$this->sendingQueuesRepository = $sendingQueuesRepository; $this->sendingQueuesRepository = $sendingQueuesRepository;
$this->scheduledTasksRepository = $scheduledTasksRepository;
} }
public function add($data = []) { public function add($data = []) {
@@ -129,8 +136,14 @@ class SendingQueue extends APIEndpoint {
$queue->scheduledAt = Scheduler::formatDatetimeString($newsletterEntity->getOptionValue('scheduledAt')); $queue->scheduledAt = Scheduler::formatDatetimeString($newsletterEntity->getOptionValue('scheduledAt'));
} else { } else {
$segments = $newsletterEntity->getSegmentIds(); $segments = $newsletterEntity->getSegmentIds();
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments($queue->task(), $segments); $taskModel = $queue->task();
if (!$subscribersCount) { $taskEntity = $this->scheduledTasksRepository->findOneById($taskModel->id);
if ($taskEntity instanceof ScheduledTaskEntity) {
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments($taskEntity, $segments);
}
if (!isset($subscribersCount) || !$subscribersCount) {
return $this->errorResponse([ return $this->errorResponse([
APIError::UNKNOWN => __('There are no subscribers in that list!', 'mailpoet'), APIError::UNKNOWN => __('There are no subscribers in that list!', 'mailpoet'),
]); ]);

View File

@@ -135,7 +135,11 @@ class Scheduler {
} }
// ensure that subscribers are in segments // ensure that subscribers are in segments
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments($queue->task(), $segments); $taskModel = $queue->task();
$taskEntity = $this->scheduledTasksRepository->findOneById($taskModel->id);
if ($taskEntity instanceof ScheduledTaskEntity) {
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments($taskEntity, $segments);
}
} }
if (empty($subscribersCount)) { if (empty($subscribersCount)) {
@@ -168,7 +172,13 @@ class Scheduler {
if ($newsletter->sendTo === 'segment') { if ($newsletter->sendTo === 'segment') {
$segment = $this->segmentsRepository->findOneById($newsletter->segment); $segment = $this->segmentsRepository->findOneById($newsletter->segment);
if ($segment instanceof SegmentEntity) { if ($segment instanceof SegmentEntity) {
$result = $this->subscribersFinder->addSubscribersToTaskFromSegments($queue->task(), [(int)$segment->getId()]); $taskModel = $queue->task();
$taskEntity = $this->scheduledTasksRepository->findOneById($taskModel->id);
if ($taskEntity instanceof ScheduledTaskEntity) {
$result = $this->subscribersFinder->addSubscribersToTaskFromSegments($taskEntity, [(int)$segment->getId()]);
}
if (empty($result)) { if (empty($result)) {
$queue->delete(); $queue->delete();
return false; return false;
@@ -198,7 +208,12 @@ class Scheduler {
if ($newsletterEntity instanceof NewsletterEntity) { if ($newsletterEntity instanceof NewsletterEntity) {
$segments = $newsletterEntity->getSegmentIds(); $segments = $newsletterEntity->getSegmentIds();
$this->subscribersFinder->addSubscribersToTaskFromSegments($task->task(), $segments); $taskModel = $task->task();
$taskEntity = $this->scheduledTasksRepository->findOneById($taskModel->id);
if ($taskEntity instanceof ScheduledTaskEntity) {
$this->subscribersFinder->addSubscribersToTaskFromSegments($taskEntity, $segments);
}
} }
// update current queue // update current queue

View File

@@ -2,12 +2,12 @@
namespace MailPoet\Segments; namespace MailPoet\Segments;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\ScheduledTaskSubscriberEntity; use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoet\InvalidStateException; use MailPoet\InvalidStateException;
use MailPoet\Models\ScheduledTask;
use MailPoetVendor\Doctrine\DBAL\Connection; use MailPoetVendor\Doctrine\DBAL\Connection;
use MailPoetVendor\Doctrine\DBAL\ParameterType; use MailPoetVendor\Doctrine\DBAL\ParameterType;
use MailPoetVendor\Doctrine\ORM\EntityManager; use MailPoetVendor\Doctrine\ORM\EntityManager;
@@ -54,12 +54,12 @@ class SubscribersFinder {
} }
/** /**
* @param ScheduledTask $task * @param ScheduledTaskEntity $task
* @param array<int> $segmentIds * @param array<int> $segmentIds
* *
* @return float|int * @return float|int
*/ */
public function addSubscribersToTaskFromSegments(ScheduledTask $task, array $segmentIds) { public function addSubscribersToTaskFromSegments(ScheduledTaskEntity $task, array $segmentIds) {
// Prepare subscribers on the DB side for performance reasons // Prepare subscribers on the DB side for performance reasons
$staticSegmentIds = []; $staticSegmentIds = [];
$dynamicSegmentIds = []; $dynamicSegmentIds = [];
@@ -84,12 +84,12 @@ class SubscribersFinder {
} }
/** /**
* @param ScheduledTask $task * @param ScheduledTaskEntity $task
* @param array<int> $segmentIds * @param array<int> $segmentIds
* *
* @return int * @return int
*/ */
private function addSubscribersToTaskFromStaticSegments(ScheduledTask $task, array $segmentIds) { private function addSubscribersToTaskFromStaticSegments(ScheduledTaskEntity $task, array $segmentIds) {
$processedStatus = ScheduledTaskSubscriberEntity::STATUS_UNPROCESSED; $processedStatus = ScheduledTaskSubscriberEntity::STATUS_UNPROCESSED;
$subscribersStatus = SubscriberEntity::STATUS_SUBSCRIBED; $subscribersStatus = SubscriberEntity::STATUS_SUBSCRIBED;
$relationStatus = SubscriberEntity::STATUS_SUBSCRIBED; $relationStatus = SubscriberEntity::STATUS_SUBSCRIBED;
@@ -110,7 +110,7 @@ class SubscribersFinder {
AND relation.`status` = ? AND relation.`status` = ?
AND relation.`segment_id` IN (?)", AND relation.`segment_id` IN (?)",
[ [
$task->id, $task->getId(),
$processedStatus, $processedStatus,
$subscribersStatus, $subscribersStatus,
$relationStatus, $relationStatus,
@@ -129,12 +129,12 @@ class SubscribersFinder {
} }
/** /**
* @param ScheduledTask $task * @param ScheduledTaskEntity $task
* @param array<int> $segmentIds * @param array<int> $segmentIds
* *
* @return int * @return int
*/ */
private function addSubscribersToTaskFromDynamicSegments(ScheduledTask $task, array $segmentIds) { private function addSubscribersToTaskFromDynamicSegments(ScheduledTaskEntity $task, array $segmentIds) {
$count = 0; $count = 0;
foreach ($segmentIds as $segmentId) { foreach ($segmentIds as $segmentId) {
$count += $this->addSubscribersToTaskFromDynamicSegment($task, (int)$segmentId); $count += $this->addSubscribersToTaskFromDynamicSegment($task, (int)$segmentId);
@@ -142,7 +142,7 @@ class SubscribersFinder {
return $count; return $count;
} }
private function addSubscribersToTaskFromDynamicSegment(ScheduledTask $task, int $segmentId) { private function addSubscribersToTaskFromDynamicSegment(ScheduledTaskEntity $task, int $segmentId) {
$count = 0; $count = 0;
$subscribers = $this->segmentSubscriberRepository->getSubscriberIdsInSegment($segmentId); $subscribers = $this->segmentSubscriberRepository->getSubscriberIdsInSegment($segmentId);
if ($subscribers) { if ($subscribers) {
@@ -151,7 +151,7 @@ class SubscribersFinder {
return $count; return $count;
} }
private function addSubscribersToTaskByIds(ScheduledTask $task, array $subscriberIds) { private function addSubscribersToTaskByIds(ScheduledTaskEntity $task, array $subscriberIds) {
$scheduledTaskSubscriberTable = $this->entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName(); $scheduledTaskSubscriberTable = $this->entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName();
$subscriberTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); $subscriberTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
@@ -166,7 +166,7 @@ class SubscribersFinder {
AND subscribers.`status` = ? AND subscribers.`status` = ?
AND subscribers.`id` IN (?)", AND subscribers.`id` IN (?)",
[ [
$task->id, $task->getId(),
ScheduledTaskSubscriberEntity::STATUS_UNPROCESSED, ScheduledTaskSubscriberEntity::STATUS_UNPROCESSED,
SubscriberEntity::STATUS_SUBSCRIBED, SubscriberEntity::STATUS_SUBSCRIBED,
$subscriberIds, $subscriberIds,

View File

@@ -79,7 +79,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->diContainer->get(NewslettersRepository::class), $this->diContainer->get(NewslettersRepository::class),
$this->diContainer->get(SendingQueuesRepository::class), $this->diContainer->get(SendingQueuesRepository::class),
$this->diContainer->get(Bridge::class), $this->diContainer->get(Bridge::class),
$this->diContainer->get(SubscribersFinder::class) $this->diContainer->get(SubscribersFinder::class),
$this->diContainer->get(ScheduledTasksRepository::class)
); );
$res = $sendingQueue->add(['newsletter_id' => $this->newsletter->getId()]); $res = $sendingQueue->add(['newsletter_id' => $this->newsletter->getId()]);
expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN); expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN);
@@ -147,7 +148,8 @@ class SendingQueueTest extends \MailPoetTest {
Stub::make(Bridge::class, [ Stub::make(Bridge::class, [
'isMailpoetSendingServiceEnabled' => true, 'isMailpoetSendingServiceEnabled' => true,
]), ]),
$this->diContainer->get(SubscribersFinder::class) $this->diContainer->get(SubscribersFinder::class),
$this->diContainer->get(ScheduledTasksRepository::class)
); );
$response = $sendingQueue->add(['newsletter_id' => $newsletter->getId()]); $response = $sendingQueue->add(['newsletter_id' => $newsletter->getId()]);
$response = $response->getData(); $response = $response->getData();

View File

@@ -9,13 +9,16 @@ use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository;
use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\Test\DataFactories\ScheduledTask as ScheduledTaskFactory;
use MailPoet\Test\DataFactories\Segment as SegmentFactory; use MailPoet\Test\DataFactories\Segment as SegmentFactory;
use MailPoet\Test\DataFactories\Subscriber as SubscriberFactory; use MailPoet\Test\DataFactories\Subscriber as SubscriberFactory;
use MailPoetVendor\Carbon\Carbon;
use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\MockObject\MockObject;
class SubscribersFinderTest extends \MailPoetTest { class SubscribersFinderTest extends \MailPoetTest {
public $sending; public $scheduledTask;
public $subscriber3; public $subscriber3;
public $subscriber2; public $subscriber2;
public $subscriber1; public $subscriber1;
@@ -29,6 +32,9 @@ class SubscribersFinderTest extends \MailPoetTest {
/** @var SegmentsRepository */ /** @var SegmentsRepository */
private $segmentsRepository; private $segmentsRepository;
/** @var ScheduledTaskSubscribersRepository */
private $scheduledTaskSubscribersRepository;
public function _before() { public function _before() {
parent::_before(); parent::_before();
$segmentFactory = new SegmentFactory(); $segmentFactory = new SegmentFactory();
@@ -49,9 +55,11 @@ class SubscribersFinderTest extends \MailPoetTest {
->withSegments([$this->segment3]) ->withSegments([$this->segment3])
->create(); ->create();
$this->sending = SendingTask::create(); $scheduledTaskFactory = new ScheduledTaskFactory();
$this->scheduledTask = $scheduledTaskFactory->create(SendingTask::TASK_TYPE, ScheduledTaskEntity::STATUS_SCHEDULED, new Carbon());
$this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class); $this->segmentsRepository = $this->diContainer->get(SegmentsRepository::class);
$this->subscribersFinder = $this->diContainer->get(SubscribersFinder::class); $this->subscribersFinder = $this->diContainer->get(SubscribersFinder::class);
$this->scheduledTaskSubscribersRepository = $this->diContainer->get(ScheduledTaskSubscribersRepository::class);
} }
public function testFindSubscribersInSegmentInSegmentDefaultSegment() { public function testFindSubscribersInSegmentInSegmentDefaultSegment() {
@@ -90,20 +98,21 @@ class SubscribersFinderTest extends \MailPoetTest {
public function testItAddsSubscribersToTaskFromStaticSegments() { public function testItAddsSubscribersToTaskFromStaticSegments() {
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments( $subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->scheduledTask,
[ [
$this->segment1->getId(), $this->segment1->getId(),
$this->segment2->getId(), $this->segment2->getId(),
] ]
); );
expect($subscribersCount)->equals(1); expect($subscribersCount)->equals(1);
expect($this->sending->getSubscribers())->equals([$this->subscriber2->getId()]); $subscribersIds = $this->getScheduledTasksSubscribers($this->scheduledTask->getId());
expect($subscribersIds)->equals([$this->subscriber2->getId()]);
} }
public function testItDoesNotAddSubscribersToTaskFromNoSegment() { public function testItDoesNotAddSubscribersToTaskFromNoSegment() {
$this->segment3->setType('Invalid type'); $this->segment3->setType('Invalid type');
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments( $subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->scheduledTask,
[ [
$this->segment3->getId(), $this->segment3->getId(),
] ]
@@ -122,13 +131,14 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder($mock, $this->segmentsRepository, $this->entityManager); $finder = new SubscribersFinder($mock, $this->segmentsRepository, $this->entityManager);
$subscribersCount = $finder->addSubscribersToTaskFromSegments( $subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->scheduledTask,
[ [
$this->segment2->getId(), $this->segment2->getId(),
] ]
); );
expect($subscribersCount)->equals(1); expect($subscribersCount)->equals(1);
expect($this->sending->getSubscribers())->equals([$this->subscriber1->getId()]); $subscribersIds = $this->getScheduledTasksSubscribers($this->scheduledTask->getId());
expect($subscribersIds)->equals([$this->subscriber1->getId()]);
} }
public function testItAddsSubscribersToTaskFromStaticAndDynamicSegments() { public function testItAddsSubscribersToTaskFromStaticAndDynamicSegments() {
@@ -142,7 +152,7 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder($mock, $this->segmentsRepository, $this->entityManager); $finder = new SubscribersFinder($mock, $this->segmentsRepository, $this->entityManager);
$subscribersCount = $finder->addSubscribersToTaskFromSegments( $subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->scheduledTask,
[ [
$this->segment1->getId(), $this->segment1->getId(),
$this->segment2->getId(), $this->segment2->getId(),
@@ -151,7 +161,8 @@ class SubscribersFinderTest extends \MailPoetTest {
); );
expect($subscribersCount)->equals(1); expect($subscribersCount)->equals(1);
expect($this->sending->getSubscribers())->equals([$this->subscriber2->getId()]); $subscribersIds = $this->getScheduledTasksSubscribers($this->scheduledTask->getId());
expect($subscribersIds)->equals([$this->subscriber2->getId()]);
} }
public function _after() { public function _after() {
@@ -163,4 +174,17 @@ class SubscribersFinderTest extends \MailPoetTest {
$this->truncateEntity(DynamicSegmentFilterEntity::class); $this->truncateEntity(DynamicSegmentFilterEntity::class);
$this->truncateEntity(SubscriberEntity::class); $this->truncateEntity(SubscriberEntity::class);
} }
private function getScheduledTasksSubscribers(int $taskId): array {
$scheduledTaskSubscribers = $this->scheduledTaskSubscribersRepository->findBy(['task' => $taskId]);
$subscribersIds = array_map(function($scheduledTaskSubscriber) {
$subscriber = $scheduledTaskSubscriber->getSubscriber();
if ($subscriber instanceof SubscriberEntity) {
return $subscriber->getId();
}
}, $scheduledTaskSubscribers);
return $subscribersIds;
}
} }