Skip to content

Commit a72d2e9

Browse files
committed
UserPersonalizer in CampaignProcessorMessageHandler
1 parent 83431b1 commit a72d2e9

File tree

5 files changed

+33
-25
lines changed

5 files changed

+33
-25
lines changed

src/Domain/Messaging/MessageHandler/CampaignProcessorMessageHandler.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace PhpList\Core\Domain\Messaging\MessageHandler;
66

77
use Doctrine\ORM\EntityManagerInterface;
8+
use PhpList\Core\Domain\Configuration\Service\UserPersonalizer;
89
use PhpList\Core\Domain\Messaging\Exception\MessageSizeLimitExceededException;
910
use PhpList\Core\Domain\Messaging\Message\CampaignProcessorMessage;
1011
use PhpList\Core\Domain\Messaging\Message\SyncCampaignProcessorMessage;
@@ -56,6 +57,7 @@ public function __construct(
5657
private readonly EventLogManager $eventLogManager,
5758
private readonly MessageDataManager $messageDataManager,
5859
private readonly MessagePrecacheService $precacheService,
60+
private readonly UserPersonalizer $userPersonalizer,
5961
?int $maxMailSize = null,
6062
) {
6163
$this->maxMailSize = $maxMailSize ?? 0;
@@ -159,6 +161,8 @@ private function handleEmailSending(
159161
Message\MessageContent $precachedContent,
160162
): void {
161163
$processed = $this->messagePreparator->processMessageLinks($campaign->getId(), $precachedContent, $subscriber);
164+
$processed->setText($this->userPersonalizer->personalize($processed->getText(), $subscriber->getEmail()));
165+
$processed->setFooter($this->userPersonalizer->personalize($processed->getFooter(), $subscriber->getEmail()));
162166

163167
try {
164168
$email = $this->mailer->composeEmail($campaign, $subscriber, $processed);

src/Domain/Messaging/Service/MessageProcessingPreparator.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
namespace PhpList\Core\Domain\Messaging\Service;
66

77
use PhpList\Core\Domain\Analytics\Service\LinkTrackService;
8-
use PhpList\Core\Domain\Configuration\Service\UserPersonalizer;
9-
use PhpList\Core\Domain\Messaging\Model\Message;
108
use PhpList\Core\Domain\Messaging\Model\Message\MessageContent;
119
use PhpList\Core\Domain\Messaging\Repository\MessageRepository;
1210
use PhpList\Core\Domain\Subscription\Model\Subscriber;
@@ -24,7 +22,6 @@ public function __construct(
2422
private readonly MessageRepository $messageRepository,
2523
private readonly LinkTrackService $linkTrackService,
2624
private readonly TranslatorInterface $translator,
27-
private readonly UserPersonalizer $userPersonalizer,
2825
) {
2926
}
3027

@@ -78,16 +75,14 @@ public function processMessageLinks(
7875

7976
$htmlText = $content->getText();
8077
$footer = $content->getFooter();
81-
// todo: check other configured data that should be used in mail formatting/creation
78+
// todo: check if getTextMessage should replace links as well
8279
if ($htmlText !== null) {
8380
$htmlText = $this->replaceLinks($savedLinks, $htmlText);
84-
$htmlText = $this->userPersonalizer->personalize($htmlText, $subscriber->getEmail());
8581
$content->setText($htmlText);
8682
}
8783

8884
if ($footer !== null) {
8985
$footer = $this->replaceLinks($savedLinks, $footer);
90-
$footer = $this->userPersonalizer->personalize($footer, $subscriber->getEmail());
9186
$content->setFooter($footer);
9287
}
9388

src/Domain/Messaging/Service/RateLimitedCampaignMailer.php

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,26 @@ public function __construct(MailerInterface $mailer, SendRateLimiter $limiter)
2020
$this->limiter = $limiter;
2121
}
2222

23-
public function composeEmail(Message $processed, Subscriber $subscriber, Message\MessageContent $content): Email
24-
{
23+
public function composeEmail(
24+
Message $message,
25+
Subscriber $subscriber,
26+
Message\MessageContent $processedContent,
27+
): Email {
2528
$email = new Email();
26-
if ($processed->getOptions()->getFromField() !== '') {
27-
$email->from($processed->getOptions()->getFromField());
29+
if ($message->getOptions()->getFromField() !== '') {
30+
$email->from($message->getOptions()->getFromField());
2831
}
2932

30-
if ($processed->getOptions()->getReplyTo() !== '') {
31-
$email->replyTo($processed->getOptions()->getReplyTo());
33+
if ($message->getOptions()->getReplyTo() !== '') {
34+
$email->replyTo($message->getOptions()->getReplyTo());
3235
}
3336

3437
return $email
3538
->to($subscriber->getEmail())
36-
->subject($content->getSubject())
39+
->subject($processedContent->getSubject())
3740
// todo: check HTML2Text functionality
38-
->text($content->getTextMessage())
39-
->html($content->getText());
41+
->text($processedContent->getTextMessage())
42+
->html($processedContent->getText());
4043
}
4144

4245
/**

tests/Unit/Domain/Messaging/MessageHandler/CampaignProcessorMessageHandlerTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Doctrine\ORM\EntityManagerInterface;
88
use Exception;
99
use PhpList\Core\Domain\Configuration\Service\Manager\EventLogManager;
10+
use PhpList\Core\Domain\Configuration\Service\UserPersonalizer;
1011
use PhpList\Core\Domain\Messaging\Message\CampaignProcessorMessage;
1112
use PhpList\Core\Domain\Messaging\MessageHandler\CampaignProcessorMessageHandler;
1213
use PhpList\Core\Domain\Messaging\Model\Message;
@@ -57,10 +58,18 @@ protected function setUp(): void
5758
$requeueHandler = $this->createMock(RequeueHandler::class);
5859
$this->translator = $this->createMock(Translator::class);
5960
$this->precacheService = $this->createMock(MessagePrecacheService::class);
61+
$userPersonalizer = $this->createMock(UserPersonalizer::class);
6062

6163
$timeLimiter->method('start');
6264
$timeLimiter->method('shouldStop')->willReturn(false);
6365

66+
// Ensure personalization returns original text so assertions on replaced links remain valid
67+
$userPersonalizer
68+
->method('personalize')
69+
->willReturnCallback(function (string $text) {
70+
return $text;
71+
});
72+
6473
$this->handler = new CampaignProcessorMessageHandler(
6574
mailer: $this->mailer,
6675
entityManager: $this->entityManager,
@@ -77,6 +86,7 @@ protected function setUp(): void
7786
eventLogManager: $this->createMock(EventLogManager::class),
7887
messageDataManager: $this->createMock(MessageDataManager::class),
7988
precacheService: $this->precacheService,
89+
userPersonalizer: $userPersonalizer,
8090
maxMailSize: 0,
8191
);
8292
}
@@ -166,6 +176,8 @@ public function testInvokeWithValidSubscriberEmail(): void
166176
{
167177
$campaign = $this->createMock(Message::class);
168178
$content = $this->createContentMock();
179+
$content->method('getText')->willReturn('<p>Test HTML message</p>');
180+
$content->method('getFooter')->willReturn('<p>Test footer message</p>');
169181
$campaign->method('getContent')->willReturn($content);
170182
$metadata = $this->createMock(MessageMetadata::class);
171183
$campaign->method('getMetadata')->willReturn($metadata);
@@ -225,6 +237,8 @@ public function testInvokeWithMailerException(): void
225237
{
226238
$campaign = $this->createMock(Message::class);
227239
$content = $this->createContentMock();
240+
$content->method('getText')->willReturn('<p>Test HTML message</p>');
241+
$content->method('getFooter')->willReturn('<p>Test footer message</p>');
228242
$metadata = $this->createMock(MessageMetadata::class);
229243
$campaign->method('getContent')->willReturn($content);
230244
$campaign->method('getMetadata')->willReturn($metadata);
@@ -278,6 +292,8 @@ public function testInvokeWithMultipleSubscribers(): void
278292
{
279293
$campaign = $this->createCampaignMock();
280294
$content = $this->createContentMock();
295+
$content->method('getText')->willReturn('<p>Test HTML message</p>');
296+
$content->method('getFooter')->willReturn('<p>Test footer message</p>');
281297
$metadata = $this->createMock(MessageMetadata::class);
282298
$campaign->method('getMetadata')->willReturn($metadata);
283299
$campaign->method('getId')->willReturn(1);

tests/Unit/Domain/Messaging/Service/MessageProcessingPreparatorTest.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use PhpList\Core\Domain\Analytics\Model\LinkTrack;
88
use PhpList\Core\Domain\Analytics\Service\LinkTrackService;
9-
use PhpList\Core\Domain\Configuration\Service\UserPersonalizer;
109
use PhpList\Core\Domain\Messaging\Model\Message\MessageContent;
1110
use PhpList\Core\Domain\Messaging\Repository\MessageRepository;
1211
use PhpList\Core\Domain\Messaging\Service\MessageProcessingPreparator;
@@ -23,7 +22,6 @@ class MessageProcessingPreparatorTest extends TestCase
2322
private SubscriberRepository&MockObject $subscriberRepository;
2423
private MessageRepository&MockObject $messageRepository;
2524
private LinkTrackService&MockObject $linkTrackService;
26-
private UserPersonalizer&MockObject $userPersonalizer;
2725
private OutputInterface&MockObject $output;
2826
private MessageProcessingPreparator $preparator;
2927

@@ -32,21 +30,13 @@ protected function setUp(): void
3230
$this->subscriberRepository = $this->createMock(SubscriberRepository::class);
3331
$this->messageRepository = $this->createMock(MessageRepository::class);
3432
$this->linkTrackService = $this->createMock(LinkTrackService::class);
35-
$this->userPersonalizer = $this->createMock(UserPersonalizer::class);
36-
// Ensure personalization returns original text so assertions on replaced links remain valid
37-
$this->userPersonalizer
38-
->method('personalize')
39-
->willReturnCallback(function (string $text) {
40-
return $text;
41-
});
4233
$this->output = $this->createMock(OutputInterface::class);
4334

4435
$this->preparator = new MessageProcessingPreparator(
4536
subscriberRepository: $this->subscriberRepository,
4637
messageRepository: $this->messageRepository,
4738
linkTrackService: $this->linkTrackService,
4839
translator: new Translator('en'),
49-
userPersonalizer: $this->userPersonalizer,
5040
);
5141
}
5242

0 commit comments

Comments
 (0)