Completed
Pull Request — master (#6)
by
unknown
02:55
created

MailgunEventRepository::getLastKnownSenderIp()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 19
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 19
rs 9.2
cc 4
eloc 13
nc 3
nop 0
1
<?php
2
3
namespace Azine\MailgunWebhooksBundle\Entity\Repositories;
4
5
use Azine\MailgunWebhooksBundle\Entity\MailgunEvent;
6
use Doctrine\ORM\QueryBuilder;
7
use Doctrine\ORM\EntityRepository;
8
9
/**
10
 * MailgunEventRepository
11
 *
12
 * This class was generated by the Doctrine ORM. Add your own custom
13
 * repository methods below.
14
 */
15
class MailgunEventRepository extends EntityRepository
16
{
17
    public function getEventCount($criteria)
18
    {
19
        $result = $this->getEventsQuery($criteria)->getQuery()->execute();
20
21
        return sizeof($result);
22
    }
23
24
    public function getEvents($criteria, $orderBy, $limit, $offset)
25
    {
26
        $qb = $this->getEventsQuery($criteria);
27
        $orderField = key($orderBy);
28
        $orderDirection = $orderBy[$orderField];
29
        $qb->orderBy("e.".$orderField, $orderDirection);
30
        if ($limit != -1) {
31
            $qb->setMaxResults($limit);
32
            $qb->setFirstResult($offset);
33
        }
34
35
        $result = $qb->getQuery()->execute();
36
37
        return $result;
38
    }
39
40
    /**
41
     * @param  array        $criteria
42
     * @return QueryBuilder
43
     */
44
    private function getEventsQuery($criteria)
45
    {
46
        $lookForUnopened = array_key_exists("eventType", $criteria) && $criteria["eventType"] == "unopened";
47
        if ($lookForUnopened) {
48
            unset($criteria["eventType"]);
49
        }
50
51
        $qb = $this->createQueryBuilder("e");
52
        if (array_key_exists('domain', $criteria) && $criteria['domain'] != "") {
53
            $qb->andWhere("e.domain = :domain")
54
                ->setParameter("domain", $criteria['domain']);
55
        }
56
57 View Code Duplication
        if (array_key_exists('recipient', $criteria) && $criteria['recipient'] != "") {
58
            $qb->andWhere("e.recipient like :recipient")
59
                ->setParameter("recipient", "%".$criteria['recipient']."%");
60
        }
61
62
        if (array_key_exists('eventType', $criteria) && $criteria['eventType'] != "all") {
63
            $qb->andWhere("e.event = :eventType")
64
                ->setParameter("eventType", $criteria['eventType']);
65
        }
66
67 View Code Duplication
        if (array_key_exists('search', $criteria) && $criteria['search'] != "") {
68
            $qb->andWhere("(e.messageHeaders like :search OR e.description like :search OR e.notification like :search OR e.reason like :search OR e.errorCode like :search OR e.ip like :search OR e.error like :search OR e.country like :search OR e.city like :search OR e.campaignId like :search OR e.campaignName like :search OR e.clientName like :search OR e.clientOs like :search OR e.clientType like :search OR e.deviceType like :search OR e.mailingList like :search OR e.messageId like :search OR e.tag like :search OR e.userAgent like :search OR e.url like :search)")
69
                ->setParameter("search", "%".$criteria['search']."%");
70
        }
71
72
        if ($lookForUnopened) {
73
            $qb->andWhere("NOT EXISTS (SELECT o.id FROM AzineMailgunWebhooksBundle:MailgunEvent o WHERE o.messageId like e.messageId AND o.event in ('opened', 'clicked', 'unsubscribed', 'complained'))");
74
        }
75
76
        return $qb;
77
    }
78
79 View Code Duplication
    public function getEventTypes()
80
    {
81
        $q = $this->getEntityManager()->createQueryBuilder()
82
            ->select("e.event as event")
83
            ->from($this->getEntityName(), "e")
84
            ->distinct()
85
            ->orderBy('e.event ', 'asc')
86
            ->getQuery();
87
        $result = array();
88
        foreach ($q->execute() as $next) {
89
            $result[] = $next['event'];
90
        }
91
92
        return $result;
93
    }
94
95 View Code Duplication
    public function getDomains()
96
    {
97
        $q = $this->getEntityManager()->createQueryBuilder()
98
            ->select("e.domain as domain")
99
            ->from($this->getEntityName(), "e")
100
            ->distinct()
101
            ->orderBy('e.domain ', 'asc')
102
            ->getQuery();
103
104
        $result = array();
105
        foreach ($q->execute() as $next) {
106
            $result[] = $next['domain'];
107
        }
108
109
        return $result;
110
    }
111
112 View Code Duplication
    public function getRecipients()
113
    {
114
        $q = $this->getEntityManager()->createQueryBuilder()
115
            ->select("e.recipient as recipient")
116
            ->from($this->getEntityName(), "e")
117
            ->distinct()
118
            ->orderBy('e.recipient ', 'asc')
119
            ->getQuery();
120
121
        $result = array();
122
        foreach ($q->execute() as $next) {
123
            $result[] = $next['recipient'];
124
        }
125
126
        return $result;
127
    }
128
129
    /**
130
     * Get last known sender IP based on stored events list
131
     * @return string|null
132
     */
133
    public function getLastKnownSenderIp()
134
    {
135
        $q = $this->getEntityManager()->createQueryBuilder()
136
            ->select('e.messageHeaders as mh')
137
            ->from($this->getEntityName(), 'e')
138
            ->orderBy('e.timestamp', 'desc')
139
            ->where('e.event IN (:events)')
140
            ->setParameter('events', array('opened', 'delivered', 'bounced', 'dropped', 'complained'))
141
            ->setMaxResults(50)
142
            ->getQuery();
143
        
144
        foreach($q->execute() as $next) {
145
            if ($next['mh'] && isset($next['mh']['X-Mailgun-Sending-Ip'])) {
146
                return $next['mh']['X-Mailgun-Sending-Ip'];
147
            }
148
        }
149
        
150
        return null;
151
    }
152
153
    public function getFieldsToOrderBy()
154
    {
155
        return array(
156
                'campaignId',
157
                'campaignName',
158
                'city',
159
                'clientName',
160
                'clientOs',
161
                'clientType',
162
                'country',
163
                'description',
164
                'deviceType',
165
                'domain',
166
                'error',
167
                'errorCode',
168
                'event',
169
                'ip',
170
                'mailingList',
171
                'messageHeaders',
172
                'messageId',
173
                'notification',
174
                'reason',
175
                'recipient',
176
                'region',
177
                'tag',
178
                'timestamp',
179
                'type',
180
                'userAgent',
181
                'url',
182
            );
183
    }
184
185
    /**
186
     * Get the most important events in the following priority
187
     * 1. Errors (rejected, failed)
188
     * 2. Warnings (complained, unsubscribed)
189
     * 3. Infos (accepted, delivered, opened, clicked, stored)
190
     *
191
     * @param integer $count max number of events to fetch
192
     */
193
    public function getImportantEvents($count)
194
    {
195
        $errors = $this->getEventsBySeverity(MailgunEvent::SEVERITY_ERROR, $count);
196
        $results = $errors;
197
198
        $getMoreCounter = $count - sizeof($errors);
199
200
        if ($getMoreCounter > 0) {
201
202
            $warnings = $this->getEventsBySeverity(MailgunEvent::SEVERITY_WARN, $count);
203
            $getMoreCounter = $getMoreCounter - sizeof($warnings);
204
            $results = array_merge($results, $warnings);
205
        }
206
207
        if ($getMoreCounter > 0) {
208
209
            $infos = $this->getEventsBySeverity(MailgunEvent::SEVERITY_INFO, $count);
210
            $results = array_merge($results, $infos);
211
212
        }
213
214
        return $results;
215
    }
216
217
    /**
218
     * Get events by severity/type
219
     * @param  string   $severity [info, warning, error]
220
     * @return Ambigous <multitype:, unknown>
221
     */
222
    public function getEventsBySeverity($severity = MailgunEvent::SEVERITY_INFO, $maxResults = 0)
223
    {
224
        if ($severity == MailgunEvent::SEVERITY_INFO) {
225
            $criteria = "e.event = 'accepted' or e.event = 'delivered' or e.event = 'opened' or e.event = 'clicked' or e.event = 'stored'";
226
227
        } elseif ($severity == MailgunEvent::SEVERITY_WARN) {
228
            $criteria = "e.event = 'complained' or e.event = 'unsubscribed'";
229
230
        } elseif ($severity == MailgunEvent::SEVERITY_ERROR) {
231
            $criteria = "e.event = 'rejected' or e.event = 'failed' or e.event = 'dropped' or e.event = 'bounced'";
232
233
        } else {
234
            return null;
235
        }
236
237
        $qb = $this->createQueryBuilder("e")
238
            ->where($criteria)
239
            ->orderBy('e.timestamp ', 'desc');
240
241
        if ($maxResults > 0) {
242
            $qb->setMaxResults($maxResults);
243
        }
244
245
        $q = $qb->getQuery();
246
        $results = $q->execute();
247
248
        return $results;
249
    }
250
}
251