Uses queue ID when fetching newsletter link by hash

This commit is contained in:
Vlad
2017-05-14 20:17:07 -04:00
parent 6e700b0cfa
commit cd5f3165c7
5 changed files with 39 additions and 9 deletions

View File

@@ -166,13 +166,15 @@ class Links {
}
}
static function convertHashedLinksToShortcodesAndUrls($content, $convert_all = false) {
static function convertHashedLinksToShortcodesAndUrls($content, $queue_id, $convert_all = false) {
preg_match_all(self::getLinkRegex(), $content, $links);
$links = array_unique(Helpers::flattenArray($links));
foreach($links as $link) {
$link_hash = explode('-', $link);
if(!isset($link_hash[1])) continue;
$newsletter_link = NewsletterLink::getByHash($link_hash[1]);
$newsletter_link = NewsletterLink::where('hash', $link_hash[1])
->where('queue_id', $queue_id)
->findOne();
// convert either only link shortcodes or all hashes links if "convert all"
// option is specified
if($newsletter_link &&

View File

@@ -31,6 +31,7 @@ class ViewInBrowser {
if($wp_user_preview && preg_match(Links::getLinkRegex(), $newsletter_body)) {
$newsletter_body = Links::convertHashedLinksToShortcodesAndUrls(
$newsletter_body,
$queue_id = $queue->id,
$convert_all = true
);
// remove open tracking link

View File

@@ -49,8 +49,8 @@ class Track {
Newsletter::findOne($data->queue->newsletter_id) :
false;
if(!empty($data->link_hash)) {
$data->link = NewsletterLink::where('queue_id', $data->queue_id)
->where('hash', $data->link_hash)
$data->link = NewsletterLink::where('hash', $data->link_hash)
->where('queue_id', $data->queue_id)
->findOne();
}
return $this->_validateTrackData($data);

View File

@@ -159,38 +159,40 @@ class LinksTest extends MailPoetTest {
function testItCanConvertOnlyHashedLinkShortcodes() {
// create newsletter link association
$queue_id = 1;
$newsletter_link = NewsletterLink::create();
$newsletter_link->newsletter_id = 1;
$newsletter_link->queue_id = 1;
$newsletter_link->queue_id = $queue_id;
$newsletter_link->hash = '90e56';
$newsletter_link->url = '[link:newsletter_view_in_browser_url]';
$newsletter_link = $newsletter_link->save();
$content = '
<a href="[mailpoet_click_data]-90e56">View in browser</a>
<a href="[mailpoet_click_data]-123">Some link</a>';
$result = Links::convertHashedLinksToShortcodesAndUrls($content);
$result = Links::convertHashedLinksToShortcodesAndUrls($content, $queue_id);
expect($result)->contains($newsletter_link->url);
expect($result)->contains('[mailpoet_click_data]-123');
}
function testItCanConvertAllHashedLinksToUrls() {
// create newsletter link associations
$queue_id = 1;
$newsletter_link_1 = NewsletterLink::create();
$newsletter_link_1->newsletter_id = 1;
$newsletter_link_1->queue_id = 1;
$newsletter_link_1->queue_id = $queue_id;
$newsletter_link_1->hash = '90e56';
$newsletter_link_1->url = '[link:newsletter_view_in_browser_url]';
$newsletter_link_1 = $newsletter_link_1->save();
$newsletter_link_2 = NewsletterLink::create();
$newsletter_link_2->newsletter_id = 1;
$newsletter_link_2->queue_id = 1;
$newsletter_link_2->queue_id = $queue_id;
$newsletter_link_2->hash = '123';
$newsletter_link_2->url = 'http://google.com';
$newsletter_link_2 = $newsletter_link_2->save();
$content = '
<a href="[mailpoet_click_data]-90e56">View in browser</a>
<a href="[mailpoet_click_data]-123">Some link</a>';
$result = Links::convertHashedLinksToShortcodesAndUrls($content, $convert_all = true);
$result = Links::convertHashedLinksToShortcodesAndUrls($content, $queue_id, $convert_all = true);
expect($result)->contains($newsletter_link_1->url);
expect($result)->contains($newsletter_link_2->url);
}

View File

@@ -121,6 +121,31 @@ class TrackTest extends MailPoetTest {
expect($processed_data->link->id)->equals($this->link->id);
}
function testItGetsProperHashWhenDuplicateHashesExist() {
// create another queue
$queue = SendingQueue::create();
$queue->id = 123;
$queue->newsletter_id = $this->newsletter->id;
$queue->subscribers = array('processed' => array($this->subscriber->id));
$queue->save();
$track_data = $this->track_data;
$track_data['queue_id'] = $queue->id;
// create another link with the same hash but different queue ID
$link = NewsletterLink::create();
$link->hash = $this->link->hash;
$link->url = $this->link->url;
$link->newsletter_id = $track_data['newsletter_id'];
$link->queue_id = $track_data['queue_id'];
$link = $link->save();
// assert that 2 links with identical hash exist
$newsletter_link = NewsletterLink::where('hash', $link->hash)->findMany();
expect($newsletter_link)->count(2);
// assert that the fetched link ID belong to the newly created link
$processed_data = $this->track->_processTrackData($track_data);
expect($processed_data->link->id)->equals($link->id);
}
function _after() {
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);