2015-06-23 09:38:43 +00:00
|
|
|
<?php
|
|
|
|
|
2023-03-11 16:27:07 +00:00
|
|
|
namespace src\PointToolsBundle\Repository;
|
2015-06-23 09:38:43 +00:00
|
|
|
|
|
|
|
use Doctrine\ORM\EntityRepository;
|
2016-12-10 23:43:25 +00:00
|
|
|
use Doctrine\ORM\QueryBuilder;
|
2023-03-11 16:27:07 +00:00
|
|
|
use src\PointToolsBundle\Entity\SubscriptionEvent;
|
|
|
|
use src\PointToolsBundle\Entity\User;
|
2015-06-23 09:38:43 +00:00
|
|
|
|
|
|
|
class SubscriptionEventRepository extends EntityRepository
|
|
|
|
{
|
2017-01-12 22:58:52 +00:00
|
|
|
public function add(SubscriptionEvent $entity): void
|
2017-01-11 01:10:32 +00:00
|
|
|
{
|
|
|
|
$this->getEntityManager()->persist($entity);
|
|
|
|
}
|
|
|
|
|
2015-06-23 09:38:43 +00:00
|
|
|
/**
|
2017-01-05 20:17:19 +00:00
|
|
|
* @return int
|
2015-06-23 09:38:43 +00:00
|
|
|
*/
|
2017-01-05 20:17:19 +00:00
|
|
|
public function getLastDayEventsCount(): int
|
2015-06-23 09:38:43 +00:00
|
|
|
{
|
|
|
|
$qb = $this->createQueryBuilder('se');
|
|
|
|
|
2017-01-12 22:58:52 +00:00
|
|
|
$from = (new \DateTime())->sub(new \DateInterval('PT24H'));
|
2015-06-23 09:38:43 +00:00
|
|
|
|
2015-06-23 09:42:59 +00:00
|
|
|
return $qb
|
2015-06-23 09:38:43 +00:00
|
|
|
->select('COUNT(se)')
|
2017-01-12 22:58:52 +00:00
|
|
|
->where('se.date > :from_time')
|
|
|
|
->setParameter('from_time', $from)
|
2015-06-23 09:38:43 +00:00
|
|
|
->getQuery()->getSingleScalarResult()
|
|
|
|
;
|
|
|
|
}
|
2015-06-23 10:34:53 +00:00
|
|
|
|
|
|
|
/**
|
2016-12-10 23:43:25 +00:00
|
|
|
* Creates QueryBuilder object for pagination of user subscribers events
|
|
|
|
*
|
2015-06-23 10:34:53 +00:00
|
|
|
* @param User $user
|
2016-12-10 23:43:25 +00:00
|
|
|
*
|
|
|
|
* @return QueryBuilder
|
2015-06-23 10:34:53 +00:00
|
|
|
*/
|
2017-01-05 20:17:19 +00:00
|
|
|
public function createUserLastSubscribersEventsQuery(User $user): QueryBuilder
|
2015-06-23 10:34:53 +00:00
|
|
|
{
|
|
|
|
$qb = $this->createQueryBuilder('se');
|
|
|
|
|
|
|
|
return $qb
|
2015-06-26 16:16:14 +00:00
|
|
|
->select(['se', 's'])
|
|
|
|
->join('se.subscriber', 's')
|
2015-06-23 10:34:53 +00:00
|
|
|
->where('se.author = :author')
|
|
|
|
->orderBy('se.date', 'desc')
|
2016-12-10 23:43:25 +00:00
|
|
|
->setParameter('author', $user->getId())
|
2015-06-23 10:34:53 +00:00
|
|
|
;
|
|
|
|
}
|
2015-06-23 11:03:46 +00:00
|
|
|
|
2017-01-05 20:17:19 +00:00
|
|
|
/**
|
|
|
|
* Get last user subscriber events
|
|
|
|
*
|
|
|
|
* @param User $user
|
|
|
|
* @param int $limit
|
|
|
|
*
|
|
|
|
* @return SubscriptionEvent[]
|
|
|
|
*/
|
|
|
|
public function getUserLastSubscribersEvents(User $user, int $limit = 20): array
|
|
|
|
{
|
|
|
|
$qb = $this->createUserLastSubscribersEventsQuery($user);
|
|
|
|
$qb->setMaxResults($limit);
|
|
|
|
|
|
|
|
return $qb->getQuery()->getResult();
|
|
|
|
}
|
|
|
|
|
2015-06-23 11:03:46 +00:00
|
|
|
/**
|
2017-01-04 22:36:30 +00:00
|
|
|
* Get last global subscriptions QueryBuilder for pagination
|
2015-06-23 11:03:46 +00:00
|
|
|
*
|
2016-12-10 23:55:28 +00:00
|
|
|
* @return QueryBuilder
|
2015-06-23 11:03:46 +00:00
|
|
|
*/
|
2017-01-05 20:17:19 +00:00
|
|
|
public function createLastSubscriptionEventsQuery(): QueryBuilder
|
2015-06-23 11:03:46 +00:00
|
|
|
{
|
|
|
|
$qb = $this->createQueryBuilder('se');
|
|
|
|
|
|
|
|
return $qb
|
2016-12-10 23:55:28 +00:00
|
|
|
->select(['se', 'a', 's'])
|
|
|
|
->innerJoin('se.author', 'a')
|
|
|
|
->innerJoin('se.subscriber', 's')
|
2015-06-23 11:03:46 +00:00
|
|
|
->orderBy('se.date', 'desc')
|
|
|
|
;
|
|
|
|
}
|
2017-01-04 22:36:30 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Get last global subscription events
|
|
|
|
*
|
|
|
|
* @param int $limit
|
|
|
|
*
|
|
|
|
* @return SubscriptionEvent[]
|
|
|
|
*/
|
2017-01-05 20:17:19 +00:00
|
|
|
public function getLastSubscriptionEvents(int $limit = 20): array
|
2017-01-04 22:36:30 +00:00
|
|
|
{
|
|
|
|
$qb = $this->createLastSubscriptionEventsQuery();
|
|
|
|
$qb->setMaxResults($limit);
|
|
|
|
|
|
|
|
return $qb->getQuery()->getResult();
|
|
|
|
}
|
2017-01-10 01:21:57 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @return SubscriptionEvent[]
|
|
|
|
*/
|
|
|
|
public function getLastEventsByDay(int $days = 30): array
|
|
|
|
{
|
|
|
|
$qb = $this->createQueryBuilder('se');
|
|
|
|
|
|
|
|
$rows = $qb
|
|
|
|
->select([
|
|
|
|
'NEW Skobkin\Bundle\PointToolsBundle\DTO\DailyEvents(DAY(se.date), COUNT(se))',
|
|
|
|
'DAY(se.date) as day',
|
|
|
|
])
|
|
|
|
->groupBy('day')
|
|
|
|
->orderBy('day', 'DESC')
|
|
|
|
->setMaxResults($days)
|
|
|
|
->getQuery()->getResult()
|
|
|
|
;
|
|
|
|
|
|
|
|
$result = [];
|
|
|
|
|
|
|
|
// Removing unnecessary element, saving DTO
|
|
|
|
// @todo remove crutches, refactor query
|
|
|
|
foreach ($rows as $row) {
|
|
|
|
unset($row['day']);
|
|
|
|
$result[] = reset($row);
|
|
|
|
}
|
|
|
|
|
2017-01-10 01:30:53 +00:00
|
|
|
$result = array_reverse($result);
|
|
|
|
|
2017-01-10 01:21:57 +00:00
|
|
|
return $result;
|
|
|
|
}
|
2015-06-23 09:38:43 +00:00
|
|
|
}
|