Issues (3627)

app/bundles/WebhookBundle/Entity/LogRepository.php (1 issue)

1
<?php
2
3
/*
4
 * @copyright   Mautic, Inc
5
 * @author      Mautic, Inc
6
 *
7
 * @link        http://mautic.com
8
 *
9
 * @license     GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
10
 */
11
12
namespace Mautic\WebhookBundle\Entity;
13
14
use Mautic\CoreBundle\Entity\CommonRepository;
15
16
class LogRepository extends CommonRepository
17
{
18
    /**
19
     * Retains a rolling number of log records for a webhook id.
20
     *
21
     * @param int $webhookId
22
     * @param int $logMax    how many recent logs should remain, the rest will be deleted
23
     *
24
     * @return int
25
     */
26
    public function removeOldLogs($webhookId, $logMax)
27
    {
28
        // if the hook was deleted then return a count of 0
29
        if (!$webhookId) {
30
            return false;
0 ignored issues
show
Bug Best Practice introduced by
The expression return false returns the type false which is incompatible with the documented return type integer.
Loading history...
31
        }
32
33
        $qb = $this->_em->getConnection()->createQueryBuilder();
34
35
        $count = $qb->select('count(id) as log_count')
36
            ->from(MAUTIC_TABLE_PREFIX.'webhook_logs', $this->getTableAlias())
37
            ->where('webhook_id = '.$webhookId)
38
            ->execute()->fetch();
39
40
        if ((int) $count['log_count'] >= (int) $logMax) {
41
            $qb = $this->_em->getConnection()->createQueryBuilder();
42
43
            $id = $qb->select('id')
44
                ->from(MAUTIC_TABLE_PREFIX.'webhook_logs', $this->getTableAlias())
45
                ->where('webhook_id = '.$webhookId)
46
                ->orderBy('date_added', 'ASC')->setMaxResults(1)
47
                ->execute()->fetch();
48
49
            $qb = $this->_em->getConnection()->createQueryBuilder();
50
51
            $qb->delete(MAUTIC_TABLE_PREFIX.'webhook_logs')
52
                ->where($qb->expr()->in('id', $id))
53
                ->execute();
54
        }
55
    }
56
57
    /**
58
     * Lets assume that all HTTP status codes 2** are a success.
59
     * This method will count the latest success codes until the $limit
60
     * and divide them with the all requests until the limit.
61
     *
62
     * 0 = 100% responses failed
63
     * 1 = 100% responses are successful
64
     * null = no log rows yet
65
     *
66
     * @param int $webhookId
67
     * @param int $limit
68
     *
69
     * @return float|null
70
     */
71
    public function getSuccessVsErrorStatusCodeRatio($webhookId, $limit)
72
    {
73
        // Generate query to select last X = $limit rows
74
        $selectqb = $this->_em->getConnection()->createQueryBuilder();
75
        $selectqb->select('*')
76
            ->from(MAUTIC_TABLE_PREFIX.'webhook_logs', $this->getTableAlias())
77
            ->where($this->getTableAlias().'.webhook_id = :webhookId')
78
            ->setFirstResult(0)
79
            ->setMaxResults($limit)
80
            ->orderBy($this->getTableAlias().'.date_added', 'DESC');
81
82
        // Count all responses
83
        $countAllQb = $this->_em->getConnection()->createQueryBuilder();
84
        $countAllQb->select('COUNT('.$this->getTableAlias().'.id) AS thecount')
85
            ->from(sprintf('(%s)', $selectqb->getSQL()), $this->getTableAlias())
86
            ->setParameter('webhookId', $webhookId);
87
88
        $result = $countAllQb->execute()->fetch();
89
90
        if (isset($result['thecount'])) {
91
            $allCount = (int) $result['thecount'];
92
        } else {
93
            return null;
94
        }
95
96
        // Count successful responses
97
        $countSuccessQb = $this->_em->getConnection()->createQueryBuilder();
98
        $countSuccessQb->select('COUNT('.$this->getTableAlias().'.id) AS thecount')
99
            ->from(sprintf('(%s)', $selectqb->getSQL()), $this->getTableAlias())
100
            ->andWhere($countSuccessQb->expr()->gte($this->getTableAlias().'.status_code', 200))
101
            ->andWhere($countSuccessQb->expr()->lt($this->getTableAlias().'.status_code', 300))
102
            ->setParameter('webhookId', $webhookId);
103
104
        $result = $countSuccessQb->execute()->fetch();
105
106
        if (isset($result['thecount'])) {
107
            $successCount = (int) $result['thecount'];
108
        }
109
110
        if (!empty($allCount) && isset($successCount)) {
111
            return $successCount / $allCount;
112
        }
113
114
        return null;
115
    }
116
}
117