Merge pull request #1556 from mailpoet/arrays-to-objects

Replace entity arrays with objects [MAILPOET-1495]
This commit is contained in:
M. Shull
2018-10-22 14:59:12 -04:00
committed by GitHub
19 changed files with 100 additions and 171 deletions

View File

@@ -46,8 +46,7 @@ class NewsletterTemplates extends APIEndpoint {
if(!empty($data['newsletter_id'])) {
$template = NewsletterTemplate::whereEqual('newsletter_id', $data['newsletter_id'])->findOne();
if(!empty($template)) {
$template = $template->asArray();
$data['id'] = $template['id'];
$data['id'] = $template->id;
}
}

View File

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

View File

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

View File

@@ -14,15 +14,19 @@ class Form extends Model {
));
}
function getSettings() {
return is_serialized($this->settings) ? unserialize($this->settings) : $this->settings;
}
function getBody() {
return is_serialized($this->body) ? unserialize($this->body) : $this->body;
}
function asArray() {
$model = parent::asArray();
$model['body'] = (is_serialized($this->body))
? unserialize($this->body)
: $this->body;
$model['settings'] = (is_serialized($this->settings))
? unserialize($this->settings)
: $this->settings;
$model['body'] = $this->getBody();
$model['settings'] = $this->getSettings();
return $model;
}
@@ -40,15 +44,15 @@ class Form extends Model {
}
function getFieldList() {
$form = $this->asArray();
if(empty($form['body'])) {
$body = $this->getBody();
if(empty($body)) {
return false;
}
$skipped_types = array('html', 'divider', 'submit');
$fields = array();
foreach((array)$form['body'] as $field) {
foreach((array)$body as $field) {
if(empty($field['id'])
|| empty($field['type'])
|| in_array($field['type'], $skipped_types)
@@ -66,17 +70,17 @@ class Form extends Model {
}
function filterSegments(array $segment_ids = array()) {
$form = $this->asArray();
if(empty($form['settings']['segments'])) {
$settings = $this->getSettings();
if(empty($settings['segments'])) {
return array();
}
if(!empty($form['settings']['segments_selected_by'])
&& $form['settings']['segments_selected_by'] == 'user'
if(!empty($settings['segments_selected_by'])
&& $settings['segments_selected_by'] == 'user'
) {
$segment_ids = array_intersect($segment_ids, $form['settings']['segments']);
$segment_ids = array_intersect($segment_ids, $settings['segments']);
} else {
$segment_ids = $form['settings']['segments'];
$segment_ids = $settings['segments'];
}
return $segment_ids;

View File

@@ -367,12 +367,12 @@ class Newsletter extends Model {
if($duplicate->getErrors() === false) {
// create relationships between duplicate and segments
$segments = $this->segments()->findArray();
$segments = $this->segments()->findMany();
if(!empty($segments)) {
foreach($segments as $segment) {
$relation = NewsletterSegment::create();
$relation->segment_id = $segment['id'];
$relation->segment_id = $segment->id;
$relation->newsletter_id = $duplicate->id;
$relation->save();
}
@@ -380,14 +380,14 @@ class Newsletter extends Model {
// duplicate options
$options = NewsletterOption::where('newsletter_id', $this->id)
->findArray();
->findMany();
if(!empty($options)) {
foreach($options as $option) {
$relation = NewsletterOption::create();
$relation->newsletter_id = $duplicate->id;
$relation->option_field_id = $option['option_field_id'];
$relation->value = $option['value'];
$relation->option_field_id = $option->option_field_id;
$relation->value = $option->value;
$relation->save();
}
}
@@ -426,12 +426,12 @@ class Newsletter extends Model {
if($notification_history->getErrors() === false) {
// create relationships between notification history and segments
$segments = $this->segments()->findArray();
$segments = $this->segments()->findMany();
if(!empty($segments)) {
foreach($segments as $segment) {
$relation = NewsletterSegment::create();
$relation->segment_id = $segment['id'];
$relation->segment_id = $segment->id;
$relation->newsletter_id = $notification_history->id;
$relation->save();
}

View File

@@ -22,7 +22,7 @@ class Link {
case 'subscription_unsubscribe_url':
return self::processUrl(
$shortcode_details['action'],
SubscriptionUrl::getUnsubscribeUrl($wp_user_preview ? false : $subscriber),
SubscriptionUrl::getUnsubscribeUrl($wp_user_preview ? null : $subscriber),
$queue,
$wp_user_preview
);
@@ -30,7 +30,7 @@ class Link {
case 'subscription_manage_url':
return self::processUrl(
$shortcode_details['action'],
SubscriptionUrl::getManageUrl($wp_user_preview ? false : $subscriber),
SubscriptionUrl::getManageUrl($wp_user_preview ? null : $subscriber),
$queue,
$wp_user_preview
);

View File

@@ -53,7 +53,7 @@ class Track {
if($data->queue) {
$data->queue = SendingTask::createFromQueue($data->queue);
}
$data->subscriber = Subscriber::findOne($data->subscriber_id);
$data->subscriber = Subscriber::findOne($data->subscriber_id) ?: null;
$data->newsletter = (!empty($data->queue->newsletter_id)) ?
Newsletter::findOne($data->queue->newsletter_id) :
false;

View File

@@ -6,7 +6,6 @@ use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber;
use MailPoet\Util\Helpers;
use MailPoet\WP\Hooks;
class SubscribersFinder {
@@ -14,15 +13,15 @@ class SubscribersFinder {
function findSubscribersInSegments($subscribers_to_process_ids, $newsletter_segments_ids) {
$result = array();
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));
}
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)) {
$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);
}
$finders = Hooks::applyFilters('mailpoet_get_subscribers_in_segment_finders', array());
@@ -35,30 +34,8 @@ class SubscribersFinder {
return array();
}
function getSubscribersByList($segments) {
$result = array();
foreach($segments as $segment) {
$result = array_merge($result, $this->getSubscribers($segment));
}
return $this->unique($result);
}
private function getSubscribers($segment) {
if($this->isStaticSegment($segment)) {
return Subscriber::getSubscribedInSegments(array($segment['id']))->findArray();
}
$finders = Hooks::applyFilters('mailpoet_get_subscribers_in_segment_finders', array());
foreach($finders as $finder) {
$subscribers = $finder->getSubscriberIdsInSegment($segment);
if($subscribers) {
return $subscribers;
}
}
return array();
}
private function isStaticSegment($segment) {
return $segment['type'] === Segment::TYPE_DEFAULT || $segment['type'] === Segment::TYPE_WP_USERS;
private function isStaticSegment(Segment $segment) {
return $segment->type === Segment::TYPE_DEFAULT || $segment->type === Segment::TYPE_WP_USERS;
}
function addSubscribersToTaskFromSegments(ScheduledTask $task, array $segments) {
@@ -83,7 +60,9 @@ class SubscribersFinder {
}
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(
'INSERT IGNORE INTO ' . MP_SCHEDULED_TASK_SUBSCRIBERS_TABLE . '
(task_id, subscriber_id, processed)
@@ -112,7 +91,7 @@ class SubscribersFinder {
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());
$count = 0;
foreach($finders as $finder) {

View File

@@ -13,15 +13,12 @@ class SubscribersListings {
throw new \InvalidArgumentException('Missing segment id');
}
$segment = Segment::findOne($data['filter']['segment']);
if($segment) {
$segment = $segment->asArray();
}
return $this->getListings($segment, $data);
return $this->getListings($data, $segment ?: null);
}
private function getListings($segment, $data) {
if(!$segment || $segment['type'] === Segment::TYPE_DEFAULT || $segment['type'] === Segment::TYPE_WP_USERS) {
private function getListings($data, Segment $segment = null) {
if(!$segment || $segment->type === Segment::TYPE_DEFAULT || $segment->type === Segment::TYPE_WP_USERS) {
$listing = new Handler('\MailPoet\Models\Subscriber', $data);
return $listing_data = $listing->get();

View File

@@ -436,7 +436,7 @@ class Pages {
);
return '<a href="'.Url::getManageUrl(
$this->subscriber
$this->subscriber ?: null
).'">'.$text.'</a>';
}
}

View File

@@ -7,36 +7,32 @@ use MailPoet\Models\Subscriber;
use MailPoet\Models\Setting;
class Url {
static function getConfirmationUrl($subscriber = false) {
static function getConfirmationUrl(Subscriber $subscriber = null) {
$post = get_post(Setting::getValue('subscription.pages.confirmation'));
return self::getSubscriptionUrl($post, 'confirm', $subscriber);
}
static function getManageUrl($subscriber = false) {
static function getManageUrl(Subscriber $subscriber = null) {
$post = get_post(Setting::getValue('subscription.pages.manage'));
return self::getSubscriptionUrl($post, 'manage', $subscriber);
}
static function getUnsubscribeUrl($subscriber = false) {
static function getUnsubscribeUrl(Subscriber $subscriber = null) {
$post = get_post(Setting::getValue('subscription.pages.unsubscribe'));
return self::getSubscriptionUrl($post, 'unsubscribe', $subscriber);
}
static function getSubscriptionUrl(
$post = null, $action = null, $subscriber = false
$post = null, $action = null, Subscriber $subscriber = null
) {
if($post === null || $action === null) return;
$url = get_permalink($post);
if($subscriber !== false) {
if(is_object($subscriber)) {
$subscriber = $subscriber->asArray();
}
if($subscriber !== null) {
$data = array(
'token' => Subscriber::generateToken($subscriber['email']),
'email' => $subscriber['email']
'token' => Subscriber::generateToken($subscriber->email),
'email' => $subscriber->email
);
} else {
$data = array(

View File

@@ -730,8 +730,8 @@ class NewslettersTest extends \MailPoetTest {
function testItCanSendAPreview() {
$subscriber = 'test@subscriber.com';
$unsubscribeLink = SubscriptionUrl::getUnsubscribeUrl(false);
$manageLink = SubscriptionUrl::getManageUrl(false);
$unsubscribeLink = SubscriptionUrl::getUnsubscribeUrl(null);
$manageLink = SubscriptionUrl::getManageUrl(null);
$viewInBrowserLink = Url::getViewInBrowserUrl(null, $this->newsletter, false, false, true);
$data = array(
'subscriber' => $subscriber,

View File

@@ -287,8 +287,8 @@ class ShortcodesTest extends \MailPoetTest {
'[link:newsletter_view_in_browser_url]',
);
$links = array(
SubscriptionUrl::getUnsubscribeUrl(false),
SubscriptionUrl::getManageUrl(false),
SubscriptionUrl::getUnsubscribeUrl(null),
SubscriptionUrl::getManageUrl(null),
NewsletterUrl::getViewInBrowserUrl(null, $this->newsletter, false, false, true)
);
$result = $shortcodes_object->process($shortcodes);

View File

@@ -53,63 +53,6 @@ class SubscribersFinderTest extends \MailPoetTest {
$this->sending = SendingTask::create();
}
function testGetSubscribersInSegmentDefaultSegment() {
$finder = new SubscribersFinder();
$subscribers = $finder->getSubscribersByList(array(
array('id' => $this->segment_1->id, 'type' => Segment::TYPE_DEFAULT),
array('id' => $this->segment_2->id, 'type' => Segment::TYPE_DEFAULT),
));
expect($subscribers)->count(1);
expect($subscribers[$this->subscriber_2->id]['id'])->equals($this->subscriber_2->id);
}
function testGetSubscribersNoSegment() {
$finder = new SubscribersFinder();
$subscribers = $finder->getSubscribersByList(array(
array('id' => $this->segment_1->id, 'type' => 'UNKNOWN SEGMENT'),
));
expect($subscribers)->count(0);
}
function testGetSubscribersUsingFinder() {
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', array('getSubscriberIdsInSegment'));
$mock
->expects($this->once())
->method('getSubscriberIdsInSegment')
->will($this->returnValue(array($this->subscriber_1->id)));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders');
Hooks::addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return array($mock);
});
$finder = new SubscribersFinder();
$subscribers = $finder->getSubscribersByList(array(
array('id' => $this->segment_2->id, 'type' => ''),
));
expect($subscribers)->count(1);
}
function testGetSubscribersUsingFinderMakesResultUnique() {
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', array('getSubscriberIdsInSegment'));
$mock
->expects($this->exactly(2))
->method('getSubscriberIdsInSegment')
->will($this->returnValue(array($this->subscriber_1->id)));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders');
Hooks::addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return array($mock);
});
$finder = new SubscribersFinder();
$subscribers = $finder->getSubscribersByList(array(
array('id' => $this->segment_2->id, 'type' => ''),
array('id' => $this->segment_2->id, 'type' => ''),
));
expect($subscribers)->count(1);
}
function testFindSubscribersInSegmentInSegmentDefaultSegment() {
$finder = new SubscribersFinder();
$subscribers = $finder->findSubscribersInSegments(array($this->subscriber_2->id), array($this->segment_1->id));
@@ -156,10 +99,10 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder();
$subscribers_count = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(),
array(
array('id' => $this->segment_1->id, 'type' => Segment::TYPE_DEFAULT),
array('id' => $this->segment_2->id, 'type' => Segment::TYPE_DEFAULT),
)
[
$this->getDummySegment($this->segment_1->id, Segment::TYPE_DEFAULT),
$this->getDummySegment($this->segment_2->id, Segment::TYPE_DEFAULT),
]
);
expect($subscribers_count)->equals(1);
expect($this->sending->getSubscribers())->equals(array($this->subscriber_2->id));
@@ -169,9 +112,9 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder();
$subscribers_count = $finder->addSubscribersToTaskFromSegments(
$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);
}
@@ -191,9 +134,9 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder();
$subscribers_count = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(),
array(
array('id' => $this->segment_2->id, 'type' => ''),
)
[
$this->getDummySegment($this->segment_2->id, ''),
]
);
expect($subscribers_count)->equals(1);
expect($this->sending->getSubscribers())->equals(array($this->subscriber_1->id));
@@ -214,15 +157,22 @@ class SubscribersFinderTest extends \MailPoetTest {
$subscribers_count = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(),
array(
array('id' => $this->segment_1->id, 'type' => Segment::TYPE_DEFAULT),
array('id' => $this->segment_2->id, 'type' => Segment::TYPE_DEFAULT),
array('id' => $this->segment_3->id, 'type' => ''),
)
[
$this->getDummySegment($this->segment_1->id, Segment::TYPE_DEFAULT),
$this->getDummySegment($this->segment_2->id, Segment::TYPE_DEFAULT),
$this->getDummySegment($this->segment_3->id, ''),
]
);
expect($subscribers_count)->equals(1);
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;
}
}

View File

@@ -14,6 +14,10 @@ use MailPoet\Statistics\Track\Clicks;
use MailPoet\Tasks\Sending as SendingTask;
class ClicksTest extends \MailPoetTest {
/** @var Clicks */
private $clicks;
function _before() {
// create newsletter
$newsletter = Newsletter::create();

View File

@@ -15,7 +15,7 @@ class UrlTest extends \MailPoetTest {
function testItReturnsTheConfirmationUrl() {
// preview
$url = Url::getConfirmationUrl(false);
$url = Url::getConfirmationUrl(null);
expect($url)->notNull();
expect($url)->contains('action=confirm');
expect($url)->contains('endpoint=subscription');
@@ -33,7 +33,7 @@ class UrlTest extends \MailPoetTest {
function testItReturnsTheManageSubscriptionUrl() {
// preview
$url = Url::getManageUrl(false);
$url = Url::getManageUrl(null);
expect($url)->notNull();
expect($url)->contains('action=manage');
expect($url)->contains('endpoint=subscription');
@@ -51,7 +51,7 @@ class UrlTest extends \MailPoetTest {
function testItReturnsTheUnsubscribeUrl() {
// preview
$url = Url::getUnsubscribeUrl(false);
$url = Url::getUnsubscribeUrl(null);
expect($url)->notNull();
expect($url)->contains('action=unsubscribe');
expect($url)->contains('endpoint=subscription');