Skip to content

Commit b01f665

Browse files
committed
Add changeSetDto
1 parent f976d46 commit b01f665

File tree

13 files changed

+260
-56
lines changed

13 files changed

+260
-56
lines changed

config/services/providers.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ services:
2828
arguments:
2929
$cache: '@Psr\SimpleCache\CacheInterface'
3030

31-
PhpList\Core\Domain\Subscription\Service\Provider\SubscriberAttributeProvider:
31+
PhpList\Core\Domain\Subscription\Service\Provider\SubscriberAttributeChangeSetProvider:
3232
autowire: true

resources/translations/messages.en.xlf

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,20 @@ Thank you.</target>
712712
<source>Update by %admin%</source>
713713
<target>__Update by %admin%</target>
714714
</trans-unit>
715+
<trans-unit id="7oMcCd6" resname="(no data)">
716+
<source>(no data)</source>
717+
<target>__(no data)</target>
718+
</trans-unit>
719+
<trans-unit id="rSZSC.W" resname="%attribute% = %new_value% &#10; changed from %old_value%">
720+
<source>%attribute% = %new_value%
721+
changed from %old_value%</source>
722+
<target>__%attribute% = %new_value%
723+
changed from %old_value%</target>
724+
</trans-unit>
725+
<trans-unit id="jkLAivD" resname="No data changed">
726+
<source>No data changed</source>
727+
<target>__No data changed</target>
728+
</trans-unit>
715729
</body>
716730
</file>
717731
</xliff>

src/Domain/Messaging/Service/Processor/CampaignProcessor.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424

2525
/**
2626
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
27+
* @SuppressWarnings(PHPMD.StaticAccess)
28+
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
2729
*/
2830
class CampaignProcessor
2931
{
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Subscription\Model\Dto;
6+
7+
class ChangeSetDto
8+
{
9+
public const IGNORED_ATTRIBUTES = ['password', 'modified'];
10+
11+
/**
12+
* @var array<string, array{0: mixed, 1: mixed}>
13+
*
14+
* Example:
15+
* [
16+
* 'email' => [null, '[email protected]'],
17+
* 'isActive' => [true, false]
18+
* ]
19+
*/
20+
private array $changes = [];
21+
22+
/**
23+
* @param array<string, array{0: mixed, 1: mixed}> $changes
24+
*/
25+
public function __construct(array $changes = [])
26+
{
27+
$this->changes = $changes;
28+
}
29+
30+
/**
31+
* @return array<string, array{0: mixed, 1: mixed}>
32+
*/
33+
public function getChanges(): array
34+
{
35+
return $this->changes;
36+
}
37+
38+
public function hasChanges(): bool
39+
{
40+
return !empty($this->changes);
41+
}
42+
43+
public function hasField(string $field): bool
44+
{
45+
return array_key_exists($field, $this->changes);
46+
}
47+
48+
/**
49+
* @return array{0: mixed, 1: mixed}|null
50+
*/
51+
public function getFieldChange(string $field): ?array
52+
{
53+
return $this->changes[$field] ?? null;
54+
}
55+
56+
/**
57+
* @return mixed|null
58+
*/
59+
public function getOldValue(string $field): mixed
60+
{
61+
return $this->changes[$field][0] ?? null;
62+
}
63+
64+
/**
65+
* @return mixed|null
66+
*/
67+
public function getNewValue(string $field): mixed
68+
{
69+
return $this->changes[$field][1] ?? null;
70+
}
71+
72+
public function toArray(): array
73+
{
74+
return $this->changes;
75+
}
76+
77+
public static function fromDoctrineChangeSet(array $changeSet): self
78+
{
79+
return new self($changeSet);
80+
}
81+
}

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public function createOrUpdate(
3737
SubscriberAttributeDefinition $definition,
3838
?string $value = null
3939
): SubscriberAttributeValue {
40+
// phpcs:ignore Generic.Commenting.Todo
41+
// todo: clarify which attributes can be created/updated
4042
$subscriberAttribute = $this->attributeRepository
4143
->findOneBySubscriberAndAttribute($subscriber, $definition);
4244

@@ -65,11 +67,9 @@ public function delete(SubscriberAttributeValue $attribute): void
6567
$this->attributeRepository->remove($attribute);
6668
}
6769

68-
public function processAttributes(Subscriber $subscriber, array $extraData): void
70+
public function processAttributes(Subscriber $subscriber, array $attributeData): void
6971
{
70-
// $oldAttributesMap = $this->subscriberAttributeProvider->getMappedValues($subscriber);
71-
72-
foreach ($extraData as $key => $value) {
72+
foreach ($attributeData as $key => $value) {
7373
$lowerKey = strtolower((string)$key);
7474
if (in_array($lowerKey, ['password', 'modified'], true)) {
7575
continue;
@@ -84,7 +84,5 @@ public function processAttributes(Subscriber $subscriber, array $extraData): voi
8484
);
8585
}
8686
}
87-
88-
// $newAttributesMap = $this->subscriberAttributeProvider->getMappedValues($subscriber);
8987
}
9088
}

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

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
namespace PhpList\Core\Domain\Subscription\Service\Manager;
66

7+
use Doctrine\ORM\EntityManagerInterface;
78
use PhpList\Core\Domain\Common\ClientIpResolver;
89
use PhpList\Core\Domain\Common\SystemInfoCollector;
910
use PhpList\Core\Domain\Identity\Model\Administrator;
11+
use PhpList\Core\Domain\Subscription\Model\Dto\ChangeSetDto;
1012
use PhpList\Core\Domain\Subscription\Model\Filter\SubscriberHistoryFilter;
1113
use PhpList\Core\Domain\Subscription\Model\Subscriber;
1214
use PhpList\Core\Domain\Subscription\Model\SubscriberHistory;
@@ -19,17 +21,20 @@ class SubscriberHistoryManager
1921
private ClientIpResolver $clientIpResolver;
2022
private SystemInfoCollector $systemInfoCollector;
2123
private TranslatorInterface $translator;
24+
private EntityManagerInterface $entityManager;
2225

2326
public function __construct(
2427
SubscriberHistoryRepository $repository,
2528
ClientIpResolver $clientIpResolver,
2629
SystemInfoCollector $systemInfoCollector,
2730
TranslatorInterface $translator,
31+
EntityManagerInterface $entityManager,
2832
) {
2933
$this->repository = $repository;
3034
$this->clientIpResolver = $clientIpResolver;
3135
$this->systemInfoCollector = $systemInfoCollector;
3236
$this->translator = $translator;
37+
$this->entityManager = $entityManager;
3338
}
3439

3540
public function getHistory(int $lastId, int $limit, SubscriberHistoryFilter $filter): array
@@ -45,20 +50,47 @@ public function addHistory(Subscriber $subscriber, string $message, ?string $det
4550
$subscriberHistory->setSystemInfo($this->systemInfoCollector->collectAsString());
4651
$subscriberHistory->setIp($this->clientIpResolver->resolve());
4752

48-
$this->repository->save($subscriberHistory);
53+
$this->entityManager->persist($subscriberHistory);
4954

5055
return $subscriberHistory;
5156
}
5257

58+
public function addHistoryFromChangeSet(
59+
Subscriber $subscriber,
60+
string $message,
61+
ChangeSetDto $changeSet,
62+
): SubscriberHistory {
63+
$details = '';
64+
foreach ($changeSet->getChanges() as $attribute => [$old, $new]) {
65+
if (in_array($attribute, ChangeSetDto::IGNORED_ATTRIBUTES, true) || $new === null) {
66+
continue;
67+
}
68+
$details .= $this->translator->trans(
69+
"%attribute% = %new_value% \n changed from %old_value%",
70+
[
71+
'%attribute%' => $attribute,
72+
'%new_value%' => $new,
73+
'%old_value%' => $old ?? $this->translator->trans('(no data)'),
74+
]
75+
) . PHP_EOL;
76+
}
77+
78+
if ($details === '') {
79+
$details .= $this->translator->trans('No data changed') . PHP_EOL;
80+
}
81+
82+
return $this->addHistory($subscriber, $message, $details);
83+
}
84+
5385
public function addHistoryFromImport(
5486
Subscriber $subscriber,
5587
array $listLines,
56-
array $updatedData,
88+
ChangeSetDto $changeSetDto,
5789
?Administrator $admin = null,
5890
): void {
59-
$headerLine = sprintf("API-v2-import - %s: %s%s", $admin ? 'Admin' : 'CLI', $admin?->getId(), "\n\n");
91+
$headerLine = sprintf('API-v2-import - %s: %s%s', $admin ? 'Admin' : 'CLI', $admin?->getId(), "\n\n");
6092

61-
$lines = $this->getHistoryLines($updatedData, $listLines);
93+
$lines = $this->getHistoryLines($changeSetDto, $listLines);
6294

6395
$this->addHistory(
6496
subscriber: $subscriber,
@@ -70,7 +102,7 @@ public function addHistoryFromImport(
70102
public function addHistoryFromApi(
71103
Subscriber $subscriber,
72104
array $listLines,
73-
array $updatedData,
105+
ChangeSetDto $updatedData,
74106
?Administrator $admin = null,
75107
): void {
76108
$lines = $this->getHistoryLines($updatedData, $listLines);
@@ -82,15 +114,14 @@ public function addHistoryFromApi(
82114
);
83115
}
84116

85-
private function getHistoryLines(array $updatedData, array $listLines): array
117+
private function getHistoryLines(ChangeSetDto $updatedData, array $listLines): array
86118
{
87119
$lines = [];
88-
if (empty($updatedData) && empty($listLines)) {
120+
if (!$updatedData->hasChanges() && empty($listLines)) {
89121
$lines[] = $this->translator->trans('No user details changed');
90122
} else {
91-
$skip = ['password', 'modified'];
92-
foreach ($updatedData as $field => [$old, $new]) {
93-
if (in_array($field, $skip, true)) {
123+
foreach ($updatedData->getChanges() as $field => [$old, $new]) {
124+
if (in_array($field, ChangeSetDto::IGNORED_ATTRIBUTES, true)) {
94125
continue;
95126
}
96127
$lines[] = $this->translator->trans(

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Doctrine\ORM\EntityManagerInterface;
88
use PhpList\Core\Domain\Identity\Model\Administrator;
99
use PhpList\Core\Domain\Messaging\Message\SubscriberConfirmationMessage;
10+
use PhpList\Core\Domain\Subscription\Model\Dto\ChangeSetDto;
1011
use PhpList\Core\Domain\Subscription\Model\Dto\CreateSubscriberDto;
1112
use PhpList\Core\Domain\Subscription\Model\Dto\ImportSubscriberDto;
1213
use PhpList\Core\Domain\Subscription\Model\Dto\UpdateSubscriberDto;
@@ -17,6 +18,9 @@
1718
use Symfony\Component\Messenger\MessageBusInterface;
1819
use Symfony\Contracts\Translation\TranslatorInterface;
1920

21+
/**
22+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
23+
*/
2024
class SubscriberManager
2125
{
2226
private SubscriberRepository $subscriberRepository;
@@ -77,6 +81,7 @@ public function getSubscriberById(int $subscriberId): ?Subscriber
7781
return $this->subscriberRepository->find($subscriberId);
7882
}
7983

84+
/** @SuppressWarnings(PHPMD.StaticAccess) */
8085
public function updateSubscriber(UpdateSubscriberDto $subscriberDto, Administrator $admin): Subscriber
8186
{
8287
/** @var Subscriber $subscriber */
@@ -92,9 +97,7 @@ public function updateSubscriber(UpdateSubscriberDto $subscriberDto, Administrat
9297
$uow = $this->entityManager->getUnitOfWork();
9398
$meta = $this->entityManager->getClassMetadata(Subscriber::class);
9499
$uow->computeChangeSet($meta, $subscriber);
95-
$changeSet = $uow->getEntityChangeSet($subscriber);
96-
97-
$this->entityManager->flush();
100+
$changeSet = ChangeSetDto::fromDoctrineChangeSet($uow->getEntityChangeSet($subscriber));
98101

99102
$this->subscriberHistoryManager->addHistoryFromApi($subscriber, [], $changeSet, $admin);
100103

@@ -146,7 +149,8 @@ public function createFromImport(ImportSubscriberDto $subscriberDto): Subscriber
146149
return $subscriber;
147150
}
148151

149-
public function updateFromImport(Subscriber $existingSubscriber, ImportSubscriberDto $subscriberDto): array
152+
/** @SuppressWarnings(PHPMD.StaticAccess) */
153+
public function updateFromImport(Subscriber $existingSubscriber, ImportSubscriberDto $subscriberDto): ChangeSetDto
150154
{
151155
$existingSubscriber->setEmail($subscriberDto->email);
152156
$existingSubscriber->setConfirmed($subscriberDto->confirmed);
@@ -159,7 +163,7 @@ public function updateFromImport(Subscriber $existingSubscriber, ImportSubscribe
159163
$meta = $this->entityManager->getClassMetadata(Subscriber::class);
160164
$uow->computeChangeSet($meta, $existingSubscriber);
161165

162-
return $uow->getEntityChangeSet($existingSubscriber);
166+
return ChangeSetDto::fromDoctrineChangeSet($uow->getEntityChangeSet($existingSubscriber));
163167
}
164168

165169
public function decrementBounceCount(Subscriber $subscriber): void

0 commit comments

Comments
 (0)