GeneratorController   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 154
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11

Importance

Changes 0
Metric Value
wmc 18
lcom 1
cbo 11
dl 0
loc 154
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 11 1
A indexAction() 0 20 3
A resetCharacterAction() 0 12 1
A resetStepAction() 0 31 4
A stepAction() 0 35 4
A trans() 0 8 3
A getSession() 0 8 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the PierstovalCharacterManagerBundle package.
7
 *
8
 * (c) Alexandre Rock Ancelet <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Pierstoval\Bundle\CharacterManagerBundle\Controller;
15
16
use Pierstoval\Bundle\CharacterManagerBundle\Action\StepActionInterface;
17
use Pierstoval\Bundle\CharacterManagerBundle\Exception\StepNotFoundException;
18
use Pierstoval\Bundle\CharacterManagerBundle\Registry\ActionsRegistryInterface;
19
use Pierstoval\Bundle\CharacterManagerBundle\Resolver\StepResolverInterface;
20
use Symfony\Component\HttpFoundation\RedirectResponse;
21
use Symfony\Component\HttpFoundation\Request;
22
use Symfony\Component\HttpFoundation\Response;
23
use Symfony\Component\HttpFoundation\Session\Session;
24
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
25
use Symfony\Component\Routing\RouterInterface;
26
use Symfony\Contracts\Translation\TranslatorInterface;
27
28
class GeneratorController
29
{
30
    /**
31
     * @var StepResolverInterface
32
     */
33
    private $stepsResolver;
34
35
    /**
36
     * @var TranslatorInterface
37
     */
38
    private $translator;
39
40
    /**
41
     * @var RouterInterface
42
     */
43
    private $router;
44
45
    /**
46
     * @var ActionsRegistryInterface
47
     */
48
    private $actionsRegistry;
49
50
    public function __construct(
51
        StepResolverInterface $resolver,
52
        ActionsRegistryInterface $actionsRegistry,
53
        RouterInterface $router,
54
        TranslatorInterface $translator = null
55
    ) {
56
        $this->stepsResolver = $resolver;
57
        $this->translator = $translator;
58
        $this->router = $router;
59
        $this->actionsRegistry = $actionsRegistry;
60
    }
61
62
    public function indexAction(Request $request, string $manager = null): RedirectResponse
63
    {
64
        $session = $this->getSession($request);
65
66
        $resolvedManagerName = $this->stepsResolver->resolveManagerName($manager);
67
68
        try {
69
            $step = $this->stepsResolver->resolveNumber($session->get("step.{$resolvedManagerName}", 1), $resolvedManagerName);
70
        } catch (StepNotFoundException $e) {
71
            throw new NotFoundHttpException('No step found to start the generator.', $e);
72
        }
73
74
        $routeParams = ['requestStep' => $step->getName()];
75
76
        if (null !== $manager) {
77
            $routeParams['manager'] = $manager;
78
        }
79
80
        return new RedirectResponse($this->router->generate('pierstoval_character_generator_step', $routeParams));
81
    }
82
83
    public function resetCharacterAction(Request $request, string $manager = null): RedirectResponse
84
    {
85
        $session = $this->getSession($request);
86
87
        $resolvedManagerName = $this->stepsResolver->resolveManagerName($manager);
88
89
        $session->set("character.{$resolvedManagerName}", []);
90
        $session->set("step.{$resolvedManagerName}", 1);
91
        $session->getFlashBag()->add('success', $this->trans('steps.reset.character', [], 'PierstovalCharacterManager'));
92
93
        return new RedirectResponse($this->router->generate('pierstoval_character_generator_index'));
94
    }
95
96
    public function resetStepAction(Request $request, string $requestStep, string $manager = null): RedirectResponse
97
    {
98
        $session = $this->getSession($request);
99
100
        $resolvedManagerName = $this->stepsResolver->resolveManagerName($manager);
101
102
        try {
103
            $step = $this->stepsResolver->resolve($requestStep, $resolvedManagerName);
104
        } catch (StepNotFoundException $e) {
105
            throw new NotFoundHttpException('Step not found.', $e);
106
        }
107
108
        $character = $session->get("character.{$resolvedManagerName}", []);
109
        unset($character[$step->getName()]);
110
111
        foreach ($step->getOnchangeClear() as $stepToClear) {
112
            unset($character[$stepToClear]);
113
        }
114
115
        $session->set("character.{$resolvedManagerName}", $character);
116
117
        $session->getFlashBag()->add('success', $this->trans('steps.reset.step', [], 'PierstovalCharacterManager'));
118
119
        $routeParams = ['requestStep' => $step->getName()];
120
121
        if (null !== $manager) {
122
            $routeParams['manager'] = $manager;
123
        }
124
125
        return new RedirectResponse($this->router->generate('pierstoval_character_generator_step', $routeParams));
126
    }
127
128
    public function stepAction(Request $request, string $requestStep, string $manager = null): Response
129
    {
130
        $session = $this->getSession($request);
131
132
        $resolvedManagerName = $this->stepsResolver->resolveManagerName($manager);
133
134
        try {
135
            $step = $this->stepsResolver->resolve($requestStep, $resolvedManagerName);
136
        } catch (StepNotFoundException $e) {
137
            throw new NotFoundHttpException('Step not found.', $e);
138
        }
139
140
        $character = $session->get("character.{$resolvedManagerName}", []);
141
142
        // Make sure that dependencies exist, else redirect to first step with a message.
143
        foreach ($step->getDependencies() as $stepName) {
144
            if (!isset($character[$stepName])) {
145
                $msg = $this->trans('steps.dependency_not_set', [
146
                    '%current_step%' => $step->getLabel(),
147
                    '%dependency%' => $this->stepsResolver->resolve($stepName, $resolvedManagerName)->getLabel(),
148
                ], 'PierstovalCharacterManager');
149
                $session->getFlashBag()->add('error', $msg);
150
151
                return new RedirectResponse($this->router->generate('pierstoval_character_generator_index'));
152
            }
153
        }
154
155
        /** @var StepActionInterface $action */
156
        $action = $this->actionsRegistry->getAction($step->getName());
157
158
        $action->setRequest($request);
159
160
        // Execute the action and expect a response. Symfony will do the rest.
161
        return $action->execute();
162
    }
163
164
    private function trans(string $message, array $parameters = [], string $translationDomain = null): string
165
    {
166
        if (!$this->translator) {
167
            return \strtr($message, $parameters);
168
        }
169
170
        return (string) $this->translator->trans($message, $parameters, $translationDomain ?: 'messages');
171
    }
172
173
    private function getSession(Request $request): Session
174
    {
175
        if (!($request->hasSession())) {
176
            throw new \RuntimeException('Session is mandatory when using the character generator.');
177
        }
178
179
        return $request->getSession();
180
    }
181
}
182