Skip to content

Commit 2b966c2

Browse files
committed
Enhance SubscribePagePublicNormalizer to resolve attribute IDs using SubscriberAttributeDefinitionRepository
1 parent 3b95468 commit 2b966c2

2 files changed

Lines changed: 42 additions & 4 deletions

File tree

src/Subscription/Serializer/SubscribePagePublicNormalizer.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use OpenApi\Attributes as OA;
88
use PhpList\Core\Domain\Subscription\Model\SubscribePage;
99
use PhpList\Core\Domain\Subscription\Model\SubscribePageData;
10+
use PhpList\Core\Domain\Subscription\Repository\SubscriberAttributeDefinitionRepository;
1011
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
1112

1213
#[OA\Schema(
@@ -28,6 +29,11 @@
2829
)]
2930
class SubscribePagePublicNormalizer implements NormalizerInterface
3031
{
32+
public function __construct(
33+
private readonly SubscriberAttributeDefinitionRepository $attributeDefinitionRepository,
34+
) {
35+
}
36+
3137
/**
3238
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
3339
*/
@@ -43,14 +49,39 @@ public function normalize($object, string $format = null, array $context = []):
4349
'data' => array_reduce(
4450
$object->getData(),
4551
function (array $carry, SubscribePageData $data) {
46-
$carry[$data->getName()] = $data->getData();
52+
$value = $data->getData();
53+
if ($data->getName() === 'attributes') {
54+
$ids = array_filter(explode('+', $data->getData()));
55+
$value = $this->getAttributeDefinitions($ids);
56+
}
57+
$carry[$data->getName()] = $value;
58+
4759
return $carry;
4860
},
4961
[]
5062
),
5163
];
5264
}
5365

66+
private function getAttributeDefinitions(array $ids): array
67+
{
68+
$attributeDefinitions = $this->attributeDefinitionRepository->getByIds($ids);
69+
$result = [];
70+
foreach ($attributeDefinitions as $attributeDefinition) {
71+
$result[] = [
72+
'id' => $attributeDefinition->getId(),
73+
'name' => $attributeDefinition->getName(),
74+
'type' => $attributeDefinition->getType()->value,
75+
'required' => $attributeDefinition->isRequired(),
76+
'default_value' => $attributeDefinition->getDefaultValue(),
77+
'list_order' => $attributeDefinition->getListOrder(),
78+
'options' => $attributeDefinition->getOptions(),
79+
];
80+
}
81+
82+
return $result;
83+
}
84+
5485
/**
5586
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
5687
*/

tests/Unit/Subscription/Serializer/SubscribePagePublicNormalizerTest.php

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

77
use PhpList\Core\Domain\Identity\Model\Administrator;
88
use PhpList\Core\Domain\Subscription\Model\SubscribePage;
9+
use PhpList\Core\Domain\Subscription\Repository\SubscriberAttributeDefinitionRepository;
910
use PhpList\RestBundle\Subscription\Serializer\SubscribePagePublicNormalizer;
1011
use PHPUnit\Framework\TestCase;
1112
use stdClass;
@@ -14,7 +15,9 @@ class SubscribePagePublicNormalizerTest extends TestCase
1415
{
1516
public function testSupportsNormalization(): void
1617
{
17-
$normalizer = new SubscribePagePublicNormalizer();
18+
$normalizer = new SubscribePagePublicNormalizer(
19+
$this->createMock(SubscriberAttributeDefinitionRepository::class)
20+
);
1821

1922
$page = $this->createMock(SubscribePage::class);
2023

@@ -32,7 +35,9 @@ public function testNormalizeReturnsExpectedArray(): void
3235
$page->method('isActive')->willReturn(true);
3336
$page->method('getOwner')->willReturn($owner);
3437

35-
$normalizer = new SubscribePagePublicNormalizer();
38+
$normalizer = new SubscribePagePublicNormalizer(
39+
$this->createMock(SubscriberAttributeDefinitionRepository::class)
40+
);
3641

3742
$expected = [
3843
'id' => 42,
@@ -45,7 +50,9 @@ public function testNormalizeReturnsExpectedArray(): void
4550

4651
public function testNormalizeWithInvalidObjectReturnsEmptyArray(): void
4752
{
48-
$normalizer = new SubscribePagePublicNormalizer();
53+
$normalizer = new SubscribePagePublicNormalizer(
54+
$this->createMock(SubscriberAttributeDefinitionRepository::class)
55+
);
4956
$this->assertSame([], $normalizer->normalize(new stdClass()));
5057
}
5158
}

0 commit comments

Comments
 (0)