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:
Rodrigo Primo
2021-10-14 15:20:54 -03:00
committed by Veljko V
parent c870c416ad
commit d9296d86fd
3 changed files with 74 additions and 25 deletions

View File

@@ -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(),
];
}
}

View File

@@ -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;
}

View File

@@ -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);