<?php
namespace App\EventListener\PostValidate;
use App\DTO\LeadNote\LeadNote;
use App\Entity\Lead;
use App\Entity\LeadNote as Entity;
use App\Entity\User;
use App\Repository\LeadRepository;
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 LeadNotePostValidateTransformation implements EventSubscriberInterface
{
private $leadRepository;
private $request;
private $afterReadStorage;
private $userProvider;
public function __construct(
LeadRepository $leadRepository,
RequestStack $requestStack,
AfterReadStorage $afterReadStorage,
UserProvider $userProvider
) {
$this->leadRepository = $leadRepository;
$this->request = $requestStack->getCurrentRequest();
$this->afterReadStorage = $afterReadStorage;
$this->userProvider = $userProvider;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
/**
* @param LeadNote $payload
*
* @return bool
*/
public function supportTransformation($payload)
{
return $payload instanceof LeadNote;
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var LeadNote $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload)) {
return;
}
/** @var Lead $lead */
$lead = $this->leadRepository->find($this->request->get('lead_id'));
/** @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)) {
/** @var Entity $note */
$note = Entity::create($lead, $payload->description, $user);
$event->setControllerResult($note);
}
}
}