chrisbryan17's picture
Upload folder using huggingface_hub
d2897cd verified
<?php
namespace Mautic\CampaignBundle\Model;
use Doctrine\ORM\EntityManager;
use Mautic\CampaignBundle\Entity\Event;
use Mautic\CampaignBundle\Entity\LeadEventLog;
use Mautic\CampaignBundle\Entity\LeadEventLogRepository;
use Mautic\CampaignBundle\Executioner\Scheduler\EventScheduler;
use Mautic\CoreBundle\Helper\CoreParametersHelper;
use Mautic\CoreBundle\Helper\InputHelper;
use Mautic\CoreBundle\Helper\IpLookupHelper;
use Mautic\CoreBundle\Helper\UserHelper;
use Mautic\CoreBundle\Model\AbstractCommonModel;
use Mautic\CoreBundle\Security\Permissions\CorePermissions;
use Mautic\CoreBundle\Translation\Translator;
use Mautic\LeadBundle\Entity\Lead;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* @extends AbstractCommonModel<LeadEventLog>
*/
class EventLogModel extends AbstractCommonModel
{
public function __construct(
protected EventModel $eventModel,
protected CampaignModel $campaignModel,
protected IpLookupHelper $ipLookupHelper,
protected EventScheduler $eventScheduler,
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 getRepository(): LeadEventLogRepository
{
return $this->em->getRepository(LeadEventLog::class);
}
public function getPermissionBase(): string
{
return 'campaign:campaigns';
}
public function getEntities(array $args = [])
{
/** @var LeadEventLog[] $logs */
$logs = parent::getEntities($args);
if (!empty($args['campaign_id']) && !empty($args['contact_id'])) {
/** @var Event[] $events */
$events = $this->eventModel->getEntities(
[
'campaign_id' => $args['campaign_id'],
'ignore_children' => true,
'index_by' => 'id',
'ignore_paginator' => true,
]
);
foreach ($logs as $log) {
$event = $log->getEvent()->getId();
$events[$event]->addContactLog($log);
}
return array_values($events);
}
return $logs;
}
/**
* @return string|mixed[]
*/
public function updateContactEvent(Event $event, Lead $contact, array $parameters): string|array
{
$campaign = $event->getCampaign();
// Check that contact is part of the campaign
$membership = $campaign->getContactMembership($contact);
if (0 === count($membership)) {
return $this->translator->trans(
'mautic.campaign.error.contact_not_in_campaign',
['%campaign%' => $campaign->getId(), '%contact%' => $contact->getId()],
'flashes'
);
}
/** @var \Mautic\CampaignBundle\Entity\Lead $m */
foreach ($membership as $m) {
if ($m->getManuallyRemoved()) {
return $this->translator->trans(
'mautic.campaign.error.contact_not_in_campaign',
['%campaign%' => $campaign->getId(), '%contact%' => $contact->getId()],
'flashes'
);
}
}
// Check that contact has not executed the event already
$logs = $event->getContactLog($contact);
$created = false;
if (count($logs)) {
$log = $logs[0];
if ($log->getDateTriggered()) {
return $this->translator->trans(
'mautic.campaign.error.event_already_executed',
[
'%campaign%' => $campaign->getId(),
'%event%' => $event->getId(),
'%contact%' => $contact->getId(),
'%dateTriggered%' => $log->getDateTriggered()->format(\DateTimeInterface::ATOM),
],
'flashes'
);
}
} else {
if (!isset($parameters['triggerDate']) && !isset($parameters['dateTriggered'])) {
return $this->translator->trans(
'mautic.campaign.error.event_must_be_scheduled',
[
'%campaign%' => $campaign->getId(),
'%event%' => $event->getId(),
'%contact%' => $contact->getId(),
],
'flashes'
);
}
$log = (new LeadEventLog())
->setLead($contact)
->setEvent($event);
$created = true;
}
foreach ($parameters as $property => $value) {
switch ($property) {
case 'dateTriggered':
$log->setDateTriggered(
new \DateTime($value)
);
break;
case 'triggerDate':
if (Event::TYPE_DECISION === $event->getEventType()) {
return $this->translator->trans(
'mautic.campaign.error.decision_cannot_be_scheduled',
[
'%campaign%' => $campaign->getId(),
'%event%' => $event->getId(),
'%contact%' => $contact->getId(),
],
'flashes'
);
}
$log->setTriggerDate(
new \DateTime($value)
);
break;
case 'ipAddress':
if (!defined('MAUTIC_CAMPAIGN_SYSTEM_TRIGGERED')) {
$log->setIpAddress(
$this->ipLookupHelper->getIpAddress($value)
);
}
break;
case 'metadata':
$metadata = $log->getMetadata();
if (is_array($value)) {
$newMetadata = $value;
} elseif ($jsonDecoded = json_decode($value, true)) {
$newMetadata = $jsonDecoded;
} else {
$newMetadata = (array) $value;
}
$newMetadata = InputHelper::cleanArray($newMetadata);
$log->setMetadata(array_merge($metadata, $newMetadata));
break;
case 'nonActionPathTaken':
$log->setNonActionPathTaken((bool) $value);
break;
case 'channel':
$log->setChannel(InputHelper::clean($value));
break;
case 'channelId':
$log->setChannel(intval($value));
break;
}
}
$this->saveEntity($log);
return [$log, $created];
}
public function saveEntity(LeadEventLog $entity): void
{
$triggerDate = $entity->getTriggerDate();
if (null === $triggerDate) {
// Reschedule for now
$triggerDate = new \DateTime();
}
$this->eventScheduler->reschedule($entity, $triggerDate);
}
}