<?php
namespace App\EventListener\PostValidate;
use App\DTO\Contact\ContactOutput;
use App\DTO\Contact\UpdateContact;
use App\Entity\Contact;
use App\Service\AfterReadStorage;
use App\Service\Manager\ContactManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class UpdateContactPostValidateTransformation implements EventSubscriberInterface
{
/**
* @var AfterReadStorage
*/
private $afterReadStorage;
/**
* @var ContactManager
*/
private $contactManager;
/**
* @var NormalizerInterface
*/
private $normalizer;
public function __construct(
AfterReadStorage $afterReadStorage,
ContactManager $contactManager,
NormalizerInterface $normalizer
) {
$this->afterReadStorage = $afterReadStorage;
$this->contactManager = $contactManager;
$this->normalizer = $normalizer;
}
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
public function supportTransformation($payload, Request $request)
{
return $payload instanceof UpdateContact && $request->isMethod($request::METHOD_PUT);
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var UpdateContact $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload, $event->getRequest())) {
return;
}
/** @var Contact $contact */
$contact = $this->afterReadStorage->getObject();
$contact->setName($payload->name);
$contact->updateItems([
'email' => $payload->email,
'emailSource' => $payload->emailSource,
'emailObtainedAt' => $payload->emailObtainedAt,
'phone' => $payload->phone,
'phoneSource' => $payload->phoneSource,
'phoneObtainedAt' => $payload->phoneObtainedAt,
]);
$this->contactManager->save($contact);
$event->setResponse(new JsonResponse($this->normalizer->normalize($contact, ContactOutput::class)));
}
}