Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
CRAP | |
0.00% |
0 / 130 |
RouteDocFormat | |
0.00% |
0 / 1 |
|
0.00% |
0 / 7 |
2162 | |
0.00% |
0 / 130 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
createFile | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 12 |
|||
formatDoc | |
0.00% |
0 / 1 |
110 | |
0.00% |
0 / 15 |
|||
formatPermission | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 6 |
|||
formatParameters | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 5 |
|||
formatParameter | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 9 |
|||
getConfigRoute | |
0.00% |
0 / 1 |
462 | |
0.00% |
0 / 80 |
1 | <?php |
2 | |
3 | |
4 | namespace Qmp\Laravel\ApiGateway\Services\Route; |
5 | |
6 | |
7 | class RouteDocFormat |
8 | { |
9 | protected $outputFile = ''; |
10 | protected $latest = ''; |
11 | |
12 | protected $docPattern = " |
13 | /** |
14 | * @api {[[METHOD]]} [[URL]] [[RESOURCE]] - [[SUBTITLE]] |
15 | * @apiVersion [[VERSION]] |
16 | * @apiName [[RESOURCE]]/[[SUBTITLE]] |
17 | * @apiGroup [[TITLE]] |
18 | * |
19 | [[PERMISSION]] |
20 | * |
21 | [[PARAMETERS]] |
22 | * |
23 | **/"; |
24 | |
25 | protected $docToReplace = ['[[METHOD]]', '[[URL]]', '[[RESOURCE]]', '[[SUBTITLE]]', '[[VERSION]]', '[[TITLE]]', '[[PERMISSION]]', '[[PARAMETERS]]']; |
26 | |
27 | protected $paramPattern = " * @apiParam ([[METHOD]]) [[PARAMETER]]"; |
28 | |
29 | protected $paramToReplace = ['[[METHOD]]', '[[PARAMETER]]']; |
30 | |
31 | public function __construct($folder) |
32 | { |
33 | $this->outputFile = $folder . '/DocRoutesController.php'; |
34 | $this->latest = config('api_gateway.latest'); |
35 | } |
36 | |
37 | public function createFile() |
38 | { |
39 | $content = "<?php\n"; |
40 | file_put_contents($this->outputFile, $content); |
41 | |
42 | $config = $this->getConfigRoute(); |
43 | $content = []; |
44 | foreach ($config as $serviceName) { |
45 | foreach ($serviceName as $resources) { |
46 | foreach($resources as $resource) { |
47 | $content[] = $this->formatDoc($resource); |
48 | |
49 | if ($this->latest === $resource['version']) { |
50 | $content[] = $this->formatDoc($resource, true); |
51 | } |
52 | } |
53 | } |
54 | } |
55 | |
56 | file_put_contents($this->outputFile, implode("\n", $content), FILE_APPEND); |
57 | } |
58 | |
59 | protected function formatDoc(array $resource, $latest = false) |
60 | { |
61 | $parameters = $this->formatParameters($resource['method'], $resource['parameters']); |
62 | $permission = $this->formatPermission($resource); |
63 | $version = !empty($resource['version']) ? str_replace('v', '', $resource['version']) . '.0.0' : '1.0.0'; |
64 | $resourceName = !empty($resource['resource']) ? $resource['resource'] : 'Others'; |
65 | if ($resourceName === 'Others') { |
66 | if (preg_match('#latest/([^/]+)#', $resource['url_latest'], $matches) && isset($matches[1])) { |
67 | $resourceName = $matches[1]; |
68 | } |
69 | } |
70 | $title = $resource['title'] ?? 'Others'; |
71 | if ($title === 'Others') { |
72 | if (preg_match('#latest/([^/]+)#', $resource['url_latest'], $matches) && isset($matches[1])) { |
73 | $title = 'service_' . strtolower($matches[1]); |
74 | } |
75 | } |
76 | |
77 | if ($latest) { |
78 | $replacement = [$resource['method'], $resource['url_latest'], $resourceName, $resource['subTitle'], '9.9.9', $title, $permission, $parameters]; |
79 | } else { |
80 | $replacement = [$resource['method'], $resource['url'], $resourceName, $resource['subTitle'], $version, $title, $permission, $parameters]; |
81 | } |
82 | |
83 | return str_replace($this->docToReplace, $replacement, $this->docPattern); |
84 | |
85 | |
86 | } |
87 | |
88 | protected function formatPermission(array $resource) |
89 | { |
90 | $result = []; |
91 | if (!empty($resource['private'])) { |
92 | $result[] = ' * @apiPermission private'; |
93 | } |
94 | |
95 | if (!empty($resource['external_route'])) { |
96 | $result[] = ' * @apiPermission external_user'; |
97 | } |
98 | |
99 | return implode("\n", $result); |
100 | } |
101 | |
102 | protected function formatParameters($method, $parameters) |
103 | { |
104 | $result = []; |
105 | foreach ($parameters as $parameter) { |
106 | $replacement = [$method, $this->formatParameter($parameter)]; |
107 | $result[] = str_replace($this->paramToReplace, $replacement, $this->paramPattern); |
108 | } |
109 | |
110 | return implode("\n", $result); |
111 | } |
112 | |
113 | protected function formatParameter($parameter) |
114 | { |
115 | $parameter = explode('|', $parameter); |
116 | $parameterType = isset($parameter[0]) ? '{' . $parameter[0] . '} ' : ''; |
117 | $parameterVar = ''; |
118 | if (isset($parameter[1]) ) { |
119 | if (substr($parameter[1], -1) === '?') { |
120 | $parameterVar = '[' . rtrim($parameter[1],'?') . ']'; |
121 | } else { |
122 | $parameterVar = $parameter[1]; |
123 | } |
124 | } |
125 | |
126 | $parameterDesc = $parameter[2] ?? ''; |
127 | return implode(' ', compact('parameterType', 'parameterVar', 'parameterDesc')); |
128 | } |
129 | |
130 | protected function getConfigRoute() |
131 | { |
132 | $response = []; |
133 | collect(config('api_gateway.routes'))->each(function($value, $key) use (&$response) { |
134 | $name = $value['name'] ?? 'Others'; |
135 | $serviceName = $value['service_name'] ?? 'Others'; |
136 | $prefix = $value['version'] ?? null; |
137 | $path = '/api' . ($prefix ? '/' . $prefix : '') . ($value['path'] ?? ''); |
138 | $latestPath = '/api/latest' . ($value['path'] ?? ''); |
139 | foreach ($value['resources'] as $resource) { |
140 | $resourceApi = $resource['resource_api'] ?? false; |
141 | $resourceName = $resource['resource_name'] ?? ''; |
142 | if ($resourceApi) { |
143 | |
144 | $externalRoutes = $resource['external_routes'] ?? []; |
145 | $parameters = $resource['parameters'] ?? []; |
146 | |
147 | // Is ApiResource loop for each method of resource |
148 | $routeNames = ['index', 'show', 'store', 'update', 'destroy']; |
149 | $methods = ['get', 'get', 'post', 'put', 'delete']; |
150 | foreach ($routeNames as $id => $routeName) { |
151 | $isExternalRoutes = in_array($routeName, $externalRoutes); |
152 | |
153 | $routePath = $resourceName . (in_array($id, [1, 3, 4]) ? '/{id}' : ''); |
154 | $finalPath = $path . '/' . $routePath; |
155 | $latestFinalPath = $latestPath . '/' . $routePath; |
156 | |
157 | $routeParams = array_map(function ($parameter) { |
158 | $explodedParams = explode('|', $parameter); |
159 | array_shift($explodedParams); |
160 | return implode('|', $explodedParams); |
161 | }, array_filter($parameters, function($parameter) use($routeName) { |
162 | return strpos($parameter, $routeName) === 0; |
163 | })); |
164 | |
165 | |
166 | $result = [ |
167 | 'title' => $serviceName, |
168 | 'resource' => $resourceName, |
169 | |
170 | 'subTitle' => $routeName, |
171 | 'method' => $methods[$id], |
172 | 'version' => $prefix, |
173 | 'private' => true, |
174 | 'external_route' => $isExternalRoutes, |
175 | |
176 | 'url' => config('app.url') . $finalPath, |
177 | 'url_latest' => config('app.url') . $latestFinalPath, |
178 | 'parameters' => $routeParams |
179 | ]; |
180 | |
181 | if (!isset($response[$result['title']])) { |
182 | $response[$result['title']] = []; |
183 | } |
184 | |
185 | if (!isset($response[$result['title']][$result['resource']])) { |
186 | $response[$result['title']][$result['resource']] = []; |
187 | } |
188 | |
189 | $response[$result['title']][$result['resource']][] = $result; |
190 | } |
191 | } |
192 | |
193 | if (!empty($resource['routes'])) { |
194 | foreach ($resource['routes'] as $route) { |
195 | $routePath = $route['path'] ?? ''; |
196 | $finalPath = $path . $routePath; |
197 | $latestFinalPath = $latestPath . $routePath; |
198 | $method = $route['method'] ?? 'get'; |
199 | $routeName = $route['name'] ?? ''; |
200 | $private = $route['private'] ?? true; |
201 | $isExternalRoutes = !empty($route['external_route']); |
202 | $parameters = $route['parameters'] ?? []; |
203 | |
204 | if (empty($resourceName)) { |
205 | $resourceNmaeRoute = explode('/', $route['resource_name'] ?? ''); |
206 | if (!empty($resourceNmaeRoute[0])) { |
207 | $resourceName = $resourceNmaeRoute[0]; |
208 | } |
209 | |
210 | if (empty($resourceName) &&!empty($resourceNmaeRoute[1])) { |
211 | $resourceName = $resourceNmaeRoute[1]; |
212 | } |
213 | |
214 | if (empty($resourceName)) { |
215 | $routePathExploded = explode('/', $route['resource_name'] ?? ''); |
216 | if (!empty($resourceNmaeRoute[0])) { |
217 | $resourceName = $resourceNmaeRoute[0]; |
218 | } |
219 | |
220 | if (empty($resourceName) &&!empty($resourceNmaeRoute[1])) { |
221 | $resourceName = $resourceNmaeRoute[1]; |
222 | } |
223 | } |
224 | } |
225 | |
226 | $result = [ |
227 | 'title' => $serviceName === 'Others' ? $name : $serviceName, |
228 | 'resource' => $resourceName, |
229 | |
230 | 'subTitle' => last(explode('.', $routeName)), |
231 | 'method' => $method, |
232 | 'version' => $prefix, |
233 | 'private' => $private, |
234 | 'external_route' => $isExternalRoutes, |
235 | |
236 | 'url' => config('app.url') . $finalPath, |
237 | 'url_latest' => config('app.url') . $latestFinalPath, |
238 | 'parameters' => $parameters |
239 | ]; |
240 | |
241 | if (!isset($response[$result['title']])) { |
242 | $response[$result['title']] = []; |
243 | } |
244 | |
245 | if (!isset($response[$result['title']][$result['resource']])) { |
246 | $response[$result['title']][$result['resource']] = []; |
247 | } |
248 | |
249 | $response[$result['title']][$result['resource']][] = $result; |
250 | } |
251 | } |
252 | } |
253 | }); |
254 | |
255 | return $response; |
256 | } |
257 | } |