Completed
Pull Request — master (#91)
by Piotr
02:36
created

PreventDeletingCurrentUser   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 80
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Importance

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

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A getSubscribedEvents() 0 6 1
B preventDeletingCurrentUser() 0 24 4
A setRedirectResponse() 0 6 1
A getRedirectUrl() 0 10 2
1
<?php
2
3
/**
4
 * (c) FSi sp. z o.o. <[email protected]>
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
namespace FSi\Bundle\AdminSecurityBundle\EventListener;
11
12
use FSi\Bundle\AdminBundle\Admin\Element;
13
use FSi\Bundle\AdminBundle\Event\BatchEvents;
14
use FSi\Bundle\AdminBundle\Event\FormEvent;
15
use FSi\Bundle\AdminBundle\Message\FlashMessages;
16
use FSi\Bundle\AdminSecurityBundle\Doctrine\Admin\UserElement;
17
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
18
use Symfony\Component\HttpFoundation\RedirectResponse;
19
use Symfony\Component\HttpFoundation\Request;
20
use Symfony\Component\Routing\RouterInterface;
21
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
22
23
class PreventDeletingCurrentUser implements EventSubscriberInterface
24
{
25
    /**
26
     * @var TokenStorageInterface
27
     */
28
    private $tokenStorage;
29
30
    /**
31
     * @var RouterInterface
32
     */
33
    private $router;
34
35
    /**
36
     * @var FlashMessages
37
     */
38
    private $flashMessages;
39
40
    public function __construct(
41
        TokenStorageInterface $tokenStorage,
42
        RouterInterface $router,
43
        FlashMessages $flashMessages
44
    ) {
45
        $this->tokenStorage = $tokenStorage;
46
        $this->router = $router;
47
        $this->flashMessages = $flashMessages;
48
    }
49
50
    /**
51
     * {@inheritdoc}
52
     */
53
    public static function getSubscribedEvents()
54
    {
55
        return [
56
            BatchEvents::BATCH_OBJECTS_PRE_APPLY => 'preventDeletingCurrentUser',
57
        ];
58
    }
59
60
    public function preventDeletingCurrentUser(FormEvent $event)
61
    {
62
        $element = $event->getElement();
63
64
        if (!($element instanceof UserElement)) {
65
            return;
66
        }
67
68
        $user = $this->tokenStorage->getToken()->getUser();
69
        $request = $event->getRequest();
70
        $indexes = $request->get('indexes', []);
71
72
        foreach ($indexes as $index) {
73
            /** @var \FSi\Bundle\AdminSecurityBundle\Security\User\UserInterface $entity */
74
            $entity = $element->getDataIndexer()->getData($index);
75
76
            if ($user === $entity) {
77
                $this->setRedirectResponse($event);
78
                $this->flashMessages->error('admin.user_list.message.delete_current_user', 'FSiAdminSecurity');
79
80
                return;
81
            }
82
        }
83
    }
84
85
    private function setRedirectResponse(FormEvent $event)
86
    {
87
        $event->stopPropagation();
88
        $redirectUrl = $this->getRedirectUrl($event->getElement(), $event->getRequest());
89
        $event->setResponse(new RedirectResponse($redirectUrl));
90
    }
91
92
    private function getRedirectUrl(Element $element, Request $request)
93
    {
94
        $redirectUrl = $request->get('redirect_uri');
95
96
        if ($redirectUrl === null) {
97
            return $this->router->generate($element->getRoute(), $element->getRouteParameters());
98
        }
99
100
        return $redirectUrl;
101
    }
102
}
103