Initial commit: CloudOps infrastructure platform

This commit is contained in:
root
2026-04-09 19:58:57 +02:00
commit 1166a52f26
7762 changed files with 839452 additions and 0 deletions

View File

@@ -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();
}
}

View File

@@ -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;
}
}
}
}