<?php
namespace App\EventListener\PostValidate;
use App\DTO\ContactNote\ContactNote;
use App\Entity\ContactNote as Entity;
use App\Entity\User;
use App\Repository\ContactRepository;
use App\Service\AfterReadStorage;
use App\Service\UserProvider;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\ViewEvent;
class ContactNotePostValidateTransformer implements EventSubscriberInterface
{
private $contactRepository;
private $request;
private $afterReadStorage;
private $userProvider;
public function __construct(
ContactRepository $contactRepository,
RequestStack $requestStack,
AfterReadStorage $afterReadStorage,
UserProvider $userProvider
) {
$this->contactRepository = $contactRepository;
$this->request = $requestStack->getCurrentRequest();
$this->afterReadStorage = $afterReadStorage;
$this->userProvider = $userProvider;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
/**
* @param ContactNote $payload
*
* @return bool
*/
public function supportTransformation($payload)
{
return $payload instanceof ContactNote;
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var ContactNote $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload)) {
return;
}
/** @var User $user */
$user = $this->userProvider->getUser();
if ($event->getRequest()->isMethod(Request::METHOD_PUT)) {
/** @var Entity $note */
$note = $this->afterReadStorage->getObject();
$note->update($payload->description, $user);
$event->setControllerResult($note);
} elseif ($event->getRequest()->isMethod(Request::METHOD_POST)) {
$note = Entity::create(
$this->contactRepository->find($this->request->get('contact_id')),
$payload->description,
$user
);
$event->setControllerResult($note);
}
}
}