Completed
Push — master ( 05bb5a...5289b8 )
by Rafał
34:32 queued 04:15
created

AnalyticsEventListener   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Importance

Changes 0
Metric Value
wmc 13
lcom 1
cbo 9
dl 0
loc 79
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
B onKernelRequest() 0 20 6
A onKernelResponse() 0 8 2
A onKernelFinishRequest() 0 7 2
A onKernelTerminate() 0 7 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Superdesk Web Publisher Analytics Bundle.
7
 *
8
 * Copyright 2017 Sourcefabric z.ú. and contributors.
9
 *
10
 * For the full copyright and license information, please see the
11
 * AUTHORS and LICENSE files distributed with this source code.
12
 *
13
 * @copyright 2017 Sourcefabric z.ú
14
 * @license http://www.superdesk.org/license
15
 */
16
17
namespace SWP\Bundle\AnalyticsBundle\EventListener;
18
19
use OldSound\RabbitMqBundle\RabbitMq\ProducerInterface;
20
use Symfony\Component\HttpFoundation\Response;
21
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
22
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
23
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
24
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
25
26
/**
27
 * Class AnalyticsEventListener.
28
 */
29
class AnalyticsEventListener
30
{
31
    const TERMINATE_IMMEDIATELY = 'terminate-immediately';
32
33
    const EVENT_ENDPOINT = '_swp_analytics';
34
35
    /**
36
     * @var ProducerInterface
37
     */
38
    protected $producer;
39
40
    /**
41
     * AnalyticsEventListener constructor.
42
     *
43
     * @param ProducerInterface $producer
44
     */
45
    public function __construct(ProducerInterface $producer)
46
    {
47
        $this->producer = $producer;
48
    }
49
50
    /**
51
     * @param GetResponseEvent $event
52
     */
53
    public function onKernelRequest(GetResponseEvent $event)
54
    {
55
        $request = $event->getRequest();
56
        if (strpos($request->getPathInfo(), self::EVENT_ENDPOINT) &&
57
            in_array($request->getMethod(), ['POST', 'GET'])
58
        ) {
59
            if (null !== ($json = file_get_contents('php://input')) && '' !== $json) {
60
                $request->attributes->set('data', \json_decode($json, true));
61
            } elseif (null !== $json = $request->getContent()) {
62
                $request->attributes->set('data', \json_decode($json, true));
63
            }
64
65
            $this->producer->publish(serialize($request));
66
67
            $response = new Response();
68
            $response->headers->add([self::TERMINATE_IMMEDIATELY => true]);
69
            $event->setResponse($response);
70
            $event->stopPropagation();
71
        }
72
    }
73
74
    /**
75
     * @param FilterResponseEvent $event
76
     */
77
    public function onKernelResponse(FilterResponseEvent $event)
78
    {
79
        $response = $event->getResponse();
80
81
        if ($response->headers->has(self::TERMINATE_IMMEDIATELY)) {
82
            $event->stopPropagation();
83
        }
84
    }
85
86
    /**
87
     * @param FinishRequestEvent $event
88
     */
89
    public function onKernelFinishRequest(FinishRequestEvent $event)
90
    {
91
        $request = $event->getRequest();
92
        if (strpos($request->getPathInfo(), self::EVENT_ENDPOINT)) {
93
            $event->stopPropagation();
94
        }
95
    }
96
97
    /**
98
     * @param PostResponseEvent $event
99
     */
100
    public function onKernelTerminate(PostResponseEvent $event)
101
    {
102
        $response = $event->getResponse();
103
        if ($response->headers->has(self::TERMINATE_IMMEDIATELY)) {
104
            $event->stopPropagation();
105
        }
106
    }
107
}
108