Passed
Pull Request — master (#81)
by
unknown
03:32
created

CreateNewWishlistSubscriber::getSubscribedEvents()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 5
rs 10
1
<?php
2
3
/*
4
 * This file was created by developers working at BitBag
5
 * Do you need more information about us and what we do? Visit our https://bitbag.io website!
6
 * We are hiring developers from all over the world. Join us and start your new, exciting adventure and become part of us: https://bitbag.io/career
7
*/
8
9
declare(strict_types=1);
10
11
namespace BitBag\SyliusWishlistPlugin\EventSubscriber;
12
13
use BitBag\SyliusWishlistPlugin\Command\Wishlist\CreateNewWishlist;
14
use BitBag\SyliusWishlistPlugin\Entity\WishlistInterface;
15
use BitBag\SyliusWishlistPlugin\Resolver\WishlistsResolverInterface;
16
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
17
use Symfony\Component\HttpFoundation\Cookie;
18
use Symfony\Component\HttpFoundation\RequestStack;
19
use Symfony\Component\HttpFoundation\Response;
20
use Symfony\Component\HttpKernel\Event\RequestEvent;
21
use Symfony\Component\HttpKernel\Event\ResponseEvent;
22
use Symfony\Component\HttpKernel\KernelEvents;
23
use Symfony\Component\Messenger\HandleTrait;
24
use Symfony\Component\Messenger\MessageBusInterface;
25
26
final class CreateNewWishlistSubscriber implements EventSubscriberInterface
27
{
28
    use HandleTrait;
29
30
    private RequestStack $requestStack;
31
32
    private string $wishlistCookieToken;
33
34
    private WishlistsResolverInterface $wishlistsResolver;
35
36
    public function __construct(
37
        RequestStack $requestStack,
38
        string $wishlistCookieToken,
39
        WishlistsResolverInterface $wishlistsResolver,
40
        MessageBusInterface $messageBus
41
    ) {
42
        $this->requestStack = $requestStack;
43
        $this->wishlistCookieToken = $wishlistCookieToken;
44
        $this->wishlistsResolver = $wishlistsResolver;
45
        $this->messageBus = $messageBus;
46
    }
47
48
    public static function getSubscribedEvents(): array
49
    {
50
        return [
51
            KernelEvents::REQUEST => [['onKernelRequest', 1]],
52
            KernelEvents::RESPONSE => [['onKernelResponse', 0]],
53
        ];
54
    }
55
56
    public function onKernelRequest(RequestEvent $event): void
57
    {
58
        if (!$event->isMasterRequest()) {
59
            return;
60
        }
61
62
        /** @var WishlistInterface[] $wishlists */
63
        $wishlists = $this->wishlistsResolver->resolve();
64
65
        if ($event->getRequest()->cookies->has($this->wishlistCookieToken) && !empty($wishlists)) {
66
            return;
67
        }
68
69
        /** @var WishlistInterface $wishlist */
70
        $wishlist = $this->createNewWishlist();
71
72
        $event->getRequest()->attributes->set($this->wishlistCookieToken, $wishlist->getToken());
73
    }
74
75
    public function onKernelResponse(ResponseEvent $event): void
76
    {
77
        if (!$event->isMasterRequest()) {
78
            return;
79
        }
80
81
        if ($event->getRequest()->cookies->has($this->wishlistCookieToken)) {
82
            return;
83
        }
84
85
        $response = $event->getResponse();
86
        $wishlistCookieToken = $event->getRequest()->attributes->get($this->wishlistCookieToken);
87
88
        if (!$wishlistCookieToken) {
89
            return;
90
        }
91
        $this->setWishlistCookieToken($response, $wishlistCookieToken);
92
93
        $event->getRequest()->attributes->remove($this->wishlistCookieToken);
94
    }
95
96
    private function createNewWishlist(): WishlistInterface
97
    {
98
        $createNewWishlist = new CreateNewWishlist();
99
100
        return $this->handle($createNewWishlist);
101
    }
102
103
    private function setWishlistCookieToken(Response $response, string $wishlistCookieToken): void
104
    {
105
        $cookie = new Cookie($this->wishlistCookieToken, $wishlistCookieToken, strtotime('+1 year'));
106
107
        $response->headers->setCookie($cookie);
108
    }
109
}
110