Added option to filter by date the visits list

This commit is contained in:
Alejandro Celaya 2016-07-21 09:36:38 +02:00
parent 84c4021b24
commit d97287ab0c
6 changed files with 101 additions and 14 deletions

View File

@ -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();
} }

View 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;
}
}

View File

@ -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();
}
} }

View File

@ -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);
} }

View File

@ -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'
]);
} }
} }

View File

@ -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);
} }