. */ declare(strict_types=1); namespace App\Serializer; use App\Entity\Attachments\Attachment; use App\Services\Attachments\AttachmentURLGenerator; use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\ObjectNormalizer; class AttachmentNormalizer implements NormalizerInterface { public function __construct( #[Autowire(service: ObjectNormalizer::class)] private readonly NormalizerInterface $normalizer, private readonly AttachmentURLGenerator $attachmentURLGenerator, ) { } public function normalize(mixed $object, string $format = null, array $context = []) { if (!$object instanceof Attachment) { throw new \InvalidArgumentException('This normalizer only supports Attachment objects!'); } $data = $this->normalizer->normalize($object, $format, $context); $data['media_url'] = $this->attachmentURLGenerator->getViewURL($object); //Add thumbnail url if the attachment is a picture $data['thumbnail_url'] = $object->isPicture() ? $this->attachmentURLGenerator->getThumbnailURL($object) : null; return $data; } public function supportsNormalization(mixed $data, string $format = null, array $context = []): bool { return $data instanceof Attachment; } public function getSupportedTypes(?string $format): array { return [ //We depend on the context to determine if we should normalize or not Attachment::class => true, ]; } }