Completed
Pull Request — master (#9)
by Iakov
03:57
created

ApiCoreRoutingLoader::createDeleteRoute()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 16
nc 1
nop 1
dl 0
loc 21
rs 9.3142
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
            '_sort' => $resource['default_sort'],
111
            '_sort_direction' => $resource['default_sort_direction'],
112
            '_format' => 'json'
113
        ];
114
        $requirements = [
115
            '_S' => '/?',
116
            '_dot' => '\.?',
117
            '_locale' => '|'.implode('|', $this->locales),
118
            '_format' => 'json|xml'
119
        ];
120
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
121
122
        return $route;
123
    }
124
125
    private function createFilterRoute(array $resource)
126
    {
127
        $path = sprintf('/api/{_locale}{_S}%s/filter{_dot}{_format}', $resource['name']);
128
        $defaults = [
129
            '_controller' => ApiController::class.'::apiAction',
130
            '_locale' => $this->defaultLocale,
131
            '_entity' => $resource['entity'],
132
            '_strategy' => $resource['strategies']['filter'],
133
            '_request_processor' => $resource['request_processor'],
134
            '_sort' => $resource['default_sort'],
135
            '_sort_direction' => $resource['default_sort_direction'],
136
            '_format' => 'json'
137
        ];
138
        $requirements = [
139
            '_S' => '/?',
140
            '_dot' => '\.?',
141
            '_locale' => '|'.implode('|', $this->locales),
142
            '_format' => 'json|xml'
143
        ];
144
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
145
146
        return $route;
147
    }
148
149
    private function createItemRoute(array $resource)
150
    {
151
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
152
        $defaults = [
153
            '_controller' => ApiController::class.'::apiAction',
154
            '_locale' => $this->defaultLocale,
155
            '_entity' => $resource['entity'],
156
            '_strategy' => $resource['strategies']['item'],
157
            '_request_processor' => $resource['request_processor'],
158
            '_format' => 'json'
159
        ];
160
        $requirements = [
161
            '_S' => '/?',
162
            '_dot' => '\.?',
163
            '_locale' => '|'.implode('|', $this->locales),
164
            '_format' => 'json|xml',
165
            'id' => '\d+'
166
        ];
167
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
168
169
        return $route;
170
    }
171
172
    private function createUpdateRoute(array $resource)
173
    {
174
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
175
        $defaults = [
176
            '_controller' => ApiController::class.'::apiAction',
177
            '_locale' => $this->defaultLocale,
178
            '_entity' => $resource['entity'],
179
            '_strategy' => $resource['strategies']['update'],
180
            '_request_processor' => $resource['request_processor'],
181
            '_format' => 'json'
182
        ];
183
        $requirements = [
184
            '_S' => '/?',
185
            '_dot' => '\.?',
186
            '_locale' => '|'.implode('|', $this->locales),
187
            '_format' => 'json|xml',
188
            'id' => '\d+'
189
        ];
190
        $route = new Route($path, $defaults, $requirements, [], '', [], ['PUT']);
191
192
        return $route;
193
    }
194
    private function createNewRoute(array $resource)
195
    {
196
        $path = sprintf('/api/{_locale}{_S}%s{_dot}{_format}', $resource['name']);
197
        $defaults = [
198
            '_controller' => ApiController::class.'::apiAction',
199
            '_locale' => $this->defaultLocale,
200
            '_entity' => $resource['entity'],
201
            '_strategy' => $resource['strategies']['create'],
202
            '_request_processor' => $resource['request_processor'],
203
            '_format' => 'json'
204
        ];
205
        $requirements = [
206
            '_S' => '/?',
207
            '_dot' => '\.?',
208
            '_locale' => '|'.implode('|', $this->locales),
209
            '_format' => 'json|xml',
210
            'id' => '\d+'
211
        ];
212
        $route = new Route($path, $defaults, $requirements, [], '', [], ['POST']);
213
214
        return $route;
215
    }
216
217
    private function createDeleteRoute(array $resource)
218
    {
219
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
220
        $defaults = [
221
            '_controller' => ApiController::class.'::apiAction',
222
            '_locale' => $this->defaultLocale,
223
            '_entity' => $resource['entity'],
224
            '_strategy' => $resource['strategies']['delete'],
225
            '_request_processor' => $resource['request_processor'],
226
            '_format' => 'json',
227
        ];
228
        $requirements = [
229
            '_S' => '/?',
230
            '_dot' => '\.?',
231
            '_locale' => '|'.implode('|', $this->locales),
232
            '_format' => 'json|xml',
233
            'id' => '\d+'
234
        ];
235
        $route = new Route($path, $defaults, $requirements, [], '', [], ['DELETE']);
236
237
        return $route;
238
    }
239
240
    private function createMyRoute(array $resource)
241
    {
242
        $path = sprintf('/api/{_locale}{_S}my/%s/{id}{_dot}{_format}', $resource['name']);
243
        $defaults = [
244
            '_controller' => ApiController::class.'::apiAction',
245
            '_locale' => $this->defaultLocale,
246
            '_entity' => $resource['entity'],
247
            '_strategy' => $resource['strategies']['my'],
248
            '_request_processor' => $resource['request_processor'],
249
            '_format' => 'json'
250
        ];
251
        $requirements = [
252
            '_S' => '/?',
253
            '_dot' => '\.?',
254
            '_locale' => '|'.implode('|', $this->locales),
255
            '_format' => 'json|xml',
256
            'id' => '\d+'
257
        ];
258
        $route = new Route($path, $defaults, $requirements, [], '', [], ['DELETE']);
259
260
        return $route;
261
    }
262
}
263