Passed
Pull Request — master (#27)
by Iakov
04:00
created

ApiCoreRoutingLoader::createMyRoute()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 17
nc 1
nop 1
dl 0
loc 22
ccs 0
cts 16
cp 0
crap 2
rs 9.2
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 2
    public function __construct(array $resources, array $locales, $defaultLocale)
38
    {
39 2
        $this->resources = $resources;
40 2
        $this->defaultLocale = $defaultLocale;
41 2
        $this->locales = $locales;
42 2
    }
43
44
    /**
45
     * @param mixed $resource
46
     * @param string $type
47
     * @return RouteCollection
48
     */
49 1
    public function load($resource, $type = null)
50
    {
51 1
        if (true === $this->loaded) {
52
            throw new \RuntimeException('Do not add the "api" loader twice');
53
        }
54
55 1
        $routes = new RouteCollection();
56
57 1
        foreach ($this->resources as $restResource) {
58 1
            $routes->add(
59 1
                sprintf('kami.api_core_%s_index', $restResource['name']),
60 1
                $this->createIndexRoute($restResource)
61
            );
62 1
            $routes->add(
63 1
                sprintf('kami.api_core_%s_filter', $restResource['name']),
64 1
                $this->createFilterRoute($restResource)
65
            );
66 1
            $routes->add(
67 1
                sprintf('kami.api_core_%s_item', $restResource['name']),
68 1
                $this->createItemRoute($restResource)
69
            );
70 1
            $routes->add(
71 1
                sprintf('kami.api_core_%s_create', $restResource['name']),
72 1
                $this->createNewRoute($restResource)
73
            );
74 1
            $routes->add(
75 1
                sprintf('kami.api_core_%s_update', $restResource['name']),
76 1
                $this->createUpdateRoute($restResource)
77
            );
78 1
            $routes->add(
79 1
                sprintf('kami.api_core_%s_delete', $restResource['name']),
80 1
                $this->createDeleteRoute($restResource)
81
            );
82 1
            if ($restResource['entity'] instanceof UserAwareInterface) {
83
                $routes->add(
84
                    sprintf('kami.api_core_%s_my', $restResource['name']),
85 1
                    $this->createMyRoute($restResource)
86
                );
87
            }
88
        }
89
90 1
        $this->loaded = true;
91
92 1
        return $routes;
93
    }
94
95
    public function supports($resource, $type = null)
96
    {
97
        return 'kami_api_core' === $type;
98
    }
99
100
101 1
    private function createIndexRoute(array $resource)
102
    {
103 1
        $path = sprintf('/api/{_locale}{_S}%s{_dot}{_format}', $resource['name']);
104
        $defaults = [
105 1
            '_controller' => ApiController::class.'::apiAction',
106 1
            '_locale' => $this->defaultLocale,
107 1
            '_entity' => $resource['entity'],
108 1
            '_strategy' => $resource['strategies']['index'],
109 1
            '_request_processor' => $resource['request_processor'],
110 1
            '_sort' => $resource['default_sort'],
111 1
            '_resource_name' => $resource['name'],
112 1
            '_sort_direction' => $resource['default_sort_direction'],
113 1
            '_format' => 'json'
114
        ];
115
        $requirements = [
116 1
            '_S' => '/?',
117 1
            '_dot' => '\.?',
118 1
            '_locale' => '|'.implode('|', $this->locales),
119 1
            '_format' => 'json|xml'
120
        ];
121 1
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
122
123 1
        return $route;
124
    }
125
126 1
    private function createFilterRoute(array $resource)
127
    {
128 1
        $path = sprintf('/api/{_locale}{_S}%s/filter{_dot}{_format}', $resource['name']);
129
        $defaults = [
130 1
            '_controller' => ApiController::class.'::apiAction',
131 1
            '_locale' => $this->defaultLocale,
132 1
            '_entity' => $resource['entity'],
133 1
            '_strategy' => $resource['strategies']['filter'],
134 1
            '_request_processor' => $resource['request_processor'],
135 1
            '_sort' => $resource['default_sort'],
136 1
            '_sort_direction' => $resource['default_sort_direction'],
137 1
            '_resource_name' => $resource['name'],
138 1
            '_format' => 'json'
139
        ];
140
        $requirements = [
141 1
            '_S' => '/?',
142 1
            '_dot' => '\.?',
143 1
            '_locale' => '|'.implode('|', $this->locales),
144 1
            '_format' => 'json|xml'
145
        ];
146 1
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
147
148 1
        return $route;
149
    }
150
151 1
    private function createItemRoute(array $resource)
152
    {
153 1
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
154
        $defaults = [
155 1
            '_controller' => ApiController::class.'::apiAction',
156 1
            '_locale' => $this->defaultLocale,
157 1
            '_entity' => $resource['entity'],
158 1
            '_strategy' => $resource['strategies']['item'],
159 1
            '_request_processor' => $resource['request_processor'],
160 1
            '_resource_name' => $resource['name'],
161 1
            '_format' => 'json'
162
        ];
163
        $requirements = [
164 1
            '_S' => '/?',
165 1
            '_dot' => '\.?',
166 1
            '_locale' => '|'.implode('|', $this->locales),
167 1
            '_format' => 'json|xml',
168 1
            'id' => '\d+'
169
        ];
170 1
        $route = new Route($path, $defaults, $requirements, [], '', [], ['GET']);
171
172 1
        return $route;
173
    }
174
175 1
    private function createUpdateRoute(array $resource)
176
    {
177 1
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
178
        $defaults = [
179 1
            '_controller' => ApiController::class.'::apiAction',
180 1
            '_locale' => $this->defaultLocale,
181 1
            '_entity' => $resource['entity'],
182 1
            '_strategy' => $resource['strategies']['update'],
183 1
            '_request_processor' => $resource['request_processor'],
184 1
            '_resource_name' => $resource['name'],
185 1
            '_format' => 'json'
186
        ];
187
        $requirements = [
188 1
            '_S' => '/?',
189 1
            '_dot' => '\.?',
190 1
            '_locale' => '|'.implode('|', $this->locales),
191 1
            '_format' => 'json|xml',
192 1
            'id' => '\d+'
193
        ];
194 1
        $route = new Route($path, $defaults, $requirements, [], '', [], ['PUT']);
195
196 1
        return $route;
197
    }
198 1
    private function createNewRoute(array $resource)
199
    {
200 1
        $path = sprintf('/api/{_locale}{_S}%s{_dot}{_format}', $resource['name']);
201
        $defaults = [
202 1
            '_controller' => ApiController::class.'::apiAction',
203 1
            '_locale' => $this->defaultLocale,
204 1
            '_entity' => $resource['entity'],
205 1
            '_strategy' => $resource['strategies']['create'],
206 1
            '_request_processor' => $resource['request_processor'],
207 1
            '_resource_name' => $resource['name'],
208 1
            '_format' => 'json'
209
        ];
210
        $requirements = [
211 1
            '_S' => '/?',
212 1
            '_dot' => '\.?',
213 1
            '_locale' => '|'.implode('|', $this->locales),
214 1
            '_format' => 'json|xml',
215 1
            'id' => '\d+'
216
        ];
217 1
        $route = new Route($path, $defaults, $requirements, [], '', [], ['POST']);
218
219 1
        return $route;
220
    }
221
222 1
    private function createDeleteRoute(array $resource)
223
    {
224 1
        $path = sprintf('/api/{_locale}{_S}%s/{id}{_dot}{_format}', $resource['name']);
225
        $defaults = [
226 1
            '_controller' => ApiController::class.'::apiAction',
227 1
            '_locale' => $this->defaultLocale,
228 1
            '_entity' => $resource['entity'],
229 1
            '_strategy' => $resource['strategies']['delete'],
230 1
            '_request_processor' => $resource['request_processor'],
231 1
            '_resource_name' => $resource['name'],
232 1
            '_format' => 'json',
233
        ];
234
        $requirements = [
235 1
            '_S' => '/?',
236 1
            '_dot' => '\.?',
237 1
            '_locale' => '|'.implode('|', $this->locales),
238 1
            '_format' => 'json|xml',
239 1
            'id' => '\d+'
240
        ];
241 1
        $route = new Route($path, $defaults, $requirements, [], '', [], ['DELETE']);
242
243 1
        return $route;
244
    }
245
246
    private function createMyRoute(array $resource)
247
    {
248
        $path = sprintf('/api/{_locale}{_S}my/%s/{id}{_dot}{_format}', $resource['name']);
249
        $defaults = [
250
            '_controller' => ApiController::class.'::apiAction',
251
            '_locale' => $this->defaultLocale,
252
            '_entity' => $resource['entity'],
253
            '_strategy' => $resource['strategies']['my'],
254
            '_request_processor' => $resource['request_processor'],
255
            '_resource_name' => $resource['name'],
256
            '_format' => 'json'
257
        ];
258
        $requirements = [
259
            '_S' => '/?',
260
            '_dot' => '\.?',
261
            '_locale' => '|'.implode('|', $this->locales),
262
            '_format' => 'json|xml',
263
            'id' => '\d+'
264
        ];
265
        $route = new Route($path, $defaults, $requirements, [], '', [], ['DELETE']);
266
267
        return $route;
268
    }
269
}
270