Update SubscriberFinder and Scheduler to use object entities

[MAILPOET-1495]
This commit is contained in:
Rostislav Wolný
2018-10-10 16:52:59 +02:00
parent 6b9c252649
commit b45c47a9e7
4 changed files with 42 additions and 34 deletions

View File

@ -73,7 +73,7 @@ class SendingQueue extends APIEndpoint {
$queue->status = SendingQueueModel::STATUS_SCHEDULED; $queue->status = SendingQueueModel::STATUS_SCHEDULED;
$queue->scheduled_at = Scheduler::formatDatetimeString($newsletter->scheduledAt); $queue->scheduled_at = Scheduler::formatDatetimeString($newsletter->scheduledAt);
} else { } else {
$segments = $newsletter->segments()->findArray(); $segments = $newsletter->segments()->findMany();
$finder = new SubscribersFinder(); $finder = new SubscribersFinder();
$subscribers_count = $finder->addSubscribersToTaskFromSegments($queue->task(), $segments); $subscribers_count = $finder->addSubscribersToTaskFromSegments($queue->task(), $segments);
if(!$subscribers_count) { if(!$subscribers_count) {

View File

@ -81,7 +81,7 @@ class Scheduler {
['newsletter_id' => $newsletter->id, 'task_id' => $queue->task_id] ['newsletter_id' => $newsletter->id, 'task_id' => $queue->task_id]
); );
// ensure that segments exist // ensure that segments exist
$segments = $newsletter->segments()->findArray(); $segments = $newsletter->segments()->findMany();
if(empty($segments)) { if(empty($segments)) {
Logger::getLogger('post-notifications')->addInfo( Logger::getLogger('post-notifications')->addInfo(
'post notification no segments', 'post notification no segments',
@ -122,9 +122,9 @@ class Scheduler {
function processScheduledAutomaticEmail($newsletter, $queue) { function processScheduledAutomaticEmail($newsletter, $queue) {
if($newsletter->sendTo === 'segment') { if($newsletter->sendTo === 'segment') {
$segment = Segment::findOne($newsletter->segment)->asArray(); $segment = Segment::findOne($newsletter->segment);
$finder = new SubscribersFinder(); $finder = new SubscribersFinder();
$result = $finder->addSubscribersToTaskFromSegments($queue->task(), array($segment)); $result = $finder->addSubscribersToTaskFromSegments($queue->task(), [$segment]);
if(empty($result)) { if(empty($result)) {
$queue->delete(); $queue->delete();
return false; return false;
@ -145,14 +145,14 @@ class Scheduler {
return true; return true;
} }
function processScheduledStandardNewsletter($newsletter, $queue) { function processScheduledStandardNewsletter($newsletter, SendingTask $task) {
$segments = $newsletter->segments()->findArray(); $segments = $newsletter->segments()->findMany();
$finder = new SubscribersFinder(); $finder = new SubscribersFinder();
$subscribers_count = $finder->addSubscribersToTaskFromSegments($queue->task(), $segments); $finder->addSubscribersToTaskFromSegments($task->task(), $segments);
// update current queue // update current queue
$queue->updateCount(); $task->updateCount();
$queue->status = null; $task->status = null;
$queue->save(); $task->save();
// update newsletter status // update newsletter status
$newsletter->setStatus(Newsletter::STATUS_SENDING); $newsletter->setStatus(Newsletter::STATUS_SENDING);
return true; return true;

View File

@ -13,15 +13,15 @@ class SubscribersFinder {
function findSubscribersInSegments($subscribers_to_process_ids, $newsletter_segments_ids) { function findSubscribersInSegments($subscribers_to_process_ids, $newsletter_segments_ids) {
$result = array(); $result = array();
foreach($newsletter_segments_ids as $segment_id) { foreach($newsletter_segments_ids as $segment_id) {
$segment = Segment::find_one($segment_id)->asArray(); $segment = Segment::find_one($segment_id);
$result = array_merge($result, $this->findSubscribersInSegment($segment, $subscribers_to_process_ids)); $result = array_merge($result, $this->findSubscribersInSegment($segment, $subscribers_to_process_ids));
} }
return $this->unique($result); return $this->unique($result);
} }
private function findSubscribersInSegment($segment, $subscribers_to_process_ids) { private function findSubscribersInSegment(Segment $segment, $subscribers_to_process_ids) {
if($this->isStaticSegment($segment)) { if($this->isStaticSegment($segment)) {
$subscribers = Subscriber::findSubscribersInSegments($subscribers_to_process_ids, array($segment['id']))->findMany(); $subscribers = Subscriber::findSubscribersInSegments($subscribers_to_process_ids, array($segment->id))->findMany();
return Subscriber::extractSubscribersIds($subscribers); return Subscriber::extractSubscribersIds($subscribers);
} }
$finders = Hooks::applyFilters('mailpoet_get_subscribers_in_segment_finders', array()); $finders = Hooks::applyFilters('mailpoet_get_subscribers_in_segment_finders', array());
@ -34,9 +34,8 @@ class SubscribersFinder {
return array(); return array();
} }
private function isStaticSegment(Segment $segment) {
private function isStaticSegment($segment) { return $segment->type === Segment::TYPE_DEFAULT || $segment->type === Segment::TYPE_WP_USERS;
return $segment['type'] === Segment::TYPE_DEFAULT || $segment['type'] === Segment::TYPE_WP_USERS;
} }
function addSubscribersToTaskFromSegments(ScheduledTask $task, array $segments) { function addSubscribersToTaskFromSegments(ScheduledTask $task, array $segments) {
@ -61,7 +60,9 @@ class SubscribersFinder {
} }
private function addSubscribersToTaskFromStaticSegments(ScheduledTask $task, array $segments) { private function addSubscribersToTaskFromStaticSegments(ScheduledTask $task, array $segments) {
$segment_ids = array_column($segments, 'id'); $segment_ids = array_map(function($segment) {
return $segment->id;
}, $segments);
Subscriber::rawExecute( Subscriber::rawExecute(
'INSERT IGNORE INTO ' . MP_SCHEDULED_TASK_SUBSCRIBERS_TABLE . ' 'INSERT IGNORE INTO ' . MP_SCHEDULED_TASK_SUBSCRIBERS_TABLE . '
(task_id, subscriber_id, processed) (task_id, subscriber_id, processed)
@ -90,7 +91,7 @@ class SubscribersFinder {
return $count; return $count;
} }
private function addSubscribersToTaskFromDynamicSegment(ScheduledTask $task, $segment) { private function addSubscribersToTaskFromDynamicSegment(ScheduledTask $task, Segment $segment) {
$finders = Hooks::applyFilters('mailpoet_get_subscribers_in_segment_finders', array()); $finders = Hooks::applyFilters('mailpoet_get_subscribers_in_segment_finders', array());
$count = 0; $count = 0;
foreach($finders as $finder) { foreach($finders as $finder) {
@ -135,4 +136,4 @@ class SubscribersFinder {
return $result; return $result;
} }
} }

View File

@ -99,10 +99,10 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder(); $finder = new SubscribersFinder();
$subscribers_count = $finder->addSubscribersToTaskFromSegments( $subscribers_count = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->sending->task(),
array( [
array('id' => $this->segment_1->id, 'type' => Segment::TYPE_DEFAULT), $this->getDummySegment($this->segment_1->id, Segment::TYPE_DEFAULT),
array('id' => $this->segment_2->id, 'type' => Segment::TYPE_DEFAULT), $this->getDummySegment($this->segment_2->id, Segment::TYPE_DEFAULT),
) ]
); );
expect($subscribers_count)->equals(1); expect($subscribers_count)->equals(1);
expect($this->sending->getSubscribers())->equals(array($this->subscriber_2->id)); expect($this->sending->getSubscribers())->equals(array($this->subscriber_2->id));
@ -112,9 +112,9 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder(); $finder = new SubscribersFinder();
$subscribers_count = $finder->addSubscribersToTaskFromSegments( $subscribers_count = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->sending->task(),
array( [
array('id' => $this->segment_1->id, 'type' => 'UNKNOWN SEGMENT'), $this->getDummySegment($this->segment_1->id, 'UNKNOWN SEGMENT'),
) ]
); );
expect($subscribers_count)->equals(0); expect($subscribers_count)->equals(0);
} }
@ -134,9 +134,9 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder(); $finder = new SubscribersFinder();
$subscribers_count = $finder->addSubscribersToTaskFromSegments( $subscribers_count = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->sending->task(),
array( [
array('id' => $this->segment_2->id, 'type' => ''), $this->getDummySegment($this->segment_2->id, ''),
) ]
); );
expect($subscribers_count)->equals(1); expect($subscribers_count)->equals(1);
expect($this->sending->getSubscribers())->equals(array($this->subscriber_1->id)); expect($this->sending->getSubscribers())->equals(array($this->subscriber_1->id));
@ -157,15 +157,22 @@ class SubscribersFinderTest extends \MailPoetTest {
$subscribers_count = $finder->addSubscribersToTaskFromSegments( $subscribers_count = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->sending->task(),
array( [
array('id' => $this->segment_1->id, 'type' => Segment::TYPE_DEFAULT), $this->getDummySegment($this->segment_1->id, Segment::TYPE_DEFAULT),
array('id' => $this->segment_2->id, 'type' => Segment::TYPE_DEFAULT), $this->getDummySegment($this->segment_2->id, Segment::TYPE_DEFAULT),
array('id' => $this->segment_3->id, 'type' => ''), $this->getDummySegment($this->segment_3->id, ''),
) ]
); );
expect($subscribers_count)->equals(1); expect($subscribers_count)->equals(1);
expect($this->sending->getSubscribers())->equals(array($this->subscriber_2->id)); expect($this->sending->getSubscribers())->equals(array($this->subscriber_2->id));
} }
private function getDummySegment($id, $type) {
$segment = Segment::create();
$segment->id = $id;
$segment->type = $type;
return $segment;
}
} }