Skip to content

Commit 60a681d

Browse files
committed
Add history
1 parent 6d971e9 commit 60a681d

File tree

3 files changed

+75
-27
lines changed

3 files changed

+75
-27
lines changed

src/Domain/Subscription/Service/Manager/SubscriberHistoryManager.php

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

77
use PhpList\Core\Domain\Common\ClientIpResolver;
88
use PhpList\Core\Domain\Common\SystemInfoCollector;
9+
use PhpList\Core\Domain\Identity\Model\Administrator;
910
use PhpList\Core\Domain\Subscription\Model\Filter\SubscriberHistoryFilter;
1011
use PhpList\Core\Domain\Subscription\Model\Subscriber;
1112
use PhpList\Core\Domain\Subscription\Model\SubscriberHistory;
@@ -44,4 +45,45 @@ public function addHistory(Subscriber $subscriber, string $message, ?string $det
4445

4546
return $subscriberHistory;
4647
}
48+
49+
public function addHistoryFromImport(
50+
Subscriber $subscriber,
51+
array $listLines,
52+
array $updatedData,
53+
?Administrator $admin = null,
54+
): void {
55+
if (!$admin) {
56+
$headerLine = 'API-v2-import - CLI: ' . PHP_EOL . PHP_EOL;
57+
} else {
58+
$headerLine = 'API-v2-import - adminId: ' . $admin->getId() . PHP_EOL . PHP_EOL;
59+
}
60+
61+
$lines = [];
62+
63+
if (empty($updatedData) && empty($listLines)) {
64+
$lines[] = 'No user details changed';
65+
} else {
66+
$skip = ['password', 'modified'];
67+
foreach ($updatedData as $field => [$old, $new]) {
68+
if (in_array($field, $skip, true)) {
69+
continue;
70+
}
71+
$lines[] = sprintf(
72+
"%s = %s\n*changed* from %s",
73+
$field,
74+
json_encode($new),
75+
json_encode($old)
76+
);
77+
}
78+
foreach ($listLines as $line) {
79+
$lines[] = $line;
80+
}
81+
}
82+
83+
$this->addHistory(
84+
subscriber: $subscriber,
85+
message: 'Import by ' . $admin->getLoginName(),
86+
details: $headerLine . implode(PHP_EOL, $lines) . PHP_EOL
87+
);
88+
}
4789
}

src/Domain/Subscription/Service/Manager/SubscriberManager.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public function createFromImport(ImportSubscriberDto $subscriberDto): Subscriber
136136
return $subscriber;
137137
}
138138

139-
public function updateFromImport(Subscriber $existingSubscriber, ImportSubscriberDto $subscriberDto): Subscriber
139+
public function updateFromImport(Subscriber $existingSubscriber, ImportSubscriberDto $subscriberDto): array
140140
{
141141
$existingSubscriber->setEmail($subscriberDto->email);
142142
$existingSubscriber->setConfirmed($subscriberDto->confirmed);
@@ -145,7 +145,11 @@ public function updateFromImport(Subscriber $existingSubscriber, ImportSubscribe
145145
$existingSubscriber->setDisabled($subscriberDto->disabled);
146146
$existingSubscriber->setExtraData($subscriberDto->extraData);
147147

148-
return $existingSubscriber;
148+
$uow = $this->entityManager->getUnitOfWork();
149+
$meta = $this->entityManager->getClassMetadata(Subscriber::class);
150+
$uow->computeChangeSet($meta, $existingSubscriber);
151+
152+
return $uow->getEntityChangeSet($existingSubscriber);
149153
}
150154

151155
public function decrementBounceCount(Subscriber $subscriber): void

src/Domain/Subscription/Service/SubscriberCsvImporter.php

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace PhpList\Core\Domain\Subscription\Service;
66

77
use Doctrine\ORM\EntityManagerInterface;
8+
use PhpList\Core\Domain\Identity\Model\Administrator;
89
use PhpList\Core\Domain\Messaging\Message\SubscriptionConfirmationMessage;
910
use PhpList\Core\Domain\Subscription\Exception\CouldNotReadUploadedFileException;
1011
use PhpList\Core\Domain\Subscription\Model\Dto\ImportSubscriberDto;
@@ -13,6 +14,7 @@
1314
use PhpList\Core\Domain\Subscription\Repository\SubscriberAttributeDefinitionRepository;
1415
use PhpList\Core\Domain\Subscription\Repository\SubscriberRepository;
1516
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberAttributeManager;
17+
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberHistoryManager;
1618
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberManager;
1719
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriptionManager;
1820
use Symfony\Component\HttpFoundation\File\UploadedFile;
@@ -35,6 +37,7 @@ class SubscriberCsvImporter
3537
private EntityManagerInterface $entityManager;
3638
private TranslatorInterface $translator;
3739
private MessageBusInterface $messageBus;
40+
private SubscriberHistoryManager $subscriberHistoryManager;
3841

3942
public function __construct(
4043
SubscriberManager $subscriberManager,
@@ -46,6 +49,7 @@ public function __construct(
4649
EntityManagerInterface $entityManager,
4750
TranslatorInterface $translator,
4851
MessageBusInterface $messageBus,
52+
SubscriberHistoryManager $subscriberHistoryManager,
4953
) {
5054
$this->subscriberManager = $subscriberManager;
5155
$this->attributeManager = $attributeManager;
@@ -56,17 +60,18 @@ public function __construct(
5660
$this->entityManager = $entityManager;
5761
$this->translator = $translator;
5862
$this->messageBus = $messageBus;
63+
$this->subscriberHistoryManager = $subscriberHistoryManager;
5964
}
6065

6166
/**
6267
* Import subscribers from a CSV file.
6368
*
6469
* @param UploadedFile $file The uploaded CSV file
6570
* @param SubscriberImportOptions $options
71+
* @param ?Administrator $admin
6672
* @return array Import statistics
67-
* @throws CouldNotReadUploadedFileException When the uploaded file cannot be read during import
6873
*/
69-
public function importFromCsv(UploadedFile $file, SubscriberImportOptions $options): array
74+
public function importFromCsv(UploadedFile $file, SubscriberImportOptions $options, ?Administrator $admin = null): array
7075
{
7176
$stats = [
7277
'created' => 0,
@@ -88,7 +93,7 @@ public function importFromCsv(UploadedFile $file, SubscriberImportOptions $optio
8893

8994
foreach ($result['valid'] as $dto) {
9095
try {
91-
$this->processRow($dto, $options, $stats);
96+
$this->processRow($dto, $options, $stats, $admin);
9297
} catch (Throwable $e) {
9398
$stats['errors'][] = $this->translator->trans(
9499
'Error processing %email%: %error%',
@@ -118,11 +123,12 @@ public function importFromCsv(UploadedFile $file, SubscriberImportOptions $optio
118123
* @param UploadedFile $file The uploaded CSV file
119124
* @return array Import statistics
120125
*/
121-
public function importAndUpdateFromCsv(UploadedFile $file, ?array $listIds = [], bool $dryRun = false): array
126+
public function importAndUpdateFromCsv(UploadedFile $file, Administrator $admin, ?array $listIds = [], bool $dryRun = false): array
122127
{
123128
return $this->importFromCsv(
124129
file: $file,
125-
options: new SubscriberImportOptions(updateExisting: true, listIds: $listIds, dryRun: $dryRun)
130+
options: new SubscriberImportOptions(updateExisting: true, listIds: $listIds, dryRun: $dryRun),
131+
admin: $admin,
126132
);
127133
}
128134

@@ -132,25 +138,23 @@ public function importAndUpdateFromCsv(UploadedFile $file, ?array $listIds = [],
132138
* @param UploadedFile $file The uploaded CSV file
133139
* @return array Import statistics
134140
*/
135-
public function importNewFromCsv(UploadedFile $file, ?array $listIds = [], bool $dryRun = false): array
141+
public function importNewFromCsv(UploadedFile $file, Administrator $admin, ?array $listIds = [], bool $dryRun = false): array
136142
{
137143
return $this->importFromCsv(
138144
file: $file,
139-
options: new SubscriberImportOptions(listIds: $listIds, dryRun: $dryRun)
145+
options: new SubscriberImportOptions(listIds: $listIds, dryRun: $dryRun),
146+
admin: $admin,
140147
);
141148
}
142149

143150
/**
144151
* Process a single row from the CSV file.
145-
*
146-
* @param ImportSubscriberDto $dto
147-
* @param SubscriberImportOptions $options
148-
* @param array $stats Statistics to update
149152
*/
150153
private function processRow(
151154
ImportSubscriberDto $dto,
152155
SubscriberImportOptions $options,
153156
array &$stats,
157+
?Administrator $admin = null
154158
): void {
155159
if ($this->handleInvalidEmail($dto, $options, $stats)) {
156160
return;
@@ -164,7 +168,7 @@ private function processRow(
164168
}
165169

166170
if ($subscriber) {
167-
$this->subscriberManager->updateFromImport($subscriber, $dto);
171+
$updatedData = $this->subscriberManager->updateFromImport($subscriber, $dto);
168172
$stats['updated']++;
169173
} else {
170174
$subscriber = $this->subscriberManager->createFromImport($dto);
@@ -174,11 +178,13 @@ private function processRow(
174178
$this->processAttributes($subscriber, $dto);
175179

176180
$addedNewSubscriberToList = false;
181+
$listLines = [];
177182
if (!$subscriber->isBlacklisted() && count($options->listIds) > 0) {
178183
foreach ($options->listIds as $listId) {
179184
$created = $this->subscriptionManager->addSubscriberToAList($subscriber, $listId);
180185
if ($created) {
181186
$addedNewSubscriberToList = true;
187+
$listLines[] = sprintf('Subscribed to %s', $created->getSubscriberList()->getName());
182188
}
183189
}
184190
}
@@ -187,6 +193,7 @@ private function processRow(
187193
$stats['blacklisted']++;
188194
}
189195

196+
$this->subscriberHistoryManager->addHistoryFromImport($subscriber, $listLines, $updatedData ?? [], $admin);
190197
$this->handleFlushAndEmail($subscriber, $options, $dto, $addedNewSubscriberToList);
191198
}
192199

@@ -219,23 +226,18 @@ private function handleFlushAndEmail(
219226
if (!$options->dryRun) {
220227
$this->entityManager->flush();
221228
if ($dto->sendConfirmation && $addedNewSubscriberToList) {
222-
$this->sendSubscribeEmail($subscriber, $options->listIds);
229+
$message = new SubscriptionConfirmationMessage(
230+
email: $subscriber->getEmail(),
231+
uniqueId: $subscriber->getUniqueId(),
232+
listIds: $options->listIds,
233+
htmlEmail: $subscriber->hasHtmlEmail(),
234+
);
235+
236+
$this->messageBus->dispatch($message);
223237
}
224238
}
225239
}
226240

227-
private function sendSubscribeEmail(Subscriber $subscriber, array $listIds): void
228-
{
229-
$message = new SubscriptionConfirmationMessage(
230-
email: $subscriber->getEmail(),
231-
uniqueId: $subscriber->getUniqueId(),
232-
listIds: $listIds,
233-
htmlEmail: $subscriber->hasHtmlEmail(),
234-
);
235-
236-
$this->messageBus->dispatch($message);
237-
}
238-
239241
/**
240242
* Process subscriber attributes.
241243
*

0 commit comments

Comments
 (0)