VisitsTracker.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <?php
  2. declare(strict_types=1);
  3. namespace Shlinkio\Shlink\Core\Visit;
  4. use Doctrine\ORM;
  5. use Psr\EventDispatcher\EventDispatcherInterface;
  6. use Shlinkio\Shlink\Core\Entity\ShortUrl;
  7. use Shlinkio\Shlink\Core\Entity\Visit;
  8. use Shlinkio\Shlink\Core\EventDispatcher\Event\UrlVisited;
  9. use Shlinkio\Shlink\Core\Model\Visitor;
  10. use Shlinkio\Shlink\Core\Options\UrlShortenerOptions;
  11. class VisitsTracker implements VisitsTrackerInterface
  12. {
  13. private ORM\EntityManagerInterface $em;
  14. private EventDispatcherInterface $eventDispatcher;
  15. private UrlShortenerOptions $options;
  16. public function __construct(
  17. ORM\EntityManagerInterface $em,
  18. EventDispatcherInterface $eventDispatcher,
  19. UrlShortenerOptions $options
  20. ) {
  21. $this->em = $em;
  22. $this->eventDispatcher = $eventDispatcher;
  23. $this->options = $options;
  24. }
  25. public function track(ShortUrl $shortUrl, Visitor $visitor): void
  26. {
  27. $this->trackVisit(
  28. Visit::forValidShortUrl($shortUrl, $visitor, $this->options->anonymizeRemoteAddr()),
  29. $visitor,
  30. );
  31. }
  32. public function trackInvalidShortUrlVisit(Visitor $visitor): void
  33. {
  34. if (! $this->options->trackOrphanVisits()) {
  35. return;
  36. }
  37. $this->trackVisit(Visit::forInvalidShortUrl($visitor, $this->options->anonymizeRemoteAddr()), $visitor);
  38. }
  39. public function trackBaseUrlVisit(Visitor $visitor): void
  40. {
  41. if (! $this->options->trackOrphanVisits()) {
  42. return;
  43. }
  44. $this->trackVisit(Visit::forBasePath($visitor, $this->options->anonymizeRemoteAddr()), $visitor);
  45. }
  46. public function trackRegularNotFoundVisit(Visitor $visitor): void
  47. {
  48. if (! $this->options->trackOrphanVisits()) {
  49. return;
  50. }
  51. $this->trackVisit(Visit::forRegularNotFound($visitor, $this->options->anonymizeRemoteAddr()), $visitor);
  52. }
  53. private function trackVisit(Visit $visit, Visitor $visitor): void
  54. {
  55. $this->em->persist($visit);
  56. $this->em->flush();
  57. $this->eventDispatcher->dispatch(new UrlVisited($visit->getId(), $visitor->getRemoteAddress()));
  58. }
  59. }