Skip to content

Commit 6e5b95c

Browse files
committed
UserBlacklistNormalizer
1 parent 5d17a40 commit 6e5b95c

File tree

4 files changed

+107
-0
lines changed

4 files changed

+107
-0
lines changed

config/services/normalizers.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,7 @@ services:
9393
PhpList\RestBundle\Statistics\Serializer\TopLocalPartsNormalizer:
9494
tags: [ 'serializer.normalizer' ]
9595
autowire: true
96+
97+
PhpList\RestBundle\Subscription\Serializer\UserBlacklistNormalizer:
98+
tags: [ 'serializer.normalizer' ]
99+
autowire: true

src/Subscription/Controller/BlacklistController.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PhpList\RestBundle\Common\Controller\BaseController;
1212
use PhpList\RestBundle\Common\Validator\RequestValidator;
1313
use PhpList\RestBundle\Subscription\Request\AddToBlacklistRequest;
14+
use PhpList\RestBundle\Subscription\Serializer\UserBlacklistNormalizer;
1415
use Symfony\Component\HttpFoundation\JsonResponse;
1516
use Symfony\Component\HttpFoundation\Request;
1617
use Symfony\Component\HttpFoundation\Response;
@@ -23,15 +24,18 @@
2324
class BlacklistController extends BaseController
2425
{
2526
private SubscriberBlacklistManager $blacklistManager;
27+
private UserBlacklistNormalizer $normalizer;
2628

2729
public function __construct(
2830
Authentication $authentication,
2931
RequestValidator $validator,
3032
SubscriberBlacklistManager $blacklistManager,
33+
UserBlacklistNormalizer $normalizer,
3134
) {
3235
parent::__construct($authentication, $validator);
3336
$this->authentication = $authentication;
3437
$this->blacklistManager = $blacklistManager;
38+
$this->normalizer = $normalizer;
3539
}
3640

3741
#[Route('/check/{email}', name: 'check', methods: ['GET'])]
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Subscription\Serializer;
6+
7+
use PhpList\Core\Domain\Subscription\Model\UserBlacklist;
8+
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberBlacklistManager;
9+
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
10+
11+
class UserBlacklistNormalizer implements NormalizerInterface
12+
{
13+
public function __construct(private readonly SubscriberBlacklistManager $blacklistManager)
14+
{
15+
}
16+
17+
/**
18+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
19+
*/
20+
public function normalize($object, string $format = null, array $context = []): array
21+
{
22+
if (!$object instanceof UserBlacklist) {
23+
return [];
24+
}
25+
26+
$reason = $this->blacklistManager->getBlacklistReason($object->getEmail());
27+
28+
return [
29+
'email' => $object->getEmail(),
30+
'added' => $object->getAdded()?->format('Y-m-d\TH:i:sP'),
31+
'reason' => $reason,
32+
];
33+
}
34+
35+
/**
36+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
37+
*/
38+
public function supportsNormalization($data, string $format = null): bool
39+
{
40+
return $data instanceof UserBlacklist;
41+
}
42+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Subscription\Serializer;
6+
7+
use DateTime;
8+
use PhpList\Core\Domain\Subscription\Model\UserBlacklist;
9+
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberBlacklistManager;
10+
use PhpList\RestBundle\Subscription\Serializer\UserBlacklistNormalizer;
11+
use PHPUnit\Framework\TestCase;
12+
use stdClass;
13+
14+
class UserBlacklistNormalizerTest extends TestCase
15+
{
16+
public function testSupportsNormalization(): void
17+
{
18+
$blacklistManager = $this->createMock(SubscriberBlacklistManager::class);
19+
$normalizer = new UserBlacklistNormalizer($blacklistManager);
20+
$userBlacklist = $this->createMock(UserBlacklist::class);
21+
22+
$this->assertTrue($normalizer->supportsNormalization($userBlacklist));
23+
$this->assertFalse($normalizer->supportsNormalization(new stdClass()));
24+
}
25+
26+
public function testNormalize(): void
27+
{
28+
$email = '[email protected]';
29+
$added = new DateTime('2025-08-08T12:00:00+00:00');
30+
$reason = 'Unsubscribed by user';
31+
32+
$userBlacklist = $this->createMock(UserBlacklist::class);
33+
$userBlacklist->method('getEmail')->willReturn($email);
34+
$userBlacklist->method('getAdded')->willReturn($added);
35+
36+
$blacklistManager = $this->createMock(SubscriberBlacklistManager::class);
37+
$blacklistManager->method('getBlacklistReason')->with($email)->willReturn($reason);
38+
39+
$normalizer = new UserBlacklistNormalizer($blacklistManager);
40+
41+
$expected = [
42+
'email' => $email,
43+
'added' => '2025-08-08T12:00:00+00:00',
44+
'reason' => $reason,
45+
];
46+
47+
$this->assertSame($expected, $normalizer->normalize($userBlacklist));
48+
}
49+
50+
public function testNormalizeWithInvalidObject(): void
51+
{
52+
$blacklistManager = $this->createMock(SubscriberBlacklistManager::class);
53+
$normalizer = new UserBlacklistNormalizer($blacklistManager);
54+
55+
$this->assertSame([], $normalizer->normalize(new stdClass()));
56+
}
57+
}

0 commit comments

Comments
 (0)