<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\Veterinary\Analytic;
use App\Entity\Veterinary\VeterinaryAnimalWeight;
use App\Entity\Veterinary\VeterinaryCheckin;
use App\Entity\Veterinary\VeterinaryClientUpdates;
use App\Enumerators\AnalyticsClientType;
use App\Enumerators\AnalyticsEventType;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
final class AnalyticsEventSubscriber implements EventSubscriberInterface {
private $entityManager;
private $logger;
public function __construct(EntityManagerInterface $entityManager, LoggerInterface $logger) {
$this->entityManager = $entityManager;
$this->logger = $logger;
}
public static function getSubscribedEvents() {
return [
KernelEvents::VIEW => ['storeUpdate', EventPriorities::POST_WRITE],
];
}
public function storeUpdate(ViewEvent $event) {
$entity = $event->getControllerResult();
$request = $event->getRequest();
$method = $request->getMethod();
// Parse request content
$requestContent = $request->getContent();
if (empty($requestContent)) {
return;
}
$params = json_decode($requestContent);
if (empty($params->site)) {
return;
}
$analyticsEntry = new Analytic();
$analyticsEntry->site = $params->site;
if ($entity instanceof VeterinaryClientUpdates && $method == Request::METHOD_PUT) {
// Client update event
$analyticsEntry->eventType = AnalyticsEventType::DATAUPDATE;
$analyticsEntry->clientType = AnalyticsClientType::EXISTING_CLIENT;
$analyticsEntry->clinic = $entity->clinic->name;
$analyticsEntry->client = $entity->clientFirstName . ' ' . $entity->clientLastName;
} elseif ($entity instanceof VeterinaryCheckin && $method == Request::METHOD_POST) {
// Checkin event
$analyticsEntry->eventType = AnalyticsEventType::CHECKIN;
$analyticsEntry->clientType = AnalyticsClientType::EXISTING_CLIENT;
$analyticsEntry->clinic = $entity->clinic->name;
$analyticsEntry->client = $entity->clientFirstName . ' ' . $entity->clientLastName;
$analyticsEntry->animalKind = $entity->animalSpecies;
$analyticsEntry->animalBreed = $entity->animalBreed;
$analyticsEntry->checkinReason = $entity->getReason();
} elseif ($entity instanceof VeterinaryAnimalWeight && $method === Request::METHOD_POST) {
// Weight update event
$analyticsEntry->eventType = AnalyticsEventType::WEIGHTUPDATE;
$analyticsEntry->clientType = AnalyticsClientType::EXISTING_CLIENT;
$analyticsEntry->isWithAnimal = true;
$analyticsEntry->clinic = $entity->clinic->name;
$analyticsEntry->client = $entity->clientFirstName . ' ' . $entity->clientLastName;
$analyticsEntry->animalKind = $entity->animalSpecies;
$analyticsEntry->animalBreed = $entity->animalBreed;
} else {
return;
}
$this->entityManager->persist($analyticsEntry);
$this->entityManager->flush();
}
}