Wrap visits tracking in transaction

This commit is contained in:
Alejandro Celaya 2024-03-27 19:14:41 +01:00
parent cef30c8e2d
commit 4a05c4be40
2 changed files with 12 additions and 8 deletions

View File

@ -12,12 +12,12 @@ use Shlinkio\Shlink\Core\ShortUrl\Entity\ShortUrl;
use Shlinkio\Shlink\Core\Visit\Entity\Visit;
use Shlinkio\Shlink\Core\Visit\Model\Visitor;
class VisitsTracker implements VisitsTrackerInterface
readonly class VisitsTracker implements VisitsTrackerInterface
{
public function __construct(
private readonly ORM\EntityManagerInterface $em,
private readonly EventDispatcherInterface $eventDispatcher,
private readonly TrackingOptions $options,
private ORM\EntityManagerInterface $em,
private EventDispatcherInterface $eventDispatcher,
private TrackingOptions $options,
) {
}
@ -71,10 +71,12 @@ class VisitsTracker implements VisitsTrackerInterface
return;
}
$this->em->wrapInTransaction(function () use ($createVisit, $visitor): void {
$visit = $createVisit($visitor->normalizeForTrackingOptions($this->options));
$this->em->persist($visit);
$this->em->flush();
$this->eventDispatcher->dispatch(new UrlVisited($visit->getId(), $visitor->remoteAddress));
});
}
}

View File

@ -25,6 +25,8 @@ class VisitsTrackerTest extends TestCase
protected function setUp(): void
{
$this->em = $this->createMock(EntityManager::class);
$this->em->method('wrapInTransaction')->willReturnCallback(fn (callable $callback) => $callback());
$this->eventDispatcher = $this->createMock(EventDispatcherInterface::class);
}