158 lines
4.8 KiB
PHP
Executable File
158 lines
4.8 KiB
PHP
Executable File
<?php
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|