Spaces:
No application file
No application file
namespace Mautic\CampaignBundle\Controller\Api; | |
use Doctrine\Persistence\ManagerRegistry; | |
use FOS\RestBundle\View\View; | |
use Mautic\ApiBundle\Controller\FetchCommonApiController; | |
use Mautic\ApiBundle\Helper\EntityResultHelper; | |
use Mautic\ApiBundle\Serializer\Exclusion\FieldInclusionStrategy; | |
use Mautic\CampaignBundle\Entity\Campaign; | |
use Mautic\CampaignBundle\Entity\Event; | |
use Mautic\CampaignBundle\Entity\LeadEventLog; | |
use Mautic\CampaignBundle\Model\EventLogModel; | |
use Mautic\CampaignBundle\Model\EventModel; | |
use Mautic\CoreBundle\Factory\MauticFactory; | |
use Mautic\CoreBundle\Factory\ModelFactory; | |
use Mautic\CoreBundle\Helper\AppVersion; | |
use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
use Mautic\CoreBundle\Helper\UserHelper; | |
use Mautic\CoreBundle\Security\Permissions\CorePermissions; | |
use Mautic\CoreBundle\Translation\Translator; | |
use Mautic\LeadBundle\Controller\LeadAccessTrait; | |
use Mautic\LeadBundle\Entity\Lead; | |
use Symfony\Component\EventDispatcher\EventDispatcherInterface; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\RequestStack; | |
use Symfony\Component\HttpFoundation\Response; | |
/** | |
* @extends FetchCommonApiController<LeadEventLog> | |
*/ | |
class EventLogApiController extends FetchCommonApiController | |
{ | |
use LeadAccessTrait; | |
private const LOG_SERIALIZATION = 30; | |
/** | |
* @var Campaign | |
*/ | |
protected $campaign; | |
/** | |
* @var Lead | |
*/ | |
protected $contact; | |
/** | |
* @var EventLogModel|null | |
*/ | |
protected $model; | |
public function __construct( | |
CorePermissions $security, | |
Translator $translator, | |
EntityResultHelper $entityResultHelper, | |
AppVersion $appVersion, | |
RequestStack $requestStack, | |
ManagerRegistry $doctrine, | |
ModelFactory $modelFactory, | |
EventDispatcherInterface $dispatcher, | |
CoreParametersHelper $coreParametersHelper, | |
MauticFactory $factory, | |
) { | |
$campaignEventLogModel = $modelFactory->getModel('campaign.event_log'); | |
\assert($campaignEventLogModel instanceof EventLogModel); | |
$this->model = $campaignEventLogModel; | |
$this->entityClass = LeadEventLog::class; | |
$this->entityNameOne = 'event'; | |
$this->entityNameMulti = 'events'; | |
$this->parentChildrenLevelDepth = 1; | |
$this->serializerGroups = [ | |
'campaignList', | |
'ipAddressList', | |
self::LOG_SERIALIZATION => 'campaignEventLogDetails', | |
]; | |
// Only include the id of the parent | |
$this->addExclusionStrategy(new FieldInclusionStrategy(['id'], 1, 'parent')); | |
parent::__construct($security, $translator, $entityResultHelper, $appVersion, $requestStack, $doctrine, $modelFactory, $dispatcher, $coreParametersHelper, $factory); | |
} | |
/** | |
* @return Response | |
*/ | |
public function getEntitiesAction(Request $request, UserHelper $userHelper) | |
{ | |
$this->serializerGroups[self::LOG_SERIALIZATION] = 'campaignEventStandaloneLogDetails'; | |
$this->serializerGroups[] = 'campaignEventStandaloneList'; | |
$this->serializerGroups[] = 'leadBasicList'; | |
return parent::getEntitiesAction($request, $userHelper); | |
} | |
/** | |
* Get a list of events. | |
* | |
* @return Response | |
*/ | |
public function getContactEventsAction(Request $request, UserHelper $userHelper, $contactId, $campaignId = null) | |
{ | |
// Ensure contact exists and user has access | |
$contact = $this->checkLeadAccess($contactId, 'view'); | |
if ($contact instanceof Response) { | |
return $contact; | |
} | |
// Ensure campaign exists and user has access | |
if (!empty($campaignId)) { | |
$campaign = $this->getModel('campaign')->getEntity($campaignId); | |
if (null == $campaign || !$campaign->getId()) { | |
return $this->notFound(); | |
} | |
if (!$this->checkEntityAccess($campaign)) { | |
return $this->accessDenied(); | |
} | |
// Check that contact is part of the campaign | |
$membership = $campaign->getContactMembership($contact); | |
if (0 === count($membership)) { | |
return $this->returnError( | |
$this->translator->trans( | |
'mautic.campaign.error.contact_not_in_campaign', | |
['%campaign%' => $campaignId, '%contact%' => $contactId] | |
), | |
Response::HTTP_CONFLICT | |
); | |
} | |
$this->campaign = $campaign; | |
$this->serializerGroups[] = 'campaignEventWithLogsList'; | |
$this->serializerGroups[] = 'campaignLeadList'; | |
} else { | |
unset($this->serializerGroups[self::LOG_SERIALIZATION]); | |
$this->serializerGroups[] = 'campaignEventStandaloneList'; | |
$this->serializerGroups[] = 'campaignEventStandaloneLogDetails'; | |
} | |
$this->contact = $contact; | |
$this->extraGetEntitiesArguments = [ | |
'contact_id' => $contactId, | |
'campaign_id' => $campaignId, | |
]; | |
return $this->getEntitiesAction($request, $userHelper); | |
} | |
/** | |
* @return Response | |
*/ | |
public function editContactEventAction(Request $request, $eventId, $contactId) | |
{ | |
$parameters = $request->request->all(); | |
// Ensure contact exists and user has access | |
$contact = $this->checkLeadAccess($contactId, 'edit'); | |
if ($contact instanceof Response) { | |
return $contact; | |
} | |
/** @var EventModel $eventModel */ | |
$eventModel = $this->getModel('campaign.event'); | |
/** @var Event $event */ | |
$event = $eventModel->getEntity($eventId); | |
if (null === $event || !$event->getId()) { | |
return $this->notFound(); | |
} | |
// Ensure campaign edit access | |
$campaign = $event->getCampaign(); | |
if (!$this->checkEntityAccess($campaign, 'edit')) { | |
return $this->accessDenied(); | |
} | |
$result = $this->model->updateContactEvent($event, $contact, $parameters); | |
if (is_string($result)) { | |
return $this->returnError($result, Response::HTTP_CONFLICT); | |
} else { | |
[$log, $created] = $result; | |
} | |
$event->addContactLog($log); | |
$view = $this->view( | |
[ | |
$this->entityNameOne => $event, | |
], | |
($created) ? Response::HTTP_CREATED : Response::HTTP_OK | |
); | |
$this->serializerGroups[] = 'campaignEventWithLogsDetails'; | |
$this->serializerGroups[] = 'campaignBasicList'; | |
$this->setSerializationContext($view); | |
return $this->handleView($view); | |
} | |
/** | |
* @return array|Response | |
*/ | |
public function editEventsAction(Request $request) | |
{ | |
$parameters = $request->request->all(); | |
$valid = $this->validateBatchPayload($parameters); | |
if ($valid instanceof Response) { | |
return $valid; | |
} | |
$events = $this->getBatchEntities($parameters, $errors, false, 'eventId', $this->getModel('campaign.event'), false); | |
$contacts = $this->getBatchEntities($parameters, $errors, false, 'contactId', $this->getModel('lead'), false); | |
$this->inBatchMode = true; | |
$errors = []; | |
foreach ($parameters as $key => $params) { | |
if (!isset($params['eventId']) || !isset($params['contactId']) || !isset($events[$params['eventId']]) | |
|| !isset($contacts[$params['contactId']]) | |
) { | |
$errors[$key] = $this->notFound('mautic.campaign.error.edit_events.request_invalid'); | |
continue; | |
} | |
$event = $events[$params['eventId']]; | |
// Ensure contact exists and user has access | |
$contact = $this->checkLeadAccess($contacts[$params['contactId']], 'edit'); | |
if ($contact instanceof Response) { | |
$errors[$key] = $contact->getContent(); | |
continue; | |
} | |
// Ensure campaign edit access | |
$campaign = $event->getCampaign(); | |
if (!$this->checkEntityAccess($campaign, 'edit')) { | |
$errors[$key] = $this->accessDenied(); | |
continue; | |
} | |
$result = $this->model->updateContactEvent($event, $contact, $params); | |
if (is_string($result)) { | |
$errors[$key] = $this->returnError($result, Response::HTTP_CONFLICT); | |
} else { | |
[$log, $created] = $result; | |
$event->addContactLog($log); | |
} | |
} | |
$payload = [ | |
$this->entityNameMulti => $events, | |
]; | |
if (!empty($errors)) { | |
$payload['errors'] = $errors; | |
} | |
$view = $this->view($payload, Response::HTTP_OK); | |
$this->serializerGroups[] = 'campaignEventWithLogsList'; | |
$this->setSerializationContext($view); | |
return $this->handleView($view); | |
} | |
protected function view($data = null, ?int $statusCode = null, array $headers = []): View | |
{ | |
if ($this->campaign) { | |
$data['campaign'] = $this->campaign; | |
if ($this->contact) { | |
[$data['membership'], $ignore] = $this->prepareEntitiesForView($this->campaign->getContactMembership($this->contact)); | |
} | |
} | |
return parent::view($data, $statusCode, $headers); | |
} | |
} | |