Replace NewsletterLink with NewsletterLinkEntity in the class Links
It was also necessary to update two NewsletterTest tests, as after the change to Links::save(), having a queue ID set became mandatory (before it was not and one was not set properly in the mock SendingQueue object). [MAILPOET-3816]
This commit is contained in:
@@ -99,4 +99,16 @@ class NewsletterLinkEntity {
|
||||
public function getTotalClicksCount() {
|
||||
return $this->clicks->count();
|
||||
}
|
||||
|
||||
public function toArray(): array {
|
||||
return [
|
||||
'id' => $this->getId(),
|
||||
'newsletter_id' => ($this->getNewsletter() instanceof NewsletterEntity) ? $this->getNewsletter()->getId() : null,
|
||||
'queue_id' => ($this->getQueue() instanceof SendingQueueEntity) ? $this->getQueue()->getId() : null,
|
||||
'url' => $this->getUrl(),
|
||||
'hash' => $this->getHash(),
|
||||
'created_at' => $this->getCreatedAt(),
|
||||
'updated_at' => $this->getUpdatedAt(),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@@ -2,10 +2,14 @@
|
||||
|
||||
namespace MailPoet\Newsletter\Links;
|
||||
|
||||
use MailPoet\Cron\Workers\StatsNotifications\NewsletterLinkRepository;
|
||||
use MailPoet\DI\ContainerWrapper;
|
||||
use MailPoet\Entities\NewsletterEntity;
|
||||
use MailPoet\Entities\NewsletterLinkEntity;
|
||||
use MailPoet\Entities\SendingQueueEntity;
|
||||
use MailPoet\InvalidStateException;
|
||||
use MailPoet\Models\NewsletterLink;
|
||||
use MailPoet\Newsletter\NewslettersRepository;
|
||||
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
||||
use MailPoet\Newsletter\Shortcodes\Categories\Link;
|
||||
use MailPoet\Newsletter\Shortcodes\Shortcodes;
|
||||
use MailPoet\Router\Endpoints\Track as TrackEndpoint;
|
||||
@@ -28,12 +32,27 @@ class Links {
|
||||
/** @var SubscribersRepository */
|
||||
private $subscribersRepository;
|
||||
|
||||
/** @var NewsletterLinkRepository */
|
||||
private $newsletterLinkRepository;
|
||||
|
||||
/** @var NewslettersRepository */
|
||||
private $newslettersRepository;
|
||||
|
||||
/** @var SendingQueuesRepository */
|
||||
private $sendingQueueRepository;
|
||||
|
||||
public function __construct(
|
||||
LinkTokens $linkTokens,
|
||||
SubscribersRepository $subscribersRepository
|
||||
SubscribersRepository $subscribersRepository,
|
||||
NewsletterLinkRepository $newsletterLinkRepository,
|
||||
NewslettersRepository $newslettersRepository,
|
||||
SendingQueuesRepository $sendingQueuesRepository
|
||||
) {
|
||||
$this->linkTokens = $linkTokens;
|
||||
$this->subscribersRepository = $subscribersRepository;
|
||||
$this->newsletterLinkRepository = $newsletterLinkRepository;
|
||||
$this->newslettersRepository = $newslettersRepository;
|
||||
$this->sendingQueueRepository = $sendingQueuesRepository;
|
||||
}
|
||||
|
||||
public function process($content, $newsletterId, $queueId) {
|
||||
@@ -142,16 +161,26 @@ class Links {
|
||||
|
||||
public function save(array $links, $newsletterId, $queueId) {
|
||||
foreach ($links as $link) {
|
||||
if (isset($link['id']))
|
||||
if (isset($link['id'])) {
|
||||
continue;
|
||||
if (empty($link['hash']) || empty($link['link'])) continue;
|
||||
$newsletterLink = NewsletterLink::create();
|
||||
$newsletterLink->newsletterId = $newsletterId;
|
||||
$newsletterLink->queueId = $queueId;
|
||||
$newsletterLink->hash = $link['hash'];
|
||||
$newsletterLink->url = $link['link'];
|
||||
$newsletterLink->save();
|
||||
}
|
||||
|
||||
if (empty($link['hash']) || empty($link['link'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$newsletter = $this->newslettersRepository->findOneById($newsletterId);
|
||||
$sendingQueue = $this->sendingQueueRepository->findOneById($queueId);
|
||||
|
||||
if (!$newsletter instanceof NewsletterEntity || !$sendingQueue instanceof SendingQueueEntity) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$newsletterLink = new NewsletterLinkEntity($newsletter, $sendingQueue, $link['link'], $link['hash']);
|
||||
$this->newsletterLinkRepository->persist($newsletterLink);
|
||||
}
|
||||
|
||||
$this->newsletterLinkRepository->flush();
|
||||
}
|
||||
|
||||
public function ensureInstantUnsubscribeLink(array $processedLinks) {
|
||||
@@ -173,16 +202,19 @@ class Links {
|
||||
$links = array_unique(Helpers::flattenArray($links));
|
||||
foreach ($links as $link) {
|
||||
$linkHash = explode('-', $link);
|
||||
if (!isset($linkHash[1])) continue;
|
||||
$newsletterLink = NewsletterLink::where('hash', $linkHash[1])
|
||||
->where('queue_id', $queueId)
|
||||
->findOne();
|
||||
|
||||
if (!isset($linkHash[1])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$newsletterLink = $this->newsletterLinkRepository->findOneBy(['hash' => $linkHash[1], 'queue' => $queueId]);
|
||||
|
||||
// convert either only link shortcodes or all hashes links if "convert all"
|
||||
// option is specified
|
||||
if (($newsletterLink instanceof NewsletterLink) &&
|
||||
(preg_match('/\[link:/', $newsletterLink->url) || $convertAll)
|
||||
if (($newsletterLink instanceof NewsletterLinkEntity) &&
|
||||
(preg_match('/\[link:/', $newsletterLink->getUrl()) || $convertAll)
|
||||
) {
|
||||
$content = str_replace($link, $newsletterLink->url, $content);
|
||||
$content = str_replace($link, $newsletterLink->getUrl(), $content);
|
||||
}
|
||||
}
|
||||
return $content;
|
||||
@@ -251,12 +283,13 @@ class Links {
|
||||
}
|
||||
|
||||
private function load($newsletterId, $queueId) {
|
||||
$links = NewsletterLink::whereEqual('newsletter_id', $newsletterId)
|
||||
->whereEqual('queue_id', $queueId)
|
||||
->findMany();
|
||||
$links = $this->newsletterLinkRepository->findBy(
|
||||
['newsletter' => $newsletterId, 'queue' => $queueId]
|
||||
);
|
||||
|
||||
$savedLinks = [];
|
||||
foreach ($links as $link) {
|
||||
$savedLinks[$link->url] = $link->asArray();
|
||||
$savedLinks[$link->getUrl()] = $link->toArray();
|
||||
}
|
||||
return $savedLinks;
|
||||
}
|
||||
|
@@ -406,8 +406,10 @@ class NewsletterTest extends \MailPoetTest {
|
||||
->expects($this->once())
|
||||
->method('getErrors')
|
||||
->willReturn([]);
|
||||
$queueMock->id = $queue->id;
|
||||
$queueMock->taskId = $queue->taskId;
|
||||
$queueMock
|
||||
->expects($this->any())
|
||||
->method('__get')
|
||||
->will($this->onConsecutiveCalls($queue->id, $queue->taskId, $queue->id));
|
||||
|
||||
$sendingQueue = ORM::forTable(SendingQueue::$_table)->findOne($queue->id);
|
||||
assert($sendingQueue instanceof ORM);
|
||||
@@ -438,8 +440,10 @@ class NewsletterTest extends \MailPoetTest {
|
||||
->expects($this->once())
|
||||
->method('getErrors')
|
||||
->willReturn([]);
|
||||
$queueMock->id = $queue->id;
|
||||
$queueMock->taskId = $queue->taskId;
|
||||
$queueMock
|
||||
->expects($this->any())
|
||||
->method('__get')
|
||||
->will($this->onConsecutiveCalls($queue->id, $queue->taskId, $queue->id, $queue->newsletterRenderedBody));
|
||||
|
||||
// properly serialized object
|
||||
$sendingQueue = ORM::forTable(SendingQueue::$_table)->findOne($queue->id);
|
||||
|
Reference in New Issue
Block a user