Test Failed
Push — master ( 5a4aa6...276b51 )
by Zbigniew
04:36
created

SystemRequestSubscriber::onKernelException()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
c 0
b 0
f 0
dl 0
loc 15
rs 10
cc 3
nc 3
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the zibios/sharep.
7
 *
8
 * (c) Zbigniew Ślązak
9
 */
10
11
namespace App\EventSubscriber;
12
13
use App\Entity\Access\User;
14
use App\Entity\System\RequestLog;
15
use App\Entity\System\RequestLogDetail;
16
use App\Enum\Entity\RequestLogTypeEnum;
17
use Doctrine\ORM\EntityManagerInterface;
18
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
19
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
20
use Symfony\Component\HttpKernel\Event\RequestEvent;
21
use Symfony\Component\HttpKernel\Event\ResponseEvent;
22
use Symfony\Component\HttpKernel\KernelEvents;
23
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
24
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
25
26
class SystemRequestSubscriber implements EventSubscriberInterface
27
{
28
    /** @var EntityManagerInterface */
29
    private $entityManager;
30
    /** @var TokenStorageInterface TokenStorageInterface */
31
    private $tokenStorage;
32
    /** @var RequestLog|null */
33
    private $requestLog;
34
    /** @var RequestLogDetail|null */
35
    private $requestLogDetail;
36
37
    public function __construct(EntityManagerInterface $entityManager, TokenStorageInterface $tokenStorage)
38
    {
39
        $this->entityManager = $entityManager;
40
        $this->tokenStorage = $tokenStorage;
41
    }
42
43
    public static function getSubscribedEvents(): array
44
    {
45
        return [
46
            KernelEvents::REQUEST => [
47
                ['onKernelRequest', 0],
48
            ],
49
            KernelEvents::RESPONSE => [
50
                ['onKernelResponse', 0],
51
            ],
52
            KernelEvents::EXCEPTION => [
53
                ['onKernelException', 0],
54
            ],
55
        ];
56
    }
57
58
    public function onKernelRequest(RequestEvent $event): void
59
    {
60
        if (!$event->isMasterRequest()) {
61
            return;
62
        }
63
64
        $request = $event->getRequest();
65
66
        if ('_wdt' === $request->attributes->get('_route')) {
67
            return;
68
        }
69
70
        $member = null;
71
        $token = $this->tokenStorage->getToken();
72
        if ($token instanceof TokenInterface) {
73
            /** @var User $user */
74
            $user = $token->getUser();
75
            if ($user instanceof User) {
0 ignored issues
show
introduced by
$user is always a sub-type of App\Entity\Access\User.
Loading history...
76
                $user = $this->entityManager->find(User::class, $user->getId());
77
                $member = $user->getMember();
78
            }
79
        }
80
81
        $this->requestLog = new RequestLog(
82
            RequestLogTypeEnum::HTTP(),
83
            $request->getPathInfo(),
84
            new \DateTimeImmutable(),
85
            $member
86
        );
87
88
        $this->requestLogDetail = new RequestLogDetail(
89
            $this->requestLog,
90
            $request->getRequestUri(),
91
            json_encode(
92
                [
93
                    'query' => $request->query->all(),
94
                    'request' => $request->request->all(),
95
                    'attributes' => $request->attributes->all(),
96
                    'headers' => $request->headers->all(),
97
                ],
98
                JSON_THROW_ON_ERROR
99
            )
100
        );
101
102
        $this->entityManager->persist($this->requestLog);
103
        $this->entityManager->persist($this->requestLogDetail);
104
        $this->entityManager->flush();
105
    }
106
107
    public function onKernelResponse(ResponseEvent $event): void
108
    {
109
        if (null === $this->requestLog) {
110
            return;
111
        }
112
113
        if (!$event->isMasterRequest()) {
114
            return;
115
        }
116
117
        $this->requestLog->setFinishedAt(new \DateTimeImmutable());
118
        $this->requestLog->setSuccessful(true);
119
120
        $this->entityManager->persist($this->requestLog);
121
        $this->entityManager->persist($this->requestLogDetail);
122
        $this->entityManager->flush();
123
    }
124
125
    public function onKernelException(ExceptionEvent $event): void
126
    {
127
        if (null === $this->requestLog) {
128
            return;
129
        }
130
131
        if (!$event->isMasterRequest()) {
132
            return;
133
        }
134
135
        $this->requestLog->setSuccessful(false);
136
137
        $this->entityManager->persist($this->requestLog);
138
        $this->entityManager->persist($this->requestLogDetail);
139
        $this->entityManager->flush();
140
    }
141
}
142