Added logic for new tracking options

This commit is contained in:
Alejandro Celaya
2021-05-16 09:51:52 +02:00
parent d423d18249
commit f0dc32b6e5
7 changed files with 76 additions and 27 deletions

View File

@@ -6,6 +6,7 @@ namespace Shlinkio\Shlink\Core\Model;
use Psr\Http\Message\ServerRequestInterface;
use Shlinkio\Shlink\Common\Middleware\IpAddressMiddlewareFactory;
use Shlinkio\Shlink\Core\Options\TrackingOptions;
use function substr;
@@ -68,4 +69,16 @@ final class Visitor
{
return $this->visitedUrl;
}
public function normalizeForTrackingOptions(TrackingOptions $options): self
{
$instance = self::emptyInstance();
$instance->userAgent = $options->disableUaTracking() ? '' : $this->userAgent;
$instance->referer = $options->disableReferrerTracking() ? '' : $this->referer;
$instance->remoteAddress = $options->disableIpTracking() ? null : $this->remoteAddress;
$instance->visitedUrl = $this->visitedUrl;
return $instance;
}
}

View File

@@ -13,7 +13,6 @@ class TrackingOptions extends AbstractOptions
private ?string $disableTrackParam = null;
private bool $disableTracking = false;
private bool $disableIpTracking = false;
private bool $disableLocationTracking = false;
private bool $disableReferrerTracking = false;
private bool $disableUaTracking = false;
@@ -67,16 +66,6 @@ class TrackingOptions extends AbstractOptions
$this->disableIpTracking = $disableIpTracking;
}
public function disableLocationTracking(): bool
{
return $this->disableLocationTracking;
}
protected function setDisableLocationTracking(bool $disableLocationTracking): void
{
$this->disableLocationTracking = $disableLocationTracking;
}
public function disableReferrerTracking(): bool
{
return $this->disableReferrerTracking;

View File

@@ -32,39 +32,49 @@ class VisitsTracker implements VisitsTrackerInterface
{
$this->trackVisit(
Visit::forValidShortUrl($shortUrl, $visitor, $this->options->anonymizeRemoteAddr()),
$visitor,
$visitor->normalizeForTrackingOptions($this->options),
);
}
public function trackInvalidShortUrlVisit(Visitor $visitor): void
{
if (! $this->options->trackOrphanVisits()) {
return;
}
$this->trackVisit(Visit::forInvalidShortUrl($visitor, $this->options->anonymizeRemoteAddr()), $visitor);
$this->trackOrphanVisit(
Visit::forInvalidShortUrl($visitor, $this->options->anonymizeRemoteAddr()),
$visitor->normalizeForTrackingOptions($this->options),
);
}
public function trackBaseUrlVisit(Visitor $visitor): void
{
if (! $this->options->trackOrphanVisits()) {
return;
}
$this->trackVisit(Visit::forBasePath($visitor, $this->options->anonymizeRemoteAddr()), $visitor);
$this->trackOrphanVisit(
Visit::forBasePath($visitor, $this->options->anonymizeRemoteAddr()),
$visitor->normalizeForTrackingOptions($this->options),
);
}
public function trackRegularNotFoundVisit(Visitor $visitor): void
{
$this->trackOrphanVisit(
Visit::forRegularNotFound($visitor, $this->options->anonymizeRemoteAddr()),
$visitor->normalizeForTrackingOptions($this->options),
);
}
private function trackOrphanVisit(Visit $visit, Visitor $visitor): void
{
if (! $this->options->trackOrphanVisits()) {
return;
}
$this->trackVisit(Visit::forRegularNotFound($visitor, $this->options->anonymizeRemoteAddr()), $visitor);
$this->trackVisit($visit, $visitor);
}
private function trackVisit(Visit $visit, Visitor $visitor): void
{
if ($this->options->disableTracking()) {
return;
}
$this->em->transactional(function () use ($visit, $visitor): void {
$this->em->persist($visit);
$this->em->flush();