VSVverkeerskunde/gvq-api

View on GitHub
src/Question/Serializers/QuestionDenormalizer.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php declare(strict_types=1);

namespace VSV\GVQ_API\Question\Serializers;

use Ramsey\Uuid\Uuid;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use VSV\GVQ_API\Question\Models\Answer;
use VSV\GVQ_API\Question\Models\Answers;
use VSV\GVQ_API\Question\Models\Category;
use VSV\GVQ_API\Question\Models\Question;
use VSV\GVQ_API\Common\ValueObjects\Language;
use VSV\GVQ_API\Common\ValueObjects\NotEmptyString;
use VSV\GVQ_API\Question\ValueObjects\Year;

class QuestionDenormalizer implements DenormalizerInterface
{
    /**
     * @var CategoryDenormalizer
     */
    private $categoryDenormalizer;

    /**
     * @var AnswerDenormalizer
     */
    private $answerDenormalizer;

    /**
     * @param CategoryDenormalizer $categoryDenormalizer
     * @param AnswerDenormalizer $answerDenormalizer
     */
    public function __construct(
        CategoryDenormalizer $categoryDenormalizer,
        AnswerDenormalizer $answerDenormalizer
    ) {
        $this->categoryDenormalizer = $categoryDenormalizer;
        $this->answerDenormalizer = $answerDenormalizer;
    }


    /**
     * @inheritdoc
     * @throws \Exception
     */
    public function denormalize($data, $class, $format = null, array $context = []): Question
    {
        $category = $this->categoryDenormalizer->denormalize(
            $data['category'],
            Category::class,
            $format,
            $context
        );

        $answers = array_map(
            function (array $answer) use ($format, $context) {
                return $this->answerDenormalizer->denormalize(
                    $answer,
                    Answer::class,
                    $format,
                    $context
                );
            },
            $data['answers']
        );

        $question =  new Question(
            Uuid::fromString($data['id']),
            new Language($data['language']),
            new Year($data['year']),
            $category,
            new NotEmptyString($data['text']),
            new NotEmptyString($data['imageFileName']),
            new Answers(...$answers),
            new NotEmptyString($data['feedback']),
            new \DateTimeImmutable($data['createdOn'])
        );

        if (isset($data['archivedOn']) && $data['archivedOn'] !== null) {
            $question->archiveOn(new \DateTimeImmutable($data['archivedOn']));
        }

        return $question;
    }

    /**
     * @inheritdoc
     */
    public function supportsDenormalization($data, $type, $format = null): bool
    {
        return ($type === Question::class) && ($format === 'json');
    }
}