<?php
namespace App\EventListener\PostValidate;
use App\Entity\SearchQuery;
use App\Entity\SearchQueryParameter;
use App\Entity\SearchQueryType;
use App\Entity\Site;
use App\Service\AfterReadStorage;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use \App\DTO\SiteSearchQuery\SiteSearchQuery as DTO;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class CreateSiteSearchQueryPostValidateTransformation implements EventSubscriberInterface
{
private $entityManager;
private $normalizer;
private $afterReadStorage;
public function __construct(
EntityManagerInterface $entityManager,
NormalizerInterface $normalizer,
AfterReadStorage $afterReadStorage
) {
$this->entityManager = $entityManager;
$this->normalizer = $normalizer;
$this->afterReadStorage = $afterReadStorage;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
PostValidateListener::POST_VALIDATE_TRANSFORMATION => 'transform',
];
}
/**
* @param DTO $payload
*/
public function supportTransformation($payload)
{
return $payload instanceof DTO;
}
/**
* @param ViewEvent $event
*/
public function transform(ViewEvent $event)
{
/** @var DTO $payload */
$payload = $event->getControllerResult();
if (!$this->supportTransformation($payload)) {
return;
}
/** @var SearchQueryType $searchQueryType */
$searchQueryType = $this->entityManager->getRepository(SearchQueryType::class)->find($payload->searchQueryType);
/** @var Request $request */
$request = $event->getRequest();
/** @var Site $site */
$site = $this->entityManager->getRepository(Site::class)->find($request->get('id'));
if ($request->isMethod($request::METHOD_PUT)) {
/** @var SearchQuery $searchQuery */
$searchQuery = $this->afterReadStorage->getObject();
$searchQuery->update($payload->name, $searchQueryType);
$searchQuery->resetRelations();
} else {
$searchQuery = SearchQuery::create($payload->name, $site, $searchQueryType);
}
foreach ($payload->searchQueryParameters as $searchQueryParameter) {
SearchQueryParameter::create(
$searchQuery,
$searchQueryParameter->parameter,
$searchQueryParameter->value
);
}
$event->setControllerResult($searchQuery);
}
}