Initial commit: CloudOps infrastructure platform
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\ChannelBundle\PreferenceBuilder;
|
||||
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Mautic\CampaignBundle\Entity\Event;
|
||||
use Mautic\CampaignBundle\Entity\LeadEventLog;
|
||||
|
||||
class ChannelPreferences
|
||||
{
|
||||
/**
|
||||
* @var ArrayCollection[]
|
||||
*/
|
||||
private array $organizedByPriority = [];
|
||||
|
||||
public function __construct(
|
||||
private Event $event,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $priority
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addPriority($priority)
|
||||
{
|
||||
$priority = (int) $priority;
|
||||
|
||||
if (!isset($this->organizedByPriority[$priority])) {
|
||||
$this->organizedByPriority[$priority] = new ArrayCollection();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $priority
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function addLog(LeadEventLog $log, $priority)
|
||||
{
|
||||
$priority = (int) $priority;
|
||||
|
||||
$this->addPriority($priority);
|
||||
|
||||
// We have to clone the log to not affect the original assocaited with the MM event itself
|
||||
|
||||
// Clone to remove from Doctrine's ORM memory since we're having to apply a pseudo event
|
||||
$log = clone $log;
|
||||
$log->setEvent($this->event);
|
||||
|
||||
$this->organizedByPriority[$priority]->set($log->getId(), $log);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a log from all prioritized groups.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function removeLog(LeadEventLog $log)
|
||||
{
|
||||
foreach ($this->organizedByPriority as $logs) {
|
||||
/** @var ArrayCollection<int, LeadEventLog> $logs */
|
||||
$logs->remove($log->getId());
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $priority
|
||||
*
|
||||
* @return ArrayCollection|LeadEventLog[]
|
||||
*/
|
||||
public function getLogsByPriority($priority)
|
||||
{
|
||||
$priority = (int) $priority;
|
||||
|
||||
return $this->organizedByPriority[$priority] ?? new ArrayCollection();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
namespace Mautic\ChannelBundle\PreferenceBuilder;
|
||||
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Mautic\CampaignBundle\Entity\Event;
|
||||
use Mautic\CampaignBundle\Entity\LeadEventLog;
|
||||
use Mautic\LeadBundle\Entity\DoNotContact;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
class PreferenceBuilder
|
||||
{
|
||||
/**
|
||||
* @var ChannelPreferences[]
|
||||
*/
|
||||
private array $channels = [];
|
||||
|
||||
public function __construct(
|
||||
ArrayCollection $logs,
|
||||
private Event $event,
|
||||
array $channels,
|
||||
private LoggerInterface $logger,
|
||||
) {
|
||||
$this->buildRules($logs, $channels);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ChannelPreferences[]
|
||||
*/
|
||||
public function getChannelPreferences()
|
||||
{
|
||||
return $this->channels;
|
||||
}
|
||||
|
||||
public function removeLogFromAllChannels(LeadEventLog $log): void
|
||||
{
|
||||
foreach ($this->channels as $channelPreferences) {
|
||||
$channelPreferences->removeLog($log);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $channel
|
||||
* @param int $priority
|
||||
*/
|
||||
private function addChannelRule($channel, array $rule, LeadEventLog $log, $priority): void
|
||||
{
|
||||
$channelPreferences = $this->getChannelPreferenceObject($channel, $priority);
|
||||
|
||||
if (DoNotContact::IS_CONTACTABLE !== $rule['dnc']) {
|
||||
$log->appendToMetadata(
|
||||
[
|
||||
$channel => [
|
||||
'failed' => 1,
|
||||
'dnc' => $rule['dnc'],
|
||||
],
|
||||
]
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->logger->debug("MARKETING MESSAGE: Set $channel as priority $priority for contact ID #".$log->getLead()->getId());
|
||||
|
||||
$channelPreferences->addLog($log, $priority);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $channel
|
||||
*
|
||||
* @return ChannelPreferences
|
||||
*/
|
||||
private function getChannelPreferenceObject($channel, $priority)
|
||||
{
|
||||
if (!isset($this->channels[$channel])) {
|
||||
$this->channels[$channel] = new ChannelPreferences($this->event);
|
||||
}
|
||||
|
||||
$this->channels[$channel]->addPriority($priority);
|
||||
|
||||
return $this->channels[$channel];
|
||||
}
|
||||
|
||||
private function buildRules(ArrayCollection $logs, array $channels): void
|
||||
{
|
||||
/** @var LeadEventLog $log */
|
||||
foreach ($logs as $log) {
|
||||
$channelRules = $log->getLead()->getChannelRules();
|
||||
$allChannels = $channels;
|
||||
$priority = 1;
|
||||
|
||||
// Build priority based on channel rules
|
||||
foreach ($channelRules as $channel => $rule) {
|
||||
$this->addChannelRule($channel, $rule, $log, $priority);
|
||||
++$priority;
|
||||
unset($allChannels[$channel]);
|
||||
}
|
||||
|
||||
// Add the rest of the channels as least priority
|
||||
foreach ($allChannels as $channel => $messageSettings) {
|
||||
$this->addChannelRule($channel, ['dnc' => DoNotContact::IS_CONTACTABLE], $log, $priority);
|
||||
++$priority;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user