CustomerController   A
last analyzed

Complexity

Total Complexity 22

Size/Duplication

Total Lines 184
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 110
c 1
b 0
f 0
dl 0
loc 184
rs 10
wmc 22

3 Methods

Rating   Name   Duplication   Size   Complexity  
A adminShowAction() 0 39 2
C createAction() 0 79 13
B adminEditEnrollerAction() 0 62 7
1
<?php
2
3
4
namespace PTS\SyliusReferralPlugin\Controller;
5
6
use FOS\RestBundle\View\View;
7
use Http\Client\Exception\HttpException;
8
use http\Exception\InvalidArgumentException;
9
use PTS\SyliusReferralPlugin\Event\EnrollerChangeEvent;
10
use PTS\SyliusReferralPlugin\Repository\CustomerRepository;
11
use PTS\SyliusReferralPlugin\Service\CustomerManager;
12
use Sylius\Bundle\ResourceBundle\Controller\ResourceController;
13
use Sylius\Component\Core\Model\ShopUser;
14
use Sylius\Component\Resource\ResourceActions;
15
use Symfony\Component\EventDispatcher\EventDispatcher;
16
use Symfony\Component\HttpFoundation\Request;
17
use Symfony\Component\HttpFoundation\Response;
18
19
class CustomerController extends ResourceController
20
{
21
    public function createAction(Request $request): Response
22
    {
23
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
24
25
        $this->isGrantedOr403($configuration, ResourceActions::CREATE);
26
27
        $newResource = $this->newResourceFactory->create($configuration, $this->factory);
28
29
        $form = $this->resourceFormFactory->create($configuration, $newResource);
30
31
        $refManager = $this->get('app.referral.manager');
32
33
        $refManager->checkReferralValidity();
34
35
        if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
36
            $newResource = $form->getData();
37
38
            $referrer = $refManager->getReferrerFromSession();
39
            if ($referrer) {
40
                $newResource->setEnroller($referrer);
41
            }
42
43
            $refManager->removeReferral();
44
45
            $event = $this->eventDispatcher->dispatchPreEvent(ResourceActions::CREATE, $configuration, $newResource);
46
47
            if ($event->isStopped() && !$configuration->isHtmlRequest()) {
48
                throw new HttpException($event->getErrorCode(), $event->getMessage());
0 ignored issues
show
Bug introduced by
The call to Http\Client\Exception\HttpException::__construct() has too few arguments starting with response. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

48
                throw /** @scrutinizer ignore-call */ new HttpException($event->getErrorCode(), $event->getMessage());

This check compares calls to functions or methods with their respective definitions. If the call has less arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
Bug introduced by
$event->getMessage() of type string is incompatible with the type Psr\Http\Message\RequestInterface expected by parameter $request of Http\Client\Exception\HttpException::__construct(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

48
                throw new HttpException($event->getErrorCode(), /** @scrutinizer ignore-type */ $event->getMessage());
Loading history...
49
            }
50
            if ($event->isStopped()) {
51
                $this->flashHelper->addFlashFromEvent($configuration, $event);
52
53
                if ($event->hasResponse()) {
54
                    return $event->getResponse();
55
                }
56
57
                return $this->redirectHandler->redirectToIndex($configuration, $newResource);
58
            }
59
60
            if ($configuration->hasStateMachine()) {
61
                $this->stateMachine->apply($configuration, $newResource);
62
            }
63
64
            $this->repository->add($newResource);
65
            $postEvent = $this->eventDispatcher->dispatchPostEvent(ResourceActions::CREATE, $configuration, $newResource);
66
67
            if (!$configuration->isHtmlRequest()) {
68
                return $this->viewHandler->handle($configuration, View::create($newResource, Response::HTTP_CREATED));
69
            }
70
71
            $this->flashHelper->addSuccessFlash($configuration, ResourceActions::CREATE, $newResource);
72
73
            if ($postEvent->hasResponse()) {
74
                return $postEvent->getResponse();
75
            }
76
77
            return $this->redirectHandler->redirectToResource($configuration, $newResource);
78
        }
79
80
        if (!$configuration->isHtmlRequest()) {
81
            return $this->viewHandler->handle($configuration, View::create($form, Response::HTTP_BAD_REQUEST));
82
        }
83
84
        $initializeEvent = $this->eventDispatcher->dispatchInitializeEvent(ResourceActions::CREATE, $configuration, $newResource);
85
        if ($initializeEvent->hasResponse()) {
86
            return $initializeEvent->getResponse();
87
        }
88
89
        $view = View::create()
90
            ->setData([
91
                'configuration' => $configuration,
92
                'metadata' => $this->metadata,
93
                'resource' => $newResource,
94
                $this->metadata->getName() => $newResource,
95
                'form' => $form->createView(),
96
            ])
97
            ->setTemplate($configuration->getTemplate(ResourceActions::CREATE . '.html'));
98
99
        return $this->viewHandler->handle($configuration, $view);
100
    }
101
    public function adminShowAction(Request $request, $id): Response
102
    {
103
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
104
105
        $enabledEnrollerEdit = $this->getParameter('app_edit_enroller_enabled');
106
107
        $this->isGrantedOr403($configuration, ResourceActions::SHOW);
108
        $resource = $this->findOr404($configuration);
109
110
        $this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource);
111
112
        $customerManager = $this->get('app.customer.manager');
113
114
        $routeName = $request->get('_route');
115
116
        $data = $customerManager->getCustomerReferrals($request, $routeName, $id);
117
118
        $enroller = $customerManager->getEnroller($id);
119
120
        $view = View::create($resource);
121
122
        if ($configuration->isHtmlRequest()) {
123
            $view
124
                ->setTemplate($configuration->getTemplate(ResourceActions::SHOW . '.html'))
125
                ->setTemplateVar($this->metadata->getName())
126
                ->setData([
127
                    'configuration' => $configuration,
128
                    'metadata' => $this->metadata,
129
                    'resource' => $resource,
130
                    'customers' => $data['customers'],
131
                    'pagination' => $data['pagination'],
132
                    'enroller' => $enroller,
133
                    'enabledEditEnroller' => $enabledEnrollerEdit,
134
                    $this->metadata->getName() => $resource,
135
                ])
136
            ;
137
        }
138
139
        return $this->viewHandler->handle($configuration, $view);
140
    }
141
    public function adminEditEnrollerAction(Request $request, $id): Response
142
    {
143
        $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
144
        $this->isGrantedOr403($configuration, ResourceActions::SHOW);
145
        $resource = $this->findOr404($configuration);
146
147
        $translator = $this->get('translator');
148
        $session = $this->get('session');
149
        $enabled = $this->getParameter('app_edit_enroller_enabled');
150
        if (!$enabled) {
151
            $session->getFlashBag()->add(
152
                'error',
153
                $translator->trans('app.messages.error.editEnrollerDisabled')
154
            );
155
            return $this->redirectToRoute('sylius_admin_customer_show', ['id' => $id]);
156
        }
157
158
        if ($request->query->has('_enroller') && $request->query->has('_action')) {
159
            $enrollerId = $request->query->get('_enroller');
160
            if ($enrollerId !== $id && $request->query->get('_action') === 'selectEnroller') {
161
                /** @var CustomerManager $customerManager */
162
                $customerManager = $this->get('app.customer.manager');
163
                $customerManager->changeCustomerEnroller($id, $enrollerId);
164
                /** @var CustomerRepository $customerRepository */
165
                $customerRepository = $this->get('sylius.repository.customer');
166
                $enroller = $customerRepository->getCustomerById($enrollerId);
167
                $enrollerChangeEvent = new EnrollerChangeEvent($resource, $enroller);
168
                /** @var EventDispatcher $eventDispatcher */
169
                $eventDispatcher = $this->get('event_dispatcher');
170
                $eventDispatcher->dispatch($enrollerChangeEvent, EnrollerChangeEvent::NAME);
171
                $session->getFlashBag()->add(
172
                    'success',
173
                    $translator->trans('app.messages.success.changedEnroller')
174
                );
175
                return $this->redirectToRoute('sylius_admin_customer_show', ['id' => $id]);
176
            }
177
            else {
178
                throw new InvalidArgumentException("Invalid request. Can't choose customer as his own enroller");
179
            }
180
        }
181
182
        $resources = $this->resourcesCollectionProvider->get($configuration, $this->repository);
183
184
        $this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource);
185
186
        $view = View::create($resource);
187
188
        if ($configuration->isHtmlRequest()) {
189
            $view
190
                ->setTemplate($configuration->getTemplate(ResourceActions::SHOW . '.html'))
191
                ->setTemplateVar($this->metadata->getName())
192
                ->setData([
193
                    'configuration' => $configuration,
194
                    'metadata' => $this->metadata,
195
                    'resource' => $resource,
196
                    'resources' => $resources,
197
                    $this->metadata->getName() => $resource,
198
                ])
199
            ;
200
        }
201
202
        return $this->viewHandler->handle($configuration, $view);
203
    }
204
205
}