Skip to content

Commit 7f563c0

Browse files
committed
create MessageDataLoader
1 parent 83431b1 commit 7f563c0

File tree

5 files changed

+228
-2
lines changed

5 files changed

+228
-2
lines changed

config/parameters.yml.dist

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,5 @@ parameters:
8989
env(MESSAGING_MAX_PROCESS_TIME): '600'
9090
messaging.max_mail_size: '%%env(MAX_MAILSIZE)%%'
9191
env(MAX_MAILSIZE): '209715200'
92+
messaging.default_message_age: '%env(DEFAULT_MESSAGEAGE)%'
93+
env(DEFAULT_MESSAGEAGE): '691200'

src/Domain/Configuration/Model/ConfigOption.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,12 @@ enum ConfigOption: string
1515
case SubscribeUrl = 'subscribeurl';
1616
case Domain = 'domain';
1717
case Website = 'website';
18+
case MessageFromAddress = 'message_from_address';
19+
case AlwaysAddGoogleTracking = 'always_add_googletracking';
20+
case AdminAddress = 'admin_address';
21+
case DefaultMessageTemplate = 'defaultmessagetemplate';
22+
case MessageFooter = 'messagefooter';
23+
case ForwardFooter = 'forwardfooter';
24+
case NotifyStartDefault = 'notifystart_default';
25+
case NotifyEndDefault = 'notifyend_default';
1826
}

src/Domain/Messaging/Repository/MessageDataRepository.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,10 @@ public function findByIdAndName(int $messageId, string $name): ?MessageData
1717
{
1818
return $this->findOneBy(['id' => $messageId, 'name' => $name]);
1919
}
20+
21+
/** @return MessageData[] */
22+
public function getForMessage(int $messageId): array
23+
{
24+
return $this->findBy(['id' => $messageId]);
25+
}
2026
}
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Messaging\Service;
6+
7+
use PhpList\Core\Domain\Configuration\Model\ConfigOption;
8+
use PhpList\Core\Domain\Configuration\Service\Provider\ConfigProvider;
9+
use PhpList\Core\Domain\Messaging\Model\Message;
10+
use PhpList\Core\Domain\Messaging\Repository\MessageDataRepository;
11+
12+
class MessageDataLoader
13+
{
14+
public function __construct(
15+
private readonly ConfigProvider $configProvider,
16+
private readonly MessageDataRepository $messageDataRepository,
17+
private readonly int $defaultMessageAge,
18+
) {
19+
}
20+
21+
public function __invoke(Message $message): array
22+
{
23+
$defaultFrom = $this->configProvider->getValue(ConfigOption::MessageFromAddress)
24+
?? $this->configProvider->getValue(ConfigOption::AdminAddress);
25+
26+
$finishSending = time() + $this->defaultMessageAge;
27+
28+
$messageData = [
29+
'template' => $this->configProvider->getValue(ConfigOption::DefaultMessageTemplate),
30+
'sendformat' => 'HTML',
31+
'message' => '',
32+
'forwardmessage' => '',
33+
'textmessage' => '',
34+
'rsstemplate' => '',
35+
'embargo' => [
36+
'year' => date('Y'),
37+
'month' => date('m'),
38+
'day' => date('d'),
39+
'hour' => date('H'),
40+
'minute' => date('i'),
41+
],
42+
'repeatinterval' => 0,
43+
'repeatuntil' => [
44+
'year' => date('Y'),
45+
'month' => date('m'),
46+
'day' => date('d'),
47+
'hour' => date('H'),
48+
'minute' => date('i'),
49+
],
50+
'requeueinterval' => 0,
51+
'requeueuntil' => [
52+
'year' => date('Y'),
53+
'month' => date('m'),
54+
'day' => date('d'),
55+
'hour' => date('H'),
56+
'minute' => date('i'),
57+
],
58+
'finishsending' => [
59+
'year' => date('Y', $finishSending),
60+
'month' => date('m', $finishSending),
61+
'day' => date('d', $finishSending),
62+
'hour' => date('H', $finishSending),
63+
'minute' => date('i', $finishSending),
64+
],
65+
'fromfield' => '',
66+
'subject' => '',
67+
'forwardsubject' => '',
68+
'footer' => $this->configProvider->getValue(ConfigOption::MessageFooter),
69+
'forwardfooter' => $this->configProvider->getValue(ConfigOption::ForwardFooter),
70+
'status' => '',
71+
'tofield' => '',
72+
'replyto' => '',
73+
'targetlist' => [],
74+
'criteria_match' => '',
75+
'sendurl' => '',
76+
'sendmethod' => 'inputhere',
77+
'testtarget' => '',
78+
'notify_start' => $this->configProvider->getValue(ConfigOption::NotifyStartDefault),
79+
'notify_end' => $this->configProvider->getValue(ConfigOption::NotifyEndDefault),
80+
'google_track' => filter_var(
81+
value: $this->configProvider->getValue(ConfigOption::AlwaysAddGoogleTracking),
82+
filter: FILTER_VALIDATE_BOOL
83+
),
84+
'excludelist' => [],
85+
'sentastest' => 0,
86+
];
87+
// todo: set correct values from entity
88+
$nonEmptyFields = array_filter(
89+
get_object_vars($message),
90+
fn($v) => $v !== null && $v !== '',
91+
);
92+
foreach ($nonEmptyFields as $key => $val) {
93+
$messageData[$key] = $val;
94+
}
95+
96+
$messageData['subject'] = $messageData['subject'] === '(no title)' ? '(no subject)' : $messageData['subject'];
97+
98+
$storedMessageData = $this->messageDataRepository->getForMessage($message->getId());
99+
foreach ($storedMessageData as $storedMessageDatum) {
100+
if (str_starts_with($storedMessageDatum->getData(), 'SER:')) {
101+
$unserialized = unserialize(substr($storedMessageDatum->getData(), 4));
102+
$data = array_walk_recursive($unserialized, 'stripslashes');
103+
} else {
104+
$data = stripslashes($storedMessageDatum->getData());
105+
}
106+
if (!in_array($storedMessageDatum->getName(), ['astext', 'ashtml', 'astextandhtml', 'aspdf', 'astextandpdf']))
107+
{
108+
//# don't overwrite counters in the message table from the data table
109+
$messageData[stripslashes($storedMessageDatum->getName())] = $data;
110+
}
111+
}
112+
113+
foreach (array('embargo', 'repeatuntil', 'requeueuntil') as $dateField) {
114+
if (!is_array($messageData[$dateField])) {
115+
$messageData[$dateField] = [
116+
'year' => date('Y'),
117+
'month' => date('m'),
118+
'day' => date('d'),
119+
'hour' => date('H'),
120+
'minute' => date('i'),
121+
];
122+
}
123+
}
124+
125+
foreach($message->getListMessages() as $listMessage) {
126+
$messageData['targetlist'][$listMessage->getListId()] = 1;
127+
}
128+
129+
//# backwards, check that the content has a url and use it to fill the sendurl
130+
if (empty($messageData['sendurl'])) {
131+
//# can't do "ungreedy matching, in case the URL has placeholders, but this can potentially throw problems
132+
if (!empty($messageData['message']) && preg_match('/\[URL:(.*)\]/i', $messageData['message'], $regs)) {
133+
$messageData['sendurl'] = $regs[1];
134+
}
135+
}
136+
if (empty($messageData['sendurl']) && !empty($messageData['message'])) {
137+
// if there's a message and no url, make sure to show the editor, and not the URL input
138+
$messageData['sendmethod'] = 'inputhere';
139+
}
140+
141+
//## parse the from field into it's components - email and name
142+
if (preg_match('/([^ ]+@[^ ]+)/', $messageData['fromfield'], $regs)) {
143+
// if there is an email in the from, rewrite it as "name <email>"
144+
$messageData['fromname'] = str_replace($regs[0], '', $messageData['fromfield']);
145+
$messageData['fromemail'] = $regs[0];
146+
// if the email has < and > take them out here
147+
$messageData['fromemail'] = str_replace('<', '', $messageData['fromemail']);
148+
$messageData['fromemail'] = str_replace('>', '', $messageData['fromemail']);
149+
// make sure there are no quotes around the name
150+
$messageData['fromname'] = str_replace('"', '', ltrim(rtrim($messageData['fromname'])));
151+
} elseif (strpos($messageData['fromfield'], ' ')) {
152+
// if there is a space, we need to add the email
153+
$messageData['fromname'] = $messageData['fromfield'];
154+
// $cached[$messageid]["fromemail"] = "listmaster@$domain";
155+
$messageData['fromemail'] = $defaultFrom;
156+
} else {
157+
$messageData['fromemail'] = $defaultFrom;
158+
$messageData['fromname'] = $messageData['fromfield'];
159+
}
160+
// disallow an email address in the name
161+
if (preg_match('/([^ ]+@[^ ]+)/', $messageData['fromname'], $regs)) {
162+
$messageData['fromname'] = str_replace($regs[0], '', $messageData['fromname']);
163+
}
164+
// clean up
165+
$messageData['fromemail'] = str_replace(',', '', $messageData['fromemail']);
166+
$messageData['fromname'] = str_replace(',', '', $messageData['fromname']);
167+
168+
$messageData['fromname'] = trim($messageData['fromname']);
169+
170+
// erase double spacing
171+
while (strpos($messageData['fromname'], ' ')) {
172+
$messageData['fromname'] = str_replace(' ', ' ', $messageData['fromname']);
173+
}
174+
175+
//# if the name ends up being empty, copy the email
176+
if (empty($messageData['fromname'])) {
177+
$messageData['fromname'] = $messageData['fromemail'];
178+
}
179+
180+
if (isset($messageData['targetlist']['unselect'])) {
181+
unset($messageData['targetlist']['unselect']);
182+
}
183+
if (isset($messageData['excludelist']['unselect'])) {
184+
unset($messageData['excludelist']['unselect']);
185+
}
186+
187+
if (empty($messageData['campaigntitle'])) {
188+
if ($messageData['subject'] != '(no subject)') {
189+
$messageData['campaigntitle'] = $messageData['subject'];
190+
} else {
191+
$messageData['campaigntitle'] = '(no title)';
192+
}
193+
}
194+
//# copy subject to title
195+
if ($messageData['campaigntitle'] == '(no title)' && $messageData['subject'] != '(no subject)') {
196+
$messageData['campaigntitle'] = $messageData['subject'];
197+
}
198+
199+
return $messageData;
200+
}
201+
}

src/Domain/Messaging/Service/MessagePrecacheService.php

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44

55
namespace PhpList\Core\Domain\Messaging\Service;
66

7+
use PhpList\Core\Domain\Configuration\Model\ConfigOption;
8+
use PhpList\Core\Domain\Configuration\Service\Provider\ConfigProvider;
79
use PhpList\Core\Domain\Messaging\Model\Message;
810
use Psr\SimpleCache\CacheInterface;
911

1012
class MessagePrecacheService
1113
{
12-
public function __construct(private readonly CacheInterface $cache)
13-
{
14+
public function __construct(
15+
private readonly CacheInterface $cache,
16+
private readonly MessageDataLoader $messageDataLoader,
17+
private readonly ConfigProvider $configProvider,
18+
) {
1419
}
1520

1621
/**
@@ -27,6 +32,10 @@ public function getOrCacheBaseMessageContent(Message $campaign): Message\Message
2732
return $cached;
2833
}
2934

35+
$domain = $this->configProvider->getValue(ConfigOption::Domain);
36+
37+
$loadedMessageData = ($this->messageDataLoader)($campaign);
38+
3039
$content = $campaign->getContent();
3140
$subject = $content->getSubject();
3241
$html = $content->getText();

0 commit comments

Comments
 (0)