mirror of
https://github.com/shlinkio/shlink.git
synced 2025-02-25 18:45:27 -06:00
Added option to filter by date the visits list
This commit is contained in:
parent
84c4021b24
commit
d97287ab0c
@ -70,7 +70,11 @@ class GetVisitsCommand extends Command
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
foreach ($visits as $row) {
|
foreach ($visits as $row) {
|
||||||
$table->addRow(array_values($row->jsonSerialize()));
|
$rowData = $row->jsonSerialize();
|
||||||
|
// Unset location info
|
||||||
|
unset($rowData['visitLocation']);
|
||||||
|
|
||||||
|
$table->addRow(array_values($rowData));
|
||||||
}
|
}
|
||||||
$table->render();
|
$table->render();
|
||||||
}
|
}
|
||||||
|
36
module/Common/src/Util/DateRange.php
Normal file
36
module/Common/src/Util/DateRange.php
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
namespace Shlinkio\Shlink\Common\Util;
|
||||||
|
|
||||||
|
class DateRange
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var \DateTimeInterface
|
||||||
|
*/
|
||||||
|
private $startDate;
|
||||||
|
/**
|
||||||
|
* @var \DateTimeInterface
|
||||||
|
*/
|
||||||
|
private $endDate;
|
||||||
|
|
||||||
|
public function __construct(\DateTimeInterface $startDate = null, \DateTimeInterface $endDate = null)
|
||||||
|
{
|
||||||
|
$this->startDate = $startDate;
|
||||||
|
$this->endDate = $endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \DateTimeInterface
|
||||||
|
*/
|
||||||
|
public function getStartDate()
|
||||||
|
{
|
||||||
|
return $this->startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \DateTimeInterface
|
||||||
|
*/
|
||||||
|
public function getEndDate()
|
||||||
|
{
|
||||||
|
return $this->endDate;
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,8 @@
|
|||||||
namespace Shlinkio\Shlink\Core\Repository;
|
namespace Shlinkio\Shlink\Core\Repository;
|
||||||
|
|
||||||
use Doctrine\ORM\EntityRepository;
|
use Doctrine\ORM\EntityRepository;
|
||||||
|
use Shlinkio\Shlink\Common\Util\DateRange;
|
||||||
|
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
||||||
use Shlinkio\Shlink\Core\Entity\Visit;
|
use Shlinkio\Shlink\Core\Entity\Visit;
|
||||||
|
|
||||||
class VisitRepository extends EntityRepository implements VisitRepositoryInterface
|
class VisitRepository extends EntityRepository implements VisitRepositoryInterface
|
||||||
@ -16,4 +18,39 @@ class VisitRepository extends EntityRepository implements VisitRepositoryInterfa
|
|||||||
|
|
||||||
return $qb->getQuery()->getResult();
|
return $qb->getQuery()->getResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ShortUrl|int $shortUrl
|
||||||
|
* @param DateRange|null $dateRange
|
||||||
|
* @return Visit[]
|
||||||
|
*/
|
||||||
|
public function findVisitsByShortUrl($shortUrl, DateRange $dateRange = null)
|
||||||
|
{
|
||||||
|
$shortUrl = $shortUrl instanceof ShortUrl
|
||||||
|
? $shortUrl
|
||||||
|
: $this->getEntityManager()->find(ShortUrl::class, $shortUrl);
|
||||||
|
if (! isset($dateRange)) {
|
||||||
|
$startDate = $shortUrl->getDateCreated();
|
||||||
|
$endDate = clone $startDate;
|
||||||
|
$endDate->add(new \DateInterval('P2D'));
|
||||||
|
$dateRange = new DateRange($startDate, $endDate);
|
||||||
|
}
|
||||||
|
|
||||||
|
$qb = $this->createQueryBuilder('v');
|
||||||
|
$qb->where($qb->expr()->eq('v.shortUrl', ':shortUrl'))
|
||||||
|
->setParameter('shortUrl', $shortUrl)
|
||||||
|
->orderBy('v.date', 'DESC') ;
|
||||||
|
|
||||||
|
// Apply date range filtering
|
||||||
|
if (! empty($dateRange->getStartDate())) {
|
||||||
|
$qb->andWhere($qb->expr()->gte('v.date', ':startDate'))
|
||||||
|
->setParameter('startDate', $dateRange->getStartDate());
|
||||||
|
}
|
||||||
|
if (! empty($dateRange->getEndDate())) {
|
||||||
|
$qb->andWhere($qb->expr()->lte('v.date', ':endDate'))
|
||||||
|
->setParameter('endDate', $dateRange->getEndDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $qb->getQuery()->getResult();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
namespace Shlinkio\Shlink\Core\Repository;
|
namespace Shlinkio\Shlink\Core\Repository;
|
||||||
|
|
||||||
use Doctrine\Common\Persistence\ObjectRepository;
|
use Doctrine\Common\Persistence\ObjectRepository;
|
||||||
|
use Shlinkio\Shlink\Common\Util\DateRange;
|
||||||
|
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
||||||
use Shlinkio\Shlink\Core\Entity\Visit;
|
use Shlinkio\Shlink\Core\Entity\Visit;
|
||||||
|
|
||||||
interface VisitRepositoryInterface extends ObjectRepository
|
interface VisitRepositoryInterface extends ObjectRepository
|
||||||
@ -10,4 +12,11 @@ interface VisitRepositoryInterface extends ObjectRepository
|
|||||||
* @return Visit[]
|
* @return Visit[]
|
||||||
*/
|
*/
|
||||||
public function findUnlocatedVisits();
|
public function findUnlocatedVisits();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ShortUrl|int $shortUrl
|
||||||
|
* @param DateRange|null $dateRange
|
||||||
|
* @return Visit[]
|
||||||
|
*/
|
||||||
|
public function findVisitsByShortUrl($shortUrl, DateRange $dateRange = null);
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,10 @@ namespace Shlinkio\Shlink\Core\Service;
|
|||||||
use Acelaya\ZsmAnnotatedServices\Annotation\Inject;
|
use Acelaya\ZsmAnnotatedServices\Annotation\Inject;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Shlinkio\Shlink\Common\Exception\InvalidArgumentException;
|
use Shlinkio\Shlink\Common\Exception\InvalidArgumentException;
|
||||||
|
use Shlinkio\Shlink\Common\Util\DateRange;
|
||||||
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
use Shlinkio\Shlink\Core\Entity\ShortUrl;
|
||||||
use Shlinkio\Shlink\Core\Entity\Visit;
|
use Shlinkio\Shlink\Core\Entity\Visit;
|
||||||
use Zend\Paginator\Paginator;
|
use Shlinkio\Shlink\Core\Repository\VisitRepository;
|
||||||
|
|
||||||
class VisitsTracker implements VisitsTrackerInterface
|
class VisitsTracker implements VisitsTrackerInterface
|
||||||
{
|
{
|
||||||
@ -62,12 +63,13 @@ class VisitsTracker implements VisitsTrackerInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the visits on certain shortcode
|
* Returns the visits on certain short code
|
||||||
*
|
*
|
||||||
* @param $shortCode
|
* @param $shortCode
|
||||||
* @return Paginator|Visit[]
|
* @param DateRange $dateRange
|
||||||
|
* @return Visit[]
|
||||||
*/
|
*/
|
||||||
public function info($shortCode)
|
public function info($shortCode, DateRange $dateRange = null)
|
||||||
{
|
{
|
||||||
/** @var ShortUrl $shortUrl */
|
/** @var ShortUrl $shortUrl */
|
||||||
$shortUrl = $this->em->getRepository(ShortUrl::class)->findOneBy([
|
$shortUrl = $this->em->getRepository(ShortUrl::class)->findOneBy([
|
||||||
@ -77,10 +79,8 @@ class VisitsTracker implements VisitsTrackerInterface
|
|||||||
throw new InvalidArgumentException(sprintf('Short code "%s" not found', $shortCode));
|
throw new InvalidArgumentException(sprintf('Short code "%s" not found', $shortCode));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->em->getRepository(Visit::class)->findBy([
|
/** @var VisitRepository $repo */
|
||||||
'shortUrl' => $shortUrl,
|
$repo = $this->em->getRepository(Visit::class);
|
||||||
], [
|
return $repo->findVisitsByShortUrl($shortUrl, $dateRange);
|
||||||
'date' => 'DESC'
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace Shlinkio\Shlink\Core\Service;
|
namespace Shlinkio\Shlink\Core\Service;
|
||||||
|
|
||||||
|
use Shlinkio\Shlink\Common\Util\DateRange;
|
||||||
use Shlinkio\Shlink\Core\Entity\Visit;
|
use Shlinkio\Shlink\Core\Entity\Visit;
|
||||||
use Zend\Paginator\Paginator;
|
|
||||||
|
|
||||||
interface VisitsTrackerInterface
|
interface VisitsTrackerInterface
|
||||||
{
|
{
|
||||||
@ -15,10 +15,11 @@ interface VisitsTrackerInterface
|
|||||||
public function track($shortCode, array $visitorData = null);
|
public function track($shortCode, array $visitorData = null);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the visits on certain shortcode
|
* Returns the visits on certain short code
|
||||||
*
|
*
|
||||||
* @param $shortCode
|
* @param $shortCode
|
||||||
* @return Paginator|Visit[]
|
* @param DateRange $dateRange
|
||||||
|
* @return Visit[]
|
||||||
*/
|
*/
|
||||||
public function info($shortCode);
|
public function info($shortCode, DateRange $dateRange = null);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user