Passed
Pull Request — master (#9)
by Iakov
03:13
created

ApiCoreRoutingLoader::load()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 44
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 28
nc 4
nop 2
dl 0
loc 44
rs 8.5806
c 0
b 0
f 0
1
<?php
2
3
namespace Kami\ApiCoreBundle\Routing;
4
5
use Kami\ApiCoreBundle\Controller\ApiController;
6
use Kami\ApiCoreBundle\Model\UserAwareInterface;
7
use Symfony\Component\Config\Loader\Loader;
8
use Symfony\Component\Routing\Route;
9
use Symfony\Component\Routing\RouteCollection;
10
11
class ApiCoreRoutingLoader extends Loader
12
{
13
    /**
14
     * @var bool
15
     */
16
    private $loaded = false;
17
18
    /**
19
     * @var array
20
     */
21
    private $resources;
22
23
    /**
24
     * @var string
25
     */
26
    private $defaultLocale;
27
28
    /**
29
     * @var array
30
     */
31
    private $locales;
32
33
    /**
34
     * ApiRoutingLoader constructor.
35
     * @param array $resources
36
     */
37
    public function __construct(array $resources, array $locales, $defaultLocale)
38
    {
39
        $this->resources = $resources;
40
        $this->defaultLocale = $defaultLocale;
41
        $this->locales = $locales;
42
    }
43
44
    /**
45
     * @param mixed $resource
46
     * @param string $type
47
     * @return RouteCollection
48
     */
49
    public function load($resource, $type = null)
50
    {
51
        if (true === $this->loaded) {
52
            throw new \RuntimeException('Do not add the "api" loader twice');
53
        }
54
55
        $routes = new RouteCollection();
56
57
        foreach ($this->resources as $resource) {
0 ignored issues
show
introduced by
$resource is overwriting one of the parameters of this function.
Loading history...
58
            $routes->add(
59
                sprintf('kami.api_core_%s_index', $resource['name']),
60
                $this->createIndexRoute($resource)
61
            );
62
            $routes->add(
63
                sprintf('kami.api_core_%s_filter', $resource['name']),
64
                $this->createFilterRoute($resource)
65
            );
66
            $routes->add(
67
                sprintf('kami.api_core_%s_item', $resource['name']),
68
                $this->createItemRoute($resource)
69
            );
70
            $routes->add(
71
                sprintf('kami.api_core_%s_create', $resource['name']),
72
                $this->createNewRoute($resource)
73
            );
74
            $routes->add(
75
                sprintf('kami.api_core_%s_update', $resource['name']),
76
                $this->createUpdateRoute($resource)
77
            );
78
            $routes->add(
79
                sprintf('kami.api_core_%s_delete', $resource['name']),
80
                $this->createDeleteRoute($resource)
81
            );
82
            if ($resource['entity'] instanceof UserAwareInterface) {
83
                $routes->add(
84
                    sprintf('kami.api_core_%s_my', $resource['name']),
85
                    $this->createMyRoute($resource)
86
                );
87
            }
88
        }
89
90
        $this->loaded = true;
91
92
        return $routes;
93
    }
94
95
    public function supports($resource, $type = null)
96
    {
97
        return 'kami_api_core' === $type;
98
    }
99
100
101
    private function createIndexRoute(array $resource)
102
    {
103
        $path = sprintf('/api/{_locale}{_S}%s{_dot}{_format}', $resource['name']);
104
        $defaults = [
105
            '_controller' => ApiController::class.'::apiAction',
106
            '_locale' => $this->defaultLocale,
107
            '_entity' => $resource['entity'],
108
            '_strategy' => $resource['strategies']['index'],
109
            '_request_processor' => $resource['request_processor'],
110
            '_format' => 'json'
111
        ];
112
        $requirements = [
113
            '_S' => '/?',
114
            '_dot' => '\.?',
115
            '_locale' => '|'.implode('|', $this->locales),
116
            '_format' => 'json|xml'
117
        ];
118
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
119
120
        return $route;
121
    }
122
123
    private function createFilterRoute(array $resource)
124
    {
125
        $path = sprintf('/api/{_locale}{_S}%s/filter{_dot}{_format}', $resource['name']);
126
        $defaults = [
127
            '_controller' => ApiController::class.'::apiAction',
128
            '_locale' => $this->defaultLocale,
129
            '_entity' => $resource['entity'],
130
            '_strategy' => $resource['strategies']['filter'],
131
            '_request_processor' => $resource['request_processor'],
132
            '_format' => 'json'
133
        ];
134
        $requirements = [
135
            '_S' => '/?',
136
            '_dot' => '\.?',
137
            '_locale' => '|'.implode('|', $this->locales),
138
            '_format' => 'json|xml'
139
        ];
140
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
141
142
        return $route;
143
    }
144
145
    private function createItemRoute(array $resource)
146
    {
147
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
148
        $defaults = [
149
            '_controller' => ApiController::class.'::apiAction',
150
            '_locale' => $this->defaultLocale,
151
            '_entity' => $resource['entity'],
152
            '_strategy' => $resource['strategies']['item'],
153
            '_request_processor' => $resource['request_processor'],
154
            '_format' => 'json'
155
        ];
156
        $requirements = [
157
            '_S' => '/?',
158
            '_dot' => '\.?',
159
            '_locale' => '|'.implode('|', $this->locales),
160
            '_format' => 'json|xml',
161
            'id' => '\d+'
162
        ];
163
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
164
165
        return $route;
166
    }
167
168
    private function createUpdateRoute(array $resource)
169
    {
170
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
171
        $defaults = [
172
            '_controller' => ApiController::class.'::apiAction',
173
            '_locale' => $this->defaultLocale,
174
            '_entity' => $resource['entity'],
175
            '_strategy' => $resource['strategies']['update'],
176
            '_request_processor' => $resource['request_processor'],
177
            '_format' => 'json'
178
        ];
179
        $requirements = [
180
            '_S' => '/?',
181
            '_dot' => '\.?',
182
            '_locale' => '|'.implode('|', $this->locales),
183
            '_format' => 'json|xml',
184
            'id' => '\d+'
185
        ];
186
        $route = new Route($path, $defaults, $requirements, [], '', [], ['PUT']);
187
188
        return $route;
189
    }
190
    private function createNewRoute(array $resource)
191
    {
192
        $path = sprintf('/api/{_locale}{_S}%s{_dot}{_format}', $resource['name']);
193
        $defaults = [
194
            '_controller' => ApiController::class.'::apiAction',
195
            '_locale' => $this->defaultLocale,
196
            '_entity' => $resource['entity'],
197
            '_strategy' => $resource['strategies']['create'],
198
            '_request_processor' => $resource['request_processor'],
199
            '_format' => 'json'
200
        ];
201
        $requirements = [
202
            '_S' => '/?',
203
            '_dot' => '\.?',
204
            '_locale' => '|'.implode('|', $this->locales),
205
            '_format' => 'json|xml',
206
            'id' => '\d+'
207
        ];
208
        $route = new Route($path, $defaults, $requirements, [], '', [], ['POST']);
209
210
        return $route;
211
    }
212
213
    private function createDeleteRoute(array $resource)
214
    {
215
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
216
        $defaults = [
217
            '_controller' => ApiController::class.'::apiAction',
218
            '_locale' => $this->defaultLocale,
219
            '_entity' => $resource['entity'],
220
            '_strategy' => $resource['strategies']['delete'],
221
            '_request_processor' => $resource['request_processor'],
222
            '_format' => 'json',
223
        ];
224
        $requirements = [
225
            '_S' => '/?',
226
            '_dot' => '\.?',
227
            '_locale' => '|'.implode('|', $this->locales),
228
            '_format' => 'json|xml',
229
            'id' => '\d+'
230
        ];
231
        $route = new Route($path, $defaults, $requirements, [], '', [], ['DELETE']);
232
233
        return $route;
234
    }
235
236
    private function createMyRoute(array $resource)
237
    {
238
        $path = sprintf('/api/{_locale}{_S}my/%s/{id}{_dot}{_format}', $resource['name']);
239
        $defaults = [
240
            '_controller' => ApiController::class.'::apiAction',
241
            '_locale' => $this->defaultLocale,
242
            '_entity' => $resource['entity'],
243
            '_strategy' => $resource['strategies']['my'],
244
            '_request_processor' => $resource['request_processor'],
245
            '_format' => 'json'
246
        ];
247
        $requirements = [
248
            '_S' => '/?',
249
            '_dot' => '\.?',
250
            '_locale' => '|'.implode('|', $this->locales),
251
            '_format' => 'json|xml',
252
            'id' => '\d+'
253
        ];
254
        $route = new Route($path, $defaults, $requirements, [], '', [], ['DELETE']);
255
256
        return $route;
257
    }
258
}
259