Spaces:
No application file
No application file
| namespace Mautic\PageBundle\Model; | |
| use Doctrine\ORM\EntityManager; | |
| use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
| use Mautic\CoreBundle\Helper\IpLookupHelper; | |
| use Mautic\CoreBundle\Helper\UserHelper; | |
| use Mautic\CoreBundle\Model\FormModel; | |
| use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
| use Mautic\CoreBundle\Translation\Translator; | |
| use Mautic\LeadBundle\Entity\Lead; | |
| use Mautic\LeadBundle\Tracker\ContactTracker; | |
| use Mautic\PageBundle\Entity\VideoHit; | |
| use Mautic\PageBundle\Entity\VideoHitRepository; | |
| use Mautic\PageBundle\Event\VideoHitEvent; | |
| use Mautic\PageBundle\PageEvents; | |
| use Psr\Log\LoggerInterface; | |
| use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\Routing\Generator\UrlGeneratorInterface; | |
| /** | |
| * @extends FormModel<VideoHit> | |
| */ | |
| class VideoModel extends FormModel | |
| { | |
| public function __construct( | |
| protected IpLookupHelper $ipLookupHelper, | |
| protected ContactTracker $contactTracker, | |
| EntityManager $em, | |
| CorePermissions $security, | |
| EventDispatcherInterface $dispatcher, | |
| UrlGeneratorInterface $router, | |
| Translator $translator, | |
| UserHelper $userHelper, | |
| LoggerInterface $mauticLogger, | |
| CoreParametersHelper $coreParametersHelper | |
| ) { | |
| parent::__construct($em, $security, $dispatcher, $router, $translator, $userHelper, $mauticLogger, $coreParametersHelper); | |
| } | |
| public function getHitRepository(): VideoHitRepository | |
| { | |
| return $this->em->getRepository(VideoHit::class); | |
| } | |
| public function getPermissionBase(): string | |
| { | |
| return 'page:pages'; | |
| } | |
| public function getNameGetter(): string | |
| { | |
| return 'getTitle'; | |
| } | |
| /** | |
| * @param string $guid | |
| * | |
| * @return VideoHit | |
| */ | |
| public function getHitForLeadByGuid(Lead $lead, $guid) | |
| { | |
| return $this->getHitRepository()->getHitForLeadByGuid($lead, $guid); | |
| } | |
| /** | |
| * @param Request $request | |
| * @param string $code | |
| * | |
| * @throws \Doctrine\ORM\ORMException | |
| * @throws \Exception | |
| */ | |
| public function hitVideo($request, $code = '200'): void | |
| { | |
| // don't skew results with in-house hits | |
| if (!$this->security->isAnonymous()) { | |
| // return; | |
| } | |
| $lead = $this->contactTracker->getContact(); | |
| $guid = $request->get('guid'); | |
| $hit = ($lead) ? $this->getHitForLeadByGuid($lead, $guid) : new VideoHit(); | |
| $hit->setGuid($guid); | |
| $hit->setDateHit(new \DateTime()); | |
| $hit->setDuration($request->get('duration')); | |
| $hit->setUrl($request->get('url')); | |
| $hit->setTimeWatched($request->get('total_watched')); | |
| // check for existing IP | |
| $ipAddress = $this->ipLookupHelper->getIpAddress(); | |
| $hit->setIpAddress($ipAddress); | |
| // Store query array | |
| $query = $request->query->all(); | |
| unset($query['d']); | |
| $hit->setQuery($query); | |
| if ($lead) { | |
| $hit->setLead($lead); | |
| } | |
| // glean info from the IP address | |
| if ($details = $ipAddress->getIpDetails()) { | |
| $hit->setCountry($details['country']); | |
| $hit->setRegion($details['region']); | |
| $hit->setCity($details['city']); | |
| $hit->setIsp($details['isp']); | |
| $hit->setOrganization($details['organization']); | |
| } | |
| $hit->setCode($code); | |
| if (!$hit->getReferer()) { | |
| $hit->setReferer($request->server->get('HTTP_REFERER')); | |
| } | |
| $hit->setUserAgent($request->server->get('HTTP_USER_AGENT')); | |
| $hit->setRemoteHost($request->server->get('REMOTE_HOST')); | |
| // get a list of the languages the user prefers | |
| $browserLanguages = $request->server->get('HTTP_ACCEPT_LANGUAGE'); | |
| if (!empty($browserLanguages)) { | |
| $languages = explode(',', $browserLanguages); | |
| foreach ($languages as $k => $l) { | |
| if (($pos = strpos(';q=', $l)) !== false) { | |
| // remove weights | |
| $languages[$k] = substr($l, 0, $pos); | |
| } | |
| } | |
| $hit->setBrowserLanguages($languages); | |
| } | |
| // Wrap in a try/catch to prevent deadlock errors on busy servers | |
| try { | |
| $this->em->persist($hit); | |
| $this->em->flush(); | |
| } catch (\Exception $exception) { | |
| if (MAUTIC_ENV === 'dev') { | |
| throw $exception; | |
| } else { | |
| $this->logger->error( | |
| $exception->getMessage(), | |
| ['exception' => $exception] | |
| ); | |
| } | |
| } | |
| if ($this->dispatcher->hasListeners(PageEvents::VIDEO_ON_HIT)) { | |
| $event = new VideoHitEvent($hit, $request, $code); | |
| $this->dispatcher->dispatch($event, PageEvents::VIDEO_ON_HIT); | |
| } | |
| } | |
| } | |