mirror of
https://github.com/shlinkio/shlink.git
synced 2026-02-28 04:03:12 +08:00
Create DB logic to delete orphan visits
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user