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() { public function getTotalClicksCount() {
return $this->clicks->count(); 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; namespace MailPoet\Newsletter\Links;
use MailPoet\Cron\Workers\StatsNotifications\NewsletterLinkRepository;
use MailPoet\DI\ContainerWrapper; use MailPoet\DI\ContainerWrapper;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterLinkEntity; use MailPoet\Entities\NewsletterLinkEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\InvalidStateException; 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\Categories\Link;
use MailPoet\Newsletter\Shortcodes\Shortcodes; use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Router\Endpoints\Track as TrackEndpoint; use MailPoet\Router\Endpoints\Track as TrackEndpoint;
@@ -28,12 +32,27 @@ class Links {
/** @var SubscribersRepository */ /** @var SubscribersRepository */
private $subscribersRepository; private $subscribersRepository;
/** @var NewsletterLinkRepository */
private $newsletterLinkRepository;
/** @var NewslettersRepository */
private $newslettersRepository;
/** @var SendingQueuesRepository */
private $sendingQueueRepository;
public function __construct( public function __construct(
LinkTokens $linkTokens, LinkTokens $linkTokens,
SubscribersRepository $subscribersRepository SubscribersRepository $subscribersRepository,
NewsletterLinkRepository $newsletterLinkRepository,
NewslettersRepository $newslettersRepository,
SendingQueuesRepository $sendingQueuesRepository
) { ) {
$this->linkTokens = $linkTokens; $this->linkTokens = $linkTokens;
$this->subscribersRepository = $subscribersRepository; $this->subscribersRepository = $subscribersRepository;
$this->newsletterLinkRepository = $newsletterLinkRepository;
$this->newslettersRepository = $newslettersRepository;
$this->sendingQueueRepository = $sendingQueuesRepository;
} }
public function process($content, $newsletterId, $queueId) { public function process($content, $newsletterId, $queueId) {
@@ -142,16 +161,26 @@ class Links {
public function save(array $links, $newsletterId, $queueId) { public function save(array $links, $newsletterId, $queueId) {
foreach ($links as $link) { foreach ($links as $link) {
if (isset($link['id'])) if (isset($link['id'])) {
continue; continue;
if (empty($link['hash']) || empty($link['link'])) continue; }
$newsletterLink = NewsletterLink::create();
$newsletterLink->newsletterId = $newsletterId; if (empty($link['hash']) || empty($link['link'])) {
$newsletterLink->queueId = $queueId; continue;
$newsletterLink->hash = $link['hash']; }
$newsletterLink->url = $link['link'];
$newsletterLink->save(); $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) { public function ensureInstantUnsubscribeLink(array $processedLinks) {
@@ -173,16 +202,19 @@ class Links {
$links = array_unique(Helpers::flattenArray($links)); $links = array_unique(Helpers::flattenArray($links));
foreach ($links as $link) { foreach ($links as $link) {
$linkHash = explode('-', $link); $linkHash = explode('-', $link);
if (!isset($linkHash[1])) continue;
$newsletterLink = NewsletterLink::where('hash', $linkHash[1]) if (!isset($linkHash[1])) {
->where('queue_id', $queueId) continue;
->findOne(); }
$newsletterLink = $this->newsletterLinkRepository->findOneBy(['hash' => $linkHash[1], 'queue' => $queueId]);
// convert either only link shortcodes or all hashes links if "convert all" // convert either only link shortcodes or all hashes links if "convert all"
// option is specified // option is specified
if (($newsletterLink instanceof NewsletterLink) && if (($newsletterLink instanceof NewsletterLinkEntity) &&
(preg_match('/\[link:/', $newsletterLink->url) || $convertAll) (preg_match('/\[link:/', $newsletterLink->getUrl()) || $convertAll)
) { ) {
$content = str_replace($link, $newsletterLink->url, $content); $content = str_replace($link, $newsletterLink->getUrl(), $content);
} }
} }
return $content; return $content;
@@ -251,12 +283,13 @@ class Links {
} }
private function load($newsletterId, $queueId) { private function load($newsletterId, $queueId) {
$links = NewsletterLink::whereEqual('newsletter_id', $newsletterId) $links = $this->newsletterLinkRepository->findBy(
->whereEqual('queue_id', $queueId) ['newsletter' => $newsletterId, 'queue' => $queueId]
->findMany(); );
$savedLinks = []; $savedLinks = [];
foreach ($links as $link) { foreach ($links as $link) {
$savedLinks[$link->url] = $link->asArray(); $savedLinks[$link->getUrl()] = $link->toArray();
} }
return $savedLinks; return $savedLinks;
} }

View File

@@ -406,8 +406,10 @@ class NewsletterTest extends \MailPoetTest {
->expects($this->once()) ->expects($this->once())
->method('getErrors') ->method('getErrors')
->willReturn([]); ->willReturn([]);
$queueMock->id = $queue->id; $queueMock
$queueMock->taskId = $queue->taskId; ->expects($this->any())
->method('__get')
->will($this->onConsecutiveCalls($queue->id, $queue->taskId, $queue->id));
$sendingQueue = ORM::forTable(SendingQueue::$_table)->findOne($queue->id); $sendingQueue = ORM::forTable(SendingQueue::$_table)->findOne($queue->id);
assert($sendingQueue instanceof ORM); assert($sendingQueue instanceof ORM);
@@ -438,8 +440,10 @@ class NewsletterTest extends \MailPoetTest {
->expects($this->once()) ->expects($this->once())
->method('getErrors') ->method('getErrors')
->willReturn([]); ->willReturn([]);
$queueMock->id = $queue->id; $queueMock
$queueMock->taskId = $queue->taskId; ->expects($this->any())
->method('__get')
->will($this->onConsecutiveCalls($queue->id, $queue->taskId, $queue->id, $queue->newsletterRenderedBody));
// properly serialized object // properly serialized object
$sendingQueue = ORM::forTable(SendingQueue::$_table)->findOne($queue->id); $sendingQueue = ORM::forTable(SendingQueue::$_table)->findOne($queue->id);