Spaces:
No application file
No application file
mautic
/
app
/bundles
/IntegrationsBundle
/Sync
/Notification
/Helper
/UserSummaryNotificationHelper.php
| declare(strict_types=1); | |
| namespace Mautic\IntegrationsBundle\Sync\Notification\Helper; | |
| use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotSupportedException; | |
| use Mautic\IntegrationsBundle\Sync\Notification\Writer; | |
| use Symfony\Contracts\Translation\TranslatorInterface; | |
| class UserSummaryNotificationHelper | |
| { | |
| /** | |
| * @var array | |
| */ | |
| private $userNotifications = []; | |
| /** | |
| * @var string | |
| */ | |
| private $integrationDisplayName; | |
| /** | |
| * @var string | |
| */ | |
| private $objectDisplayName; | |
| private ?string $mauticObject = null; | |
| private ?string $listTranslationKey = null; | |
| public function __construct( | |
| private Writer $writer, | |
| private UserHelper $userHelper, | |
| private OwnerProvider $ownerProvider, | |
| private RouteHelper $routeHelper, | |
| private TranslatorInterface $translator | |
| ) { | |
| } | |
| /** | |
| * @throws ObjectNotSupportedException | |
| * @throws \Doctrine\ORM\ORMException | |
| */ | |
| public function writeNotifications(string $mauticObject, string $listTranslationKey): void | |
| { | |
| $this->mauticObject = $mauticObject; | |
| $this->listTranslationKey = $listTranslationKey; | |
| if (empty($this->userNotifications)) { | |
| return; | |
| } | |
| foreach ($this->userNotifications as $integrationDisplayName => $integrationNotifications) { | |
| foreach ($integrationNotifications as $objectDisplayName => $objectNotifications) { | |
| $this->integrationDisplayName = $integrationDisplayName; | |
| $this->objectDisplayName = $objectDisplayName; | |
| $this->findAndSendToUsers($objectNotifications); | |
| } | |
| } | |
| $this->userNotifications = []; | |
| } | |
| public function storeSummaryNotification(string $integrationDisplayName, string $objectDisplayName, int $id): void | |
| { | |
| if (!isset($this->userNotifications[$integrationDisplayName])) { | |
| $this->userNotifications[$integrationDisplayName] = []; | |
| } | |
| if (!isset($this->userNotifications[$integrationDisplayName][$objectDisplayName])) { | |
| $this->userNotifications[$integrationDisplayName][$objectDisplayName] = []; | |
| } | |
| $this->userNotifications[$integrationDisplayName][$objectDisplayName][$id] = $id; | |
| } | |
| /** | |
| * @throws \Doctrine\ORM\ORMException | |
| * @throws ObjectNotSupportedException | |
| */ | |
| private function findAndSendToUsers(array $ids): void | |
| { | |
| $results = $this->ownerProvider->getOwnersForObjectIds($this->mauticObject, $ids); | |
| $owners = []; | |
| // Group by owner ID. | |
| foreach ($results as $result) { | |
| $ownerId = $result['owner_id']; | |
| if (!isset($owners[$ownerId])) { | |
| $owners[$ownerId] = []; | |
| } | |
| $owners[$ownerId][] = (int) $result['id']; | |
| } | |
| foreach ($owners as $userId => $ownedObjectIds) { | |
| // Keep track of who is left over to send to admins instead | |
| $ids = array_diff($ids, $ownedObjectIds); | |
| $this->writeNotification($ownedObjectIds, $userId); | |
| } | |
| if (count($ids)) { | |
| // Send the rest to admins | |
| $adminUserIds = $this->userHelper->getAdminUsers(); | |
| foreach ($adminUserIds as $userId) { | |
| $this->writeNotification($ids, $userId); | |
| } | |
| } | |
| } | |
| /** | |
| * @throws ObjectNotSupportedException | |
| * @throws \Doctrine\ORM\ORMException | |
| */ | |
| private function writeNotification(array $ids, int $userId): void | |
| { | |
| $count = count($ids); | |
| if ($count > 25) { | |
| $this->writer->writeUserNotification( | |
| $this->translator->trans( | |
| 'mautic.integration.sync.user_notification.header', | |
| [ | |
| '%integration%' => $this->integrationDisplayName, | |
| '%object%' => ucfirst($this->objectDisplayName), | |
| ] | |
| ), | |
| $this->translator->trans( | |
| 'mautic.integration.sync.user_notification.count_message', | |
| ['%count%' => $count] | |
| ), | |
| $userId | |
| ); | |
| return; | |
| } | |
| $this->writer->writeUserNotification( | |
| $this->translator->trans( | |
| 'mautic.integration.sync.user_notification.header', | |
| [ | |
| '%integration%' => $this->integrationDisplayName, | |
| '%object%' => ucfirst($this->objectDisplayName), | |
| ] | |
| ), | |
| $this->translator->trans( | |
| $this->listTranslationKey, | |
| [ | |
| '%contacts%' => $this->routeHelper->getLinkCsv($this->mauticObject, $ids), | |
| ] | |
| ), | |
| $userId | |
| ); | |
| } | |
| } | |