Completed
Push — master ( 59bcf3...335c62 )
by Łukasz
10s
created

DeleteRequestHandler::validateDeletion()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 5
nc 2
nop 1
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
declare(strict_types=1);
11
12
namespace FSi\Bundle\AdminBundle\Admin\CRUD\Context\Request;
13
14
use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
15
use FSi\Bundle\AdminBundle\Admin\Context\Request\HandlerInterface;
16
use FSi\Bundle\AdminBundle\Admin\RedirectableElement;
17
use FSi\Bundle\AdminBundle\Event\AdminEvent;
18
use FSi\Bundle\AdminBundle\Event\FormEvent;
19
use FSi\Bundle\AdminBundle\Message\FlashMessages;
20
use LogicException;
21
use Symfony\Component\HttpFoundation\RedirectResponse;
22
use Symfony\Component\HttpFoundation\Request;
23
use Symfony\Component\HttpFoundation\Response;
24
use Symfony\Component\Routing\RouterInterface;
25
26
class DeleteRequestHandler implements HandlerInterface
27
{
28
    /**
29
     * @var HandlerInterface
30
     */
31
    private $batchHandler;
32
33
    /**
34
     * @var FlashMessages
35
     */
36
    private $flashMessages;
37
38
    /**
39
     * @var RouterInterface
40
     */
41
    private $router;
42
43
    public function __construct(
44
        HandlerInterface $batchHandler,
45
        FlashMessages $flashMessages,
46
        RouterInterface $router
47
    ) {
48
        $this->batchHandler = $batchHandler;
49
        $this->flashMessages = $flashMessages;
50
        $this->router = $router;
51
    }
52
53
    public function handleRequest(AdminEvent $event, Request $request): ?Response
54
    {
55
        try {
56
            $this->validateDeletion($event);
57
            $response = $this->batchHandler->handleRequest($event, $request);
58
        } catch (ForeignKeyConstraintViolationException $ex) {
59
            $this->flashMessages->error('crud.delete.error.foreign_key');
60
        }
61
62
        return isset($response) ? $response : $this->getRedirectResponse($event, $request);
63
    }
64
65
    private function validateDeletion(FormEvent $event): void
66
    {
67
        $element = $event->getElement();
68
        if ($element->hasOption('allow_delete') && false === $element->getOption('allow_delete')) {
69
            throw new LogicException(sprintf(
70
                'Tried to delete objects through element "%s", which has option "allow_delete" set to false',
71
                get_class($element)
72
            ));
73
        }
74
    }
75
76
    private function getRedirectResponse(FormEvent $event, Request $request): RedirectResponse
77
    {
78
        if ($request->query->has('redirect_uri')) {
79
            return new RedirectResponse($request->query->get('redirect_uri'));
80
        }
81
82
        $element = $event->getElement();
83
        if (!($element instanceof RedirectableElement)) {
84
            throw new LogicException(sprintf(
85
                'Cannot generate a redirect response for element of class "%s"',
86
                get_class($element)
87
            ));
88
        }
89
90
        return new RedirectResponse(
91
            $this->router->generate(
92
                $element->getSuccessRoute(),
93
                $element->getSuccessRouteParameters()
94
            )
95
        );
96
    }
97
}
98