diff --git a/src/Bundle/ChillDocStoreBundle/Controller/StoredObjectVersionApiController.php b/src/Bundle/ChillDocStoreBundle/Controller/StoredObjectVersionApiController.php index 4104ae67d..0ffbfc719 100644 --- a/src/Bundle/ChillDocStoreBundle/Controller/StoredObjectVersionApiController.php +++ b/src/Bundle/ChillDocStoreBundle/Controller/StoredObjectVersionApiController.php @@ -13,6 +13,7 @@ namespace Chill\DocStoreBundle\Controller; use Chill\DocStoreBundle\Entity\StoredObject; use Chill\DocStoreBundle\Security\Authorization\StoredObjectRoleEnum; +use Chill\DocStoreBundle\Serializer\Normalizer\StoredObjectVersionNormalizer; use Chill\MainBundle\Pagination\PaginatorFactoryInterface; use Chill\MainBundle\Serializer\Model\Collection; use Doctrine\Common\Collections\Criteria; @@ -57,7 +58,11 @@ final readonly class StoredObjectVersionApiController $items = $storedObject->getVersions()->matching($criteria); return new JsonResponse( - $this->serializer->serialize(new Collection($items, $paginator), 'json', [AbstractNormalizer::GROUPS => ['read']]), + $this->serializer->serialize( + new Collection($items, $paginator), + 'json', + [AbstractNormalizer::GROUPS => ['read', StoredObjectVersionNormalizer::WITH_POINT_IN_TIMES_CONTEXT]] + ), json: true ); } diff --git a/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectPointInTimeNormalizer.php b/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectPointInTimeNormalizer.php new file mode 100644 index 000000000..be8fc5f98 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectPointInTimeNormalizer.php @@ -0,0 +1,38 @@ + $object->getId(), + 'reason' => $object->getReason()->value, + 'byUser' => $this->normalizer->normalize($object->getByUser(), $format, [AbstractNormalizer::GROUPS => 'read']), + ]; + } + + public function supportsNormalization($data, ?string $format = null) + { + return $data instanceof StoredObjectPointInTime; + } +} diff --git a/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectVersionNormalizer.php b/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectVersionNormalizer.php index 15b997d20..d4a1adca2 100644 --- a/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectVersionNormalizer.php +++ b/src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectVersionNormalizer.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\DocStoreBundle\Serializer\Normalizer; use Chill\DocStoreBundle\Entity\StoredObjectVersion; +use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; @@ -20,13 +21,15 @@ class StoredObjectVersionNormalizer implements NormalizerInterface, NormalizerAw { use NormalizerAwareTrait; + final public const WITH_POINT_IN_TIMES_CONTEXT = 'with-point-in-times'; + public function normalize($object, ?string $format = null, array $context = []) { if (!$object instanceof StoredObjectVersion) { throw new \InvalidArgumentException('The object must be an instance of '.StoredObjectVersion::class); } - return [ + $data = [ 'id' => $object->getId(), 'filename' => $object->getFilename(), 'version' => $object->getVersion(), @@ -36,6 +39,12 @@ class StoredObjectVersionNormalizer implements NormalizerInterface, NormalizerAw 'createdAt' => $this->normalizer->normalize($object->getCreatedAt(), $format, $context), 'createdBy' => $this->normalizer->normalize($object->getCreatedBy(), $format, $context), ]; + + if (in_array(self::WITH_POINT_IN_TIMES_CONTEXT, $context[AbstractNormalizer::GROUPS])) { + $data['point-in-times'] = $this->normalizer->normalize($object->getPointInTimes(), $format, $context); + } + + return $data; } public function supportsNormalization($data, ?string $format = null, array $context = []) diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Serializer/Normalizer/StoredObjectPointInTimeNormalizerTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Serializer/Normalizer/StoredObjectPointInTimeNormalizerTest.php new file mode 100644 index 000000000..d53b20278 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Tests/Serializer/Normalizer/StoredObjectPointInTimeNormalizerTest.php @@ -0,0 +1,64 @@ +registerVersion(); + $storedObjectPointInTime = new StoredObjectPointInTime($version, StoredObjectPointInTimeReasonEnum::KEEP_BEFORE_CONVERSION, new User()); + + $normalizer = new StoredObjectPointInTimeNormalizer(); + $normalizer->setNormalizer($this->buildNormalizer()); + + $actual = $normalizer->normalize($storedObjectPointInTime, 'json', ['read']); + + self::assertIsArray($actual); + self::assertArrayHasKey('id', $actual); + self::assertArrayHasKey('byUser', $actual); + self::assertArrayHasKey('reason', $actual); + self::assertEquals(StoredObjectPointInTimeReasonEnum::KEEP_BEFORE_CONVERSION->value, $actual['reason']); + } + + public function buildNormalizer(): NormalizerInterface + { + $userRender = $this->prophesize(UserRender::class); + $userRender->renderString(Argument::type(User::class), Argument::type('array'))->willReturn('username'); + + return new Serializer( + [new UserNormalizer($userRender->reveal(), new MockClock())] + ); + } +}