Replace old ScheduledTask model with ScheduledTaskEntity in SubscribersFinder
[MAILPOET-3925]
This commit is contained in:
@@ -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'),
|
||||
]);
|
||||
|
@@ -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
|
||||
|
@@ -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,
|
||||
|
@@ -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();
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user