Create DB logic to delete orphan visits

This commit is contained in:
Alejandro Celaya
2023-05-18 08:57:24 +02:00
parent b51c149c30
commit a4d8ebdfc9
5 changed files with 32 additions and 4 deletions

View File

@@ -65,7 +65,7 @@
"require-dev": { "require-dev": {
"cebe/php-openapi": "^1.7", "cebe/php-openapi": "^1.7",
"devster/ubench": "^2.1", "devster/ubench": "^2.1",
"infection/infection": "^0.26.19", "infection/infection": "^0.27",
"openswoole/ide-helper": "~22.0.0", "openswoole/ide-helper": "~22.0.0",
"phpstan/phpstan": "^1.9", "phpstan/phpstan": "^1.9",
"phpstan/phpstan-doctrine": "^1.3", "phpstan/phpstan-doctrine": "^1.3",

View File

@@ -19,4 +19,13 @@ class VisitDeleterRepository extends EntitySpecificationRepository implements Vi
return $qb->getQuery()->execute(); return $qb->getQuery()->execute();
} }
public function deleteOrphanVisits(): int
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->delete(Visit::class, 'v')
->where($qb->expr()->isNull('v.shortUrl'));
return $qb->getQuery()->execute();
}
} }

View File

@@ -9,4 +9,6 @@ use Shlinkio\Shlink\Core\ShortUrl\Entity\ShortUrl;
interface VisitDeleterRepositoryInterface interface VisitDeleterRepositoryInterface
{ {
public function deleteShortUrlVisits(ShortUrl $shortUrl): int; public function deleteShortUrlVisits(ShortUrl $shortUrl): int;
public function deleteOrphanVisits(): int;
} }

View File

@@ -25,7 +25,7 @@ class VisitDeleterRepositoryTest extends DatabaseTestCase
} }
#[Test] #[Test]
public function deletesExpectedVisits(): void public function deletesExpectedShortUrlVisits(): void
{ {
$shortUrl1 = ShortUrl::withLongUrl('https://foo.com'); $shortUrl1 = ShortUrl::withLongUrl('https://foo.com');
$this->getEntityManager()->persist($shortUrl1); $this->getEntityManager()->persist($shortUrl1);
@@ -59,4 +59,21 @@ class VisitDeleterRepositoryTest extends DatabaseTestCase
self::assertEquals(1, $this->repo->deleteShortUrlVisits($shortUrl3)); self::assertEquals(1, $this->repo->deleteShortUrlVisits($shortUrl3));
self::assertEquals(0, $this->repo->deleteShortUrlVisits($shortUrl3)); self::assertEquals(0, $this->repo->deleteShortUrlVisits($shortUrl3));
} }
#[Test]
public function deletesExpectedOrphanVisits(): void
{
$visitor = Visitor::emptyInstance();
$this->getEntityManager()->persist(Visit::forBasePath($visitor));
$this->getEntityManager()->persist(Visit::forInvalidShortUrl($visitor));
$this->getEntityManager()->persist(Visit::forRegularNotFound($visitor));
$this->getEntityManager()->persist(Visit::forBasePath($visitor));
$this->getEntityManager()->persist(Visit::forInvalidShortUrl($visitor));
$this->getEntityManager()->persist(Visit::forRegularNotFound($visitor));
$this->getEntityManager()->flush();
self::assertEquals(6, $this->repo->deleteOrphanVisits());
self::assertEquals(0, $this->repo->deleteOrphanVisits());
}
} }

View File

@@ -21,8 +21,8 @@ class OrphanVisitsAction extends AbstractRestAction
protected const ROUTE_ALLOWED_METHODS = [self::METHOD_GET]; protected const ROUTE_ALLOWED_METHODS = [self::METHOD_GET];
public function __construct( public function __construct(
private VisitsStatsHelperInterface $visitsHelper, private readonly VisitsStatsHelperInterface $visitsHelper,
private DataTransformerInterface $orphanVisitTransformer, private readonly DataTransformerInterface $orphanVisitTransformer,
) { ) {
} }