Spaces:
No application file
No application file
| namespace Mautic\ChannelBundle\Entity; | |
| use Doctrine\DBAL\ArrayParameterType; | |
| use Mautic\CoreBundle\Entity\CommonRepository; | |
| use Mautic\LeadBundle\Entity\TimelineTrait; | |
| /** | |
| * @extends CommonRepository<MessageQueue> | |
| */ | |
| class MessageQueueRepository extends CommonRepository | |
| { | |
| use TimelineTrait; | |
| public function findMessage($channel, $channelId, $leadId) | |
| { | |
| $results = $this->createQueryBuilder('mq') | |
| ->where('IDENTITY(mq.lead) = :leadId') | |
| ->andWhere('mq.channel = :channel') | |
| ->andWhere('mq.channelId = :channelId') | |
| ->setParameter('leadId', $leadId) | |
| ->setParameter('channel', $channel) | |
| ->setParameter('channelId', $channelId) | |
| ->getQuery() | |
| ->getResult(); | |
| return ($results) ? $results[0] : null; | |
| } | |
| /** | |
| * @return array<int, MessageQueue> | |
| */ | |
| public function getQueuedMessages($limit, $processStarted, $channel = null, $channelId = null) | |
| { | |
| $q = $this->createQueryBuilder('mq'); | |
| $q->where($q->expr()->eq('mq.success', ':success')) | |
| ->andWhere($q->expr()->lt('mq.attempts', 'mq.maxAttempts')) | |
| ->andWhere('mq.lastAttempt is null or mq.lastAttempt < :processStarted') | |
| ->andWhere('mq.scheduledDate <= :processStarted') | |
| ->setParameter('success', false, 'boolean') | |
| ->setParameter('processStarted', $processStarted) | |
| ->indexBy('mq', 'mq.id'); | |
| $q->orderBy('mq.priority, mq.scheduledDate', \Doctrine\Common\Collections\Criteria::ASC); | |
| if ($limit) { | |
| $q->setMaxResults((int) $limit); | |
| } | |
| if ($channel) { | |
| $q->andWhere($q->expr()->eq('mq.channel', ':channel')) | |
| ->setParameter('channel', $channel); | |
| if ($channelId) { | |
| $q->andWhere($q->expr()->eq('mq.channelId', (int) $channelId)); | |
| } | |
| } | |
| return $q->getQuery()->getResult(); | |
| } | |
| public function getQueuedChannelCount($channel, array $ids = null): int | |
| { | |
| $q = $this->getEntityManager()->getConnection()->createQueryBuilder(); | |
| $expr = $q->expr()->and( | |
| $q->expr()->eq($this->getTableAlias().'.channel', ':channel'), | |
| $q->expr()->neq($this->getTableAlias().'.status', ':status') | |
| ); | |
| if (!empty($ids)) { | |
| $expr = $expr->with( | |
| $q->expr()->in($this->getTableAlias().'.channel_id', $ids) | |
| ); | |
| } | |
| return (int) $q->select('count(*)') | |
| ->from(MAUTIC_TABLE_PREFIX.'message_queue', $this->getTableAlias()) | |
| ->where($expr) | |
| ->setParameter('channel', $channel) | |
| ->setParameter('status', MessageQueue::STATUS_SENT) | |
| ->setParameter('ids', $ids, ArrayParameterType::INTEGER) | |
| ->executeQuery() | |
| ->fetchOne(); | |
| } | |
| /** | |
| * Get a lead's point log. | |
| * | |
| * @param int|null $leadId | |
| * | |
| * @return array | |
| */ | |
| public function getLeadTimelineEvents($leadId = null, array $options = []) | |
| { | |
| $query = $this->getEntityManager()->getConnection()->createQueryBuilder() | |
| ->from(MAUTIC_TABLE_PREFIX.'message_queue', 'mq') | |
| ->select('mq.id, mq.lead_id, mq.channel as channelName, mq.channel_id as channelId, | |
| mq.priority as priority, mq.attempts, mq.success, mq.status, mq.date_published as dateAdded, | |
| mq.scheduled_date as scheduledDate, mq.last_attempt as lastAttempt, mq.date_sent as dateSent'); | |
| if ($leadId) { | |
| $query->where('mq.lead_id = '.(int) $leadId); | |
| } | |
| if (isset($options['search']) && $options['search']) { | |
| $query->andWhere($query->expr()->or( | |
| $query->expr()->like('mq.channel', $query->expr()->literal('%'.$options['search'].'%')) | |
| )); | |
| } | |
| return $this->getTimelineResults($query, $options, 'mq.channel', 'mq.date_published', [], ['dateAdded']); | |
| } | |
| } | |