Completed
Pull Request — master (#6)
by
unknown
21:24
created

MailgunEventRepository::getLastKnownSenderIp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 8
nc 1
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
    public function getLastKnownSenderIp()
130
    {
131
        $q = $this->getEntityManager()->createQueryBuilder()
132
            ->select('e.ip as ip')
133
            ->from($this->getEntityName(), 'e')
134
            ->orderBy('e.timestamp', 'desc')
135
            ->setMaxResults(1)
136
            ->getQuery();
137
        
138
        return $q->getResult();
139
    }
140
141
    public function getFieldsToOrderBy()
142
    {
143
        return array(
144
                'campaignId',
145
                'campaignName',
146
                'city',
147
                'clientName',
148
                'clientOs',
149
                'clientType',
150
                'country',
151
                'description',
152
                'deviceType',
153
                'domain',
154
                'error',
155
                'errorCode',
156
                'event',
157
                'ip',
158
                'mailingList',
159
                'messageHeaders',
160
                'messageId',
161
                'notification',
162
                'reason',
163
                'recipient',
164
                'region',
165
                'tag',
166
                'timestamp',
167
                'type',
168
                'userAgent',
169
                'url',
170
            );
171
    }
172
173
    /**
174
     * Get the most important events in the following priority
175
     * 1. Errors (rejected, failed)
176
     * 2. Warnings (complained, unsubscribed)
177
     * 3. Infos (accepted, delivered, opened, clicked, stored)
178
     *
179
     * @param integer $count max number of events to fetch
180
     */
181
    public function getImportantEvents($count)
182
    {
183
        $errors = $this->getEventsBySeverity(MailgunEvent::SEVERITY_ERROR, $count);
184
        $results = $errors;
185
186
        $getMoreCounter = $count - sizeof($errors);
187
188
        if ($getMoreCounter > 0) {
189
190
            $warnings = $this->getEventsBySeverity(MailgunEvent::SEVERITY_WARN, $count);
191
            $getMoreCounter = $getMoreCounter - sizeof($warnings);
192
            $results = array_merge($results, $warnings);
193
        }
194
195
        if ($getMoreCounter > 0) {
196
197
            $infos = $this->getEventsBySeverity(MailgunEvent::SEVERITY_INFO, $count);
198
            $results = array_merge($results, $infos);
199
200
        }
201
202
        return $results;
203
    }
204
205
    /**
206
     * Get events by severity/type
207
     * @param  string   $severity [info, warning, error]
208
     * @return Ambigous <multitype:, unknown>
209
     */
210
    public function getEventsBySeverity($severity = MailgunEvent::SEVERITY_INFO, $maxResults = 0)
211
    {
212
        if ($severity == MailgunEvent::SEVERITY_INFO) {
213
            $criteria = "e.event = 'accepted' or e.event = 'delivered' or e.event = 'opened' or e.event = 'clicked' or e.event = 'stored'";
214
215
        } elseif ($severity == MailgunEvent::SEVERITY_WARN) {
216
            $criteria = "e.event = 'complained' or e.event = 'unsubscribed'";
217
218
        } elseif ($severity == MailgunEvent::SEVERITY_ERROR) {
219
            $criteria = "e.event = 'rejected' or e.event = 'failed' or e.event = 'dropped' or e.event = 'bounced'";
220
221
        } else {
222
            return null;
223
        }
224
225
        $qb = $this->createQueryBuilder("e")
226
            ->where($criteria)
227
            ->orderBy('e.timestamp ', 'desc');
228
229
        if ($maxResults > 0) {
230
            $qb->setMaxResults($maxResults);
231
        }
232
233
        $q = $qb->getQuery();
234
        $results = $q->execute();
235
236
        return $results;
237
    }
238
}
239