Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 130
RouteDocFormat
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 7
2162
0.00% covered (danger)
0.00%
0 / 130
 __construct
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 3
 createFile
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 12
 formatDoc
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 15
 formatPermission
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 6
 formatParameters
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 5
 formatParameter
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 9
 getConfigRoute
0.00% covered (danger)
0.00%
0 / 1
462
0.00% covered (danger)
0.00%
0 / 80
1<?php
2
3
4namespace Qmp\Laravel\ApiGateway\Services\Route;
5
6
7class 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}