Skip to content

Commit a8db7f4

Browse files
committed
Mark the subscriber as confirmed
1 parent 0e9fb5a commit a8db7f4

File tree

5 files changed

+53
-11
lines changed

5 files changed

+53
-11
lines changed

src/Domain/Messaging/MessageHandler/SubscriberConfirmationMessageHandler.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,6 @@ public function __invoke(SubscriberConfirmationMessage $message): void
6262
*/
6363
private function generateConfirmationLink(string $uniqueId): string
6464
{
65-
return $this->confirmationUrl . $uniqueId;
65+
return $this->confirmationUrl . '?uniqueId=' . urlencode($uniqueId);
6666
}
6767
}

src/Domain/Subscription/Repository/SubscriberRepository.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ public function findOneByEmail(string $email): ?Subscriber
3636
return $this->findOneBy(['email' => $email]);
3737
}
3838

39+
public function findOneByUniqueId(string $uniqueId): ?Subscriber
40+
{
41+
return $this->findOneBy(['uniqueId' => $uniqueId]);
42+
}
43+
3944
public function findSubscribersBySubscribedList(int $listId): ?Subscriber
4045
{
4146
return $this->createQueryBuilder('s')

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,19 @@ public function updateSubscriber(UpdateSubscriberDto $subscriberDto): Subscriber
9292
return $subscriber;
9393
}
9494

95+
public function markAsConfirmedByUniqueId(string $uniqueId): Subscriber
96+
{
97+
$subscriber = $this->subscriberRepository->findOneByUniqueId($uniqueId);
98+
if (!$subscriber) {
99+
throw new NotFoundHttpException('Subscriber not found');
100+
}
101+
102+
$subscriber->setConfirmed(true);
103+
$this->entityManager->flush();
104+
105+
return $subscriber;
106+
}
107+
95108
public function deleteSubscriber(Subscriber $subscriber): void
96109
{
97110
$this->subscriberDeletionService->deleteLeavingBlacklist($subscriber);

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class SubscriberConfirmationMessageHandlerTest extends TestCase
1515
{
1616
private SubscriberConfirmationMessageHandler $handler;
1717
private EmailService&MockObject $emailService;
18-
private string $confirmationUrl = 'https://example.com/confirm/';
18+
private string $confirmationUrl = 'https://example.com/confirm';
1919

2020
protected function setUp(): void
2121
{
@@ -37,7 +37,7 @@ public function testInvokeWithTextEmail(): void
3737

3838
$textContent = $email->getTextBody();
3939
$this->assertStringContainsString('Thank you for subscribing', $textContent);
40-
$this->assertStringContainsString($this->confirmationUrl . $uniqueId, $textContent);
40+
$this->assertStringContainsString($this->confirmationUrl . '?uniqueId=' . $uniqueId, $textContent);
4141

4242
$this->assertEmpty($email->getHtmlBody());
4343

@@ -61,11 +61,11 @@ public function testInvokeWithHtmlEmail(): void
6161

6262
$textContent = $email->getTextBody();
6363
$this->assertStringContainsString('Thank you for subscribing', $textContent);
64-
$this->assertStringContainsString($this->confirmationUrl . $uniqueId, $textContent);
64+
$this->assertStringContainsString($this->confirmationUrl . '?uniqueId=' . $uniqueId, $textContent);
6565

6666
$htmlContent = $email->getHtmlBody();
6767
$this->assertStringContainsString('<p>Thank you for subscribing!</p>', $htmlContent);
68-
$linkStart = '<a href="' . $this->confirmationUrl . $uniqueId . '">';
68+
$linkStart = '<a href="' . $this->confirmationUrl . '?uniqueId=' . $uniqueId . '">';
6969
$this->assertStringContainsString($linkStart, $htmlContent);
7070

7171
return true;

tests/Unit/Domain/Subscription/Service/SubscriberManagerTest.php

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,20 @@ class SubscriberManagerTest extends TestCase
2121
private SubscriberRepository|MockObject $subscriberRepository;
2222
private EntityManagerInterface|MockObject $entityManager;
2323
private MessageBusInterface|MockObject $messageBus;
24-
private SubscriberDeletionService|MockObject $subscriberDeletionService;
2524
private SubscriberManager $subscriberManager;
2625

2726
protected function setUp(): void
2827
{
2928
$this->subscriberRepository = $this->createMock(SubscriberRepository::class);
3029
$this->entityManager = $this->createMock(EntityManagerInterface::class);
3130
$this->messageBus = $this->createMock(MessageBusInterface::class);
32-
$this->subscriberDeletionService = $this->createMock(SubscriberDeletionService::class);
31+
$subscriberDeletionService = $this->createMock(SubscriberDeletionService::class);
3332

3433
$this->subscriberManager = new SubscriberManager(
35-
$this->subscriberRepository,
36-
$this->entityManager,
37-
$this->messageBus,
38-
$this->subscriberDeletionService
34+
subscriberRepository: $this->subscriberRepository,
35+
entityManager: $this->entityManager,
36+
messageBus: $this->messageBus,
37+
subscriberDeletionService: $subscriberDeletionService
3938
);
4039
}
4140

@@ -143,4 +142,29 @@ public function testCreateSubscriberWithoutConfirmationDoesNotSendConfirmationEm
143142
$dto = new CreateSubscriberDto(email: '[email protected]', requestConfirmation: false, htmlEmail: true);
144143
$this->subscriberManager->createSubscriber($dto);
145144
}
145+
146+
public function testMarkAsConfirmedByUniqueIdConfirmsSubscriber(): void
147+
{
148+
$uniqueId = 'some-unique-id-789';
149+
$subscriber = $this->createMock(Subscriber::class);
150+
151+
$this->subscriberRepository
152+
->expects($this->once())
153+
->method('findOneByUniqueId')
154+
->with($uniqueId)
155+
->willReturn($subscriber);
156+
157+
$subscriber
158+
->expects($this->once())
159+
->method('setConfirmed')
160+
->with(true);
161+
162+
$this->entityManager
163+
->expects($this->once())
164+
->method('flush');
165+
166+
$result = $this->subscriberManager->markAsConfirmedByUniqueId($uniqueId);
167+
168+
$this->assertSame($subscriber, $result);
169+
}
146170
}

0 commit comments

Comments
 (0)