From ec4b3341c87526d4efa087c164476376ca74467d Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Sun, 20 Feb 2022 15:25:07 +0100 Subject: [PATCH] - move NodeView to Analytic/View - move NodeViewListener to AnalyticListener - add referer --- .gitignore | 2 + composer.json | 1 + config/services.yaml | 2 +- core/Entity/Analytic/Referer.php | 103 +++++++++++++++ .../{NodeView.php => Analytic/View.php} | 11 +- core/Entity/Site/Node.php | 68 +++++++--- core/EventListener/AnalyticListener.php | 124 ++++++++++++++++++ core/EventListener/NodeViewListener.php | 68 ---------- core/Factory/Analytic/RefererFactory.php | 22 ++++ .../ViewFactory.php} | 7 +- .../Repository/Analytic/RefererRepository.php | 21 +++ .../Analytic/RefererRepositoryQuery.php | 28 ++++ core/Repository/Analytic/ViewRepository.php | 21 +++ .../ViewRepositoryQuery.php} | 7 +- core/Repository/NodeViewRepository.php | 21 --- migrations/.gitignore | 0 symfony.lock | 3 + 17 files changed, 393 insertions(+), 116 deletions(-) create mode 100644 core/Entity/Analytic/Referer.php rename core/Entity/{NodeView.php => Analytic/View.php} (84%) create mode 100644 core/EventListener/AnalyticListener.php delete mode 100644 core/EventListener/NodeViewListener.php create mode 100644 core/Factory/Analytic/RefererFactory.php rename core/Factory/{NodeViewFactory.php => Analytic/ViewFactory.php} (64%) create mode 100644 core/Repository/Analytic/RefererRepository.php create mode 100644 core/Repository/Analytic/RefererRepositoryQuery.php create mode 100644 core/Repository/Analytic/ViewRepository.php rename core/Repository/{NodeViewRepositoryQuery.php => Analytic/ViewRepositoryQuery.php} (75%) delete mode 100644 core/Repository/NodeViewRepository.php delete mode 100644 migrations/.gitignore diff --git a/.gitignore b/.gitignore index 18ffc85..c0aa6b0 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ yarn-error.log /public/uploads/ !/public/uploads/.gitkeep /public/media/ +/migrations/ +!/migrations/.gitkeep diff --git a/composer.json b/composer.json index 266ff76..dc97ae6 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "doctrine/doctrine-migrations-bundle": "^3.0", "doctrine/orm": "^2.8", "friendsofsymfony/jsrouting-bundle": "^2.7", + "jaybizzle/crawler-detect": "^1.2", "knplabs/doctrine-behaviors": "^2.2", "knplabs/knp-paginator-bundle": "^5.8", "liip/imagine-bundle": "^2.6", diff --git a/config/services.yaml b/config/services.yaml index b81dbd3..4d04c70 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -23,7 +23,7 @@ services: tags: - { name: kernel.event_listener, event: kernel.exception } - App\Core\EventListener\NodeViewListener: + App\Core\EventListener\AnalyticListener: tags: - { name: kernel.event_listener, event: kernel.request } diff --git a/core/Entity/Analytic/Referer.php b/core/Entity/Analytic/Referer.php new file mode 100644 index 0000000..0281d3c --- /dev/null +++ b/core/Entity/Analytic/Referer.php @@ -0,0 +1,103 @@ +id; + } + + public function getNode(): ?Node + { + return $this->node; + } + + public function setNode(?Node $node): self + { + $this->node = $node; + + return $this; + } + + public function getUri(): ?string + { + return $this->uri; + } + + public function setUri(string $uri): self + { + $this->uri = $uri; + + return $this; + } + + public function getViews(): ?int + { + return $this->views; + } + + public function setViews(int $views): self + { + $this->views = $views; + + return $this; + } + + public function addView(): self + { + ++$this->views; + + return $this; + } + + public function getDate(): ?\DateTimeInterface + { + return $this->date; + } + + public function setDate(\DateTimeInterface $date): self + { + $this->date = $date; + + return $this; + } +} diff --git a/core/Entity/NodeView.php b/core/Entity/Analytic/View.php similarity index 84% rename from core/Entity/NodeView.php rename to core/Entity/Analytic/View.php index 506dbb5..a5db1b9 100644 --- a/core/Entity/NodeView.php +++ b/core/Entity/Analytic/View.php @@ -1,16 +1,17 @@ children = new ArrayCollection(); $this->aliasNodes = new ArrayCollection(); - $this->nodeViews = new ArrayCollection(); + $this->analyticViews = new ArrayCollection(); + $this->analyticReferers = new ArrayCollection(); } public function getId(): ?int @@ -574,29 +582,59 @@ class Node implements EntityInterface } /** - * @return Collection|NodeView[] + * @return Collection|View[] */ - public function getNodeViews(): Collection + public function getAnalyticViews(): Collection { - return $this->nodeViews; + return $this->analyticViews; } - public function addNodeView(NodeView $nodeView): self + public function addAnalyticView(View $view): self { - if (!$this->nodeViews->contains($nodeView)) { - $this->nodeViews[] = $nodeView; - $nodeView->setNode($this); + if (!$this->analyticViews->contains($view)) { + $this->analyticViews[] = $view; + $view->setNode($this); } return $this; } - public function removeNodeView(NodeView $nodeView): self + public function removeAnalyticView(View $view): self { - if ($this->nodeViews->removeElement($nodeView)) { + if ($this->analyticViews->removeElement($view)) { // set the owning side to null (unless already changed) - if ($nodeView->getNode() === $this) { - $nodeView->setNode(null); + if ($view->getNode() === $this) { + $view->setNode(null); + } + } + + return $this; + } + + /** + * @return Collection|Referer[] + */ + public function getAnalyticReferers(): Collection + { + return $this->analyticReferers; + } + + public function addAnalyticReferer(Referer $referer): self + { + if (!$this->analyticReferers->contains($referer)) { + $this->analyticReferers[] = $referer; + $referer->setNode($this); + } + + return $this; + } + + public function removeAnalyticReferer(Referer $referer): self + { + if ($this->analyticReferers->removeElement($referer)) { + // set the owning side to null (unless already changed) + if ($referer->getNode() === $this) { + $referer->setNode(null); } } diff --git a/core/EventListener/AnalyticListener.php b/core/EventListener/AnalyticListener.php new file mode 100644 index 0000000..eb6b983 --- /dev/null +++ b/core/EventListener/AnalyticListener.php @@ -0,0 +1,124 @@ + + */ +class AnalyticListener +{ + protected NodeRepository $nodeRepository; + protected ViewRepositoryQuery $viewRepositoryQuery; + protected ViewFactory $viewFactory; + protected RefererRepositoryQuery $refererRepositoryQuery; + protected RefererFactory $refererFactory; + protected EntityManager $manager; + protected CrawlerDetect $crawlerDetect; + protected Request $request; + protected Node $node; + + public function __construct( + NodeRepository $nodeRepository, + ViewRepositoryQuery $viewRepositoryQuery, + ViewFactory $viewFactory, + RefererRepositoryQuery $refererRepositoryQuery, + RefererFactory $refererFactory, + EntityManager $manager + ) { + $this->nodeRepository = $nodeRepository; + $this->viewRepositoryQuery = $viewRepositoryQuery; + $this->viewFactory = $viewFactory; + $this->refererRepositoryQuery = $refererRepositoryQuery; + $this->refererFactory = $refererFactory; + $this->manager = $manager; + $this->crawlerDetect = new CrawlerDetect(); + } + + public function onKernelRequest(RequestEvent $event) + { + $request = $event->getRequest(); + + if (!$request->attributes->has('_node')) { + return; + } + + if ($this->crawlerDetect->isCrawler($request->headers->get('user-agent'))) { + return; + } + + $node = $this->nodeRepository->findOneBy([ + 'id' => $request->attributes->get('_node'), + 'enableViewCounter' => true, + ]); + + if (!$node) { + return; + } + + $this->node = $node; + $this->request = $request; + + $this->createView(); + $this->createReferer(); + } + + protected function createView() + { + $entity = $this->viewRepositoryQuery->create() + ->filterByRequest($this->request) + ->andWhere('.date=CURRENT_DATE()') + ->findOne() + ; + + if (!$entity) { + $entity = $this->viewFactory->create($this->node, $this->request->getPathInfo()); + } + + $entity->addView(); + $this->save($entity); + } + + protected function createReferer() + { + if (!$this->request->headers->has('referer')) { + return; + } + + $entity = $this->refererRepositoryQuery->create() + ->filterByRequest($this->request) + ->andWhere('.date=CURRENT_DATE()') + ->findOne() + ; + + if (!$entity) { + $entity = $this->refererFactory->create($this->node, $this->request->headers->get('referer')); + } + + $entity->addView(); + $this->save($entity); + } + + protected function save(EntityInterface $entity) + { + if ($entity->getId()) { + $this->manager->update($entity); + } else { + $this->manager->create($entity); + } + } +} diff --git a/core/EventListener/NodeViewListener.php b/core/EventListener/NodeViewListener.php deleted file mode 100644 index 52b3880..0000000 --- a/core/EventListener/NodeViewListener.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ -class NodeViewListener -{ - protected NodeRepository $nodeRepository; - protected NodeViewRepositoryQuery $nodeViewRepositoryQuery; - protected NodeViewFactory $nodeViewFactory; - protected EntityManager $manager; - - public function __construct( - NodeRepository $nodeRepository, - NodeViewRepositoryQuery $nodeViewRepositoryQuery, - NodeViewFactory $nodeViewFactory, - EntityManager $manager - ) { - $this->nodeRepository = $nodeRepository; - $this->nodeViewRepositoryQuery = $nodeViewRepositoryQuery; - $this->nodeViewFactory = $nodeViewFactory; - $this->manager = $manager; - } - - public function onKernelRequest(RequestEvent $event) - { - $request = $event->getRequest(); - - if (!$request->attributes->has('_node')) { - return; - } - - $node = $this->nodeRepository->findOneById($request->attributes->get('_node')); - - if (!$node || !$node->getEnableViewCounter()) { - return; - } - - $nodeView = $this->nodeViewRepositoryQuery->create() - ->filterByRequest($request) - ->andWhere('.date=CURRENT_DATE()') - ->findOne() - ; - - if (!$nodeView) { - $nodeView = $this->nodeViewFactory->create($node, $request->getPathInfo()); - } - - $nodeView->addView(); - - if ($nodeView->getId()) { - $this->manager->update($nodeView); - } else { - $this->manager->create($nodeView); - } - } -} diff --git a/core/Factory/Analytic/RefererFactory.php b/core/Factory/Analytic/RefererFactory.php new file mode 100644 index 0000000..8884338 --- /dev/null +++ b/core/Factory/Analytic/RefererFactory.php @@ -0,0 +1,22 @@ +setNode($node) + ->setUri($uri) + ->setDate(new \DateTime()) + ; + + return $entity; + } +} diff --git a/core/Factory/NodeViewFactory.php b/core/Factory/Analytic/ViewFactory.php similarity index 64% rename from core/Factory/NodeViewFactory.php rename to core/Factory/Analytic/ViewFactory.php index ecc3862..840c7ad 100644 --- a/core/Factory/NodeViewFactory.php +++ b/core/Factory/Analytic/ViewFactory.php @@ -1,11 +1,12 @@ andWhere('.node = :node') + ->andWhere('.uri = :uri') + ->setParameters([ + ':node' => $request->attributes->get('_node'), + ':uri' => $request->headers->get('referer'), + ]) + ; + } +} diff --git a/core/Repository/Analytic/ViewRepository.php b/core/Repository/Analytic/ViewRepository.php new file mode 100644 index 0000000..4ddf0a3 --- /dev/null +++ b/core/Repository/Analytic/ViewRepository.php @@ -0,0 +1,21 @@ +