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

View File

@@ -135,7 +135,11 @@ class Scheduler {
}
// 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)) {
@@ -168,7 +172,13 @@ class Scheduler {
if ($newsletter->sendTo === 'segment') {
$segment = $this->segmentsRepository->findOneById($newsletter->segment);
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)) {
$queue->delete();
return false;
@@ -198,7 +208,12 @@ class Scheduler {
if ($newsletterEntity instanceof NewsletterEntity) {
$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

View File

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

View File

@@ -79,7 +79,8 @@ class SendingQueueTest extends \MailPoetTest {
$this->diContainer->get(NewslettersRepository::class),
$this->diContainer->get(SendingQueuesRepository::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()]);
expect($res->status)->equals(APIResponse::STATUS_FORBIDDEN);
@@ -147,7 +148,8 @@ class SendingQueueTest extends \MailPoetTest {
Stub::make(Bridge::class, [
'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 = $response->getData();

View File

@@ -9,13 +9,16 @@ use MailPoet\Entities\ScheduledTaskSubscriberEntity;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity;
use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository;
use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\Test\DataFactories\ScheduledTask as ScheduledTaskFactory;
use MailPoet\Test\DataFactories\Segment as SegmentFactory;
use MailPoet\Test\DataFactories\Subscriber as SubscriberFactory;
use MailPoetVendor\Carbon\Carbon;
use PHPUnit\Framework\MockObject\MockObject;
class SubscribersFinderTest extends \MailPoetTest {
public $sending;
public $scheduledTask;
public $subscriber3;
public $subscriber2;
public $subscriber1;
@@ -29,6 +32,9 @@ class SubscribersFinderTest extends \MailPoetTest {
/** @var SegmentsRepository */
private $segmentsRepository;
/** @var ScheduledTaskSubscribersRepository */
private $scheduledTaskSubscribersRepository;
public function _before() {
parent::_before();
$segmentFactory = new SegmentFactory();
@@ -49,9 +55,11 @@ class SubscribersFinderTest extends \MailPoetTest {
->withSegments([$this->segment3])
->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->subscribersFinder = $this->diContainer->get(SubscribersFinder::class);
$this->scheduledTaskSubscribersRepository = $this->diContainer->get(ScheduledTaskSubscribersRepository::class);
}
public function testFindSubscribersInSegmentInSegmentDefaultSegment() {
@@ -90,20 +98,21 @@ class SubscribersFinderTest extends \MailPoetTest {
public function testItAddsSubscribersToTaskFromStaticSegments() {
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments(
$this->sending->task(),
$this->scheduledTask,
[
$this->segment1->getId(),
$this->segment2->getId(),
]
);
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() {
$this->segment3->setType('Invalid type');
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments(
$this->sending->task(),
$this->scheduledTask,
[
$this->segment3->getId(),
]
@@ -122,13 +131,14 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder($mock, $this->segmentsRepository, $this->entityManager);
$subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(),
$this->scheduledTask,
[
$this->segment2->getId(),
]
);
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() {
@@ -142,7 +152,7 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder($mock, $this->segmentsRepository, $this->entityManager);
$subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(),
$this->scheduledTask,
[
$this->segment1->getId(),
$this->segment2->getId(),
@@ -151,7 +161,8 @@ class SubscribersFinderTest extends \MailPoetTest {
);
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() {
@@ -163,4 +174,17 @@ class SubscribersFinderTest extends \MailPoetTest {
$this->truncateEntity(DynamicSegmentFilterEntity::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;
}
}