Issues (3627)

ChannelBundle/Entity/MessageQueueRepository.php (1 issue)

1
<?php
2
3
/*
4
 * @copyright   2014 Mautic Contributors. All rights reserved
5
 * @author      Mautic
6
 *
7
 * @link        http://mautic.org
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\ChannelBundle\Entity;
13
14
use Mautic\CoreBundle\Entity\CommonRepository;
15
use Mautic\LeadBundle\Entity\TimelineTrait;
16
17
/**
18
 * MessageQueueRepository.
19
 */
20
class MessageQueueRepository extends CommonRepository
21
{
22
    use TimelineTrait;
23
24
    /**
25
     * @param $channel
26
     * @param $channelId
27
     * @param $leadId
28
     */
29
    public function findMessage($channel, $channelId, $leadId)
30
    {
31
        $results = $this->createQueryBuilder('mq')
32
            ->where('IDENTITY(mq.lead) = :leadId')
33
            ->andWhere('mq.channel = :channel')
34
            ->andWhere('mq.channelId = :channelId')
35
            ->setParameter('leadId', $leadId)
36
            ->setParameter('channel', $channel)
37
            ->setParameter('channelId', $channelId)
38
            ->getQuery()
39
            ->getResult();
40
41
        return ($results) ? $results[0] : null;
42
    }
43
44
    /**
45
     * @param      $limit
46
     * @param      $processStarted
47
     * @param null $channel
48
     * @param null $channelId
49
     *
50
     * @return mixed
51
     */
52
    public function getQueuedMessages($limit, $processStarted, $channel = null, $channelId = null)
53
    {
54
        $q = $this->createQueryBuilder('mq');
55
56
        $q->where($q->expr()->eq('mq.success', ':success'))
57
            ->andWhere($q->expr()->lt('mq.attempts', 'mq.maxAttempts'))
58
            ->andWhere('mq.lastAttempt is null or mq.lastAttempt < :processStarted')
59
            ->andWhere('mq.scheduledDate <= :processStarted')
60
            ->setParameter('success', false, 'boolean')
61
            ->setParameter('processStarted', $processStarted)
62
            ->indexBy('mq', 'mq.id');
63
64
        $q->orderBy('mq.priority, mq.scheduledDate', 'ASC');
65
66
        if ($limit) {
67
            $q->setMaxResults((int) $limit);
68
        }
69
70
        if ($channel) {
71
            $q->andWhere($q->expr()->eq('mq.channel', ':channel'))
72
                ->setParameter('channel', $channel);
73
74
            if ($channelId) {
75
                $q->andWhere($q->expr()->eq('mq.channelId', (int) $channelId));
76
            }
77
        }
78
79
        return $q->getQuery()->getResult();
80
    }
81
82
    /**
83
     * @param $channel
84
     *
85
     * @return bool|string
86
     */
87
    public function getQueuedChannelCount($channel, array $ids = null)
88
    {
89
        $q = $this->getEntityManager()->getConnection()->createQueryBuilder();
90
91
        $expr = $q->expr()->andX(
92
            $q->expr()->eq($this->getTableAlias().'.channel', ':channel'),
93
            $q->expr()->neq($this->getTableAlias().'.status', ':status')
94
        );
95
96
        if (!empty($ids)) {
97
            $expr->add(
98
                $q->expr()->in($this->getTableAlias().'.channel_id', $ids)
99
            );
100
        }
101
102
        return (int) $q->select('count(*)')
103
            ->from(MAUTIC_TABLE_PREFIX.'message_queue', $this->getTableAlias())
104
            ->where($expr)
105
            ->setParameters(
106
                [
107
                    'channel' => $channel,
108
                    'status'  => MessageQueue::STATUS_SENT,
109
                ]
110
            )
111
            ->execute()
112
            ->fetchColumn();
113
    }
114
115
    /**
116
     * Get a lead's point log.
117
     *
118
     * @param int|null $leadId
119
     *
120
     * @return array
121
     */
122
    public function getLeadTimelineEvents($leadId = null, array $options = [])
123
    {
124
        $query = $this->getEntityManager()->getConnection()->createQueryBuilder()
125
            ->from(MAUTIC_TABLE_PREFIX.'message_queue', 'mq')
126
            ->select('mq.id, mq.lead_id, mq.channel as channelName, mq.channel_id as channelId, 
127
            mq.priority as priority, mq.attempts, mq.success, mq.status, mq.date_published as dateAdded, 
128
            mq.scheduled_date as scheduledDate, mq.last_attempt as lastAttempt, mq.date_sent as dateSent');
129
130
        if ($leadId) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $leadId of type integer|null is loosely compared to true; this is ambiguous if the integer can be 0. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
131
            $query->where('mq.lead_id = '.(int) $leadId);
132
        }
133
134
        if (isset($options['search']) && $options['search']) {
135
            $query->andWhere($query->expr()->orX(
136
                $query->expr()->like('mq.channel', $query->expr()->literal('%'.$options['search'].'%'))
137
            ));
138
        }
139
140
        return $this->getTimelineResults($query, $options, 'mq.channel', 'mq.date_published', [], ['dateAdded']);
141
    }
142
}
143