Spaces:
No application file
No application file
| namespace Mautic\PageBundle\Entity; | |
| use Mautic\CoreBundle\Entity\CommonRepository; | |
| use Mautic\LeadBundle\Entity\Lead; | |
| use Mautic\LeadBundle\Entity\TimelineTrait; | |
| /** | |
| * @extends CommonRepository<VideoHit> | |
| */ | |
| class VideoHitRepository extends CommonRepository | |
| { | |
| use TimelineTrait; | |
| /** | |
| * Get video hit info for lead timeline. | |
| * | |
| * @param int|null $leadId | |
| * | |
| * @return array | |
| */ | |
| public function getTimelineStats($leadId = null, array $options = []) | |
| { | |
| $query = $this->getEntityManager()->getConnection()->createQueryBuilder(); | |
| $query->select('h.id, h.url, h.date_hit, h.time_watched, h.duration, h.referer, h.user_agent') | |
| ->from(MAUTIC_TABLE_PREFIX.'video_hits', 'h'); | |
| if ($leadId) { | |
| $query->where($query->expr()->eq('h.lead_id', (int) $leadId)); | |
| } | |
| if (isset($options['search']) && $options['search']) { | |
| $query->andWhere( | |
| $query->expr()->like('h.url', $query->expr()->literal('%'.$options['search'].'%')) | |
| ); | |
| } | |
| return $this->getTimelineResults($query, $options, 'h.url', 'h.date_hit', [], ['date_hit']); | |
| } | |
| /** | |
| * @param string $guid | |
| * | |
| * @return VideoHit | |
| */ | |
| public function getHitForLeadByGuid(Lead $lead, $guid) | |
| { | |
| $result = $this->findOneBy(['guid' => $guid, 'lead' => $lead]); | |
| return $result ?: new VideoHit(); | |
| } | |
| /** | |
| * Get a lead's page hits. | |
| * | |
| * @param int $leadId | |
| * | |
| * @return array | |
| * | |
| * @throws \Doctrine\ORM\NoResultException | |
| * @throws \Doctrine\ORM\NonUniqueResultException | |
| */ | |
| public function getLeadHits($leadId, array $options = []) | |
| { | |
| $query = $this->createQueryBuilder('h'); | |
| $query->select('h.userAgent, h.dateHit, h.dateLeft, h.referer, h.channel, h.channelId, h.url, h.duration, h.query, h.timeWatched') | |
| ->where('h.lead = :leadId') | |
| ->setParameter('leadId', (int) $leadId); | |
| if (isset($options['url']) && $options['url']) { | |
| $query->andWhere($query->expr()->eq('h.url', $query->expr()->literal($options['url']))); | |
| } | |
| return $query->getQuery()->getArrayResult(); | |
| } | |
| /** | |
| * Count stats from hit times. | |
| * | |
| * @param array $times | |
| */ | |
| public function countStats($times): array | |
| { | |
| return [ | |
| 'sum' => array_sum($times), | |
| 'min' => count($times) ? min($times) : 0, | |
| 'max' => count($times) ? max($times) : 0, | |
| 'average' => count($times) ? round(array_sum($times) / count($times)) : 0, | |
| 'count' => count($times), | |
| ]; | |
| } | |
| /** | |
| * Get list of referers ordered by it's count. | |
| * | |
| * @param \Doctrine\DBAL\Query\QueryBuilder $query | |
| * @param int $limit | |
| * @param int $offset | |
| * | |
| * @throws \Doctrine\ORM\NoResultException | |
| * @throws \Doctrine\ORM\NonUniqueResultException | |
| */ | |
| public function getReferers($query, $limit = 10, $offset = 0): array | |
| { | |
| $query->select('h.referer, count(h.referer) as sessions') | |
| ->groupBy('h.referer') | |
| ->orderBy('sessions', 'DESC') | |
| ->setMaxResults($limit) | |
| ->setFirstResult($offset); | |
| return $query->executeQuery()->fetchAllAssociative(); | |
| } | |
| /** | |
| * Updates lead ID (e.g. after a lead merge). | |
| */ | |
| public function updateLead($fromLeadId, $toLeadId): void | |
| { | |
| $q = $this->_em->getConnection()->createQueryBuilder(); | |
| $q->update(MAUTIC_TABLE_PREFIX.'video_hits') | |
| ->set('lead_id', (int) $toLeadId) | |
| ->where('lead_id = '.(int) $fromLeadId) | |
| ->executeStatement(); | |
| } | |
| } | |