Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 79 |
GatewayController | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
1892 | |
0.00% |
0 / 79 |
__construct | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 8 |
|||
setRouteApi | |
0.00% |
0 / 1 |
132 | |
0.00% |
0 / 27 |
|||
setRouteResource | |
0.00% |
0 / 1 |
506 | |
0.00% |
0 / 30 |
|||
requestApi | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 11 |
|||
setDocRoutes | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
1 | <?php |
2 | |
3 | namespace Qmp\Laravel\ApiGateway\Controllers; |
4 | |
5 | use Illuminate\Http\Exceptions\HttpResponseException; |
6 | use Illuminate\Http\Request; |
7 | use Illuminate\Support\Facades\Log; |
8 | use Illuminate\Support\Facades\Route; |
9 | use Illuminate\Support\Str; |
10 | use Qmp\Laravel\ApiGateway\Controllers\AbstractApiController; |
11 | use Qmp\Laravel\ApiGateway\Controllers\TraitProxyApiController; |
12 | use \Illuminate\Http\Response; |
13 | use Qmp\Laravel\ApiGateway\Services\Route\RouteDocFormat; |
14 | |
15 | class GatewayController extends AbstractApiController |
16 | { |
17 | use TraitProxyApiController; |
18 | |
19 | protected $externalAuthAcceptedMethods = []; |
20 | |
21 | protected $serviceName = ''; |
22 | |
23 | protected $resourceName = ''; |
24 | |
25 | protected $methodToUseInRequestApi = ''; |
26 | |
27 | public function __construct() |
28 | { |
29 | if (!\App::runningInConsole()) { |
30 | [$controller, $method] = explode('@', Route::currentRouteAction()); |
31 | if ($method === 'requestApi') { |
32 | // specific route |
33 | $this->setRouteApi(); |
34 | } else if ($method === 'setDocRoutes') { |
35 | // Nothing to do ! |
36 | } else { |
37 | // resource |
38 | $this->setRouteResource(); |
39 | } |
40 | } |
41 | |
42 | parent::__construct(); |
43 | } |
44 | |
45 | protected function setRouteApi() |
46 | { |
47 | $route = explode('.', Route::currentRouteName()); |
48 | |
49 | $uri = Route::current()->uri(); |
50 | collect(config('api_gateway.routes'))->each(function($value, $key) use ($uri) { |
51 | |
52 | if (isset($value['resources'])) { |
53 | foreach ($value['resources'] as $resource) { |
54 | if (isset($resource['routes'])) { |
55 | foreach ($resource['routes'] as $route) { |
56 | $path = ($value['path'] ?? '') . ($route['path'] ?? ''); |
57 | $path = preg_replace('/\/$/', '', $path); |
58 | //Log::debug(var_export([$uri, $path, Route::currentRouteName(), $route['name']], true)); |
59 | if (Str::endsWith($uri, $path) && Str::endsWith(Route::currentRouteName(), $route['name'])) { |
60 | if (isset($route['external_route']) && $route['external_route'] === true) { |
61 | $this->externalAuthAcceptedMethods = ['requestApi']; |
62 | } |
63 | |
64 | if (isset($value['service_name'])) { |
65 | $this->serviceName = $value['service_name']; |
66 | } |
67 | |
68 | //Log::debug(var_export(['resourcename', $route, $uri, $path, Route::currentRouteName()], true)); |
69 | if (isset($route['resource_name'])) { |
70 | |
71 | // replace route parameters in resource_name |
72 | $parameters = Route::current()->parameters(); |
73 | $keys = array_map(function($key) { |
74 | return '/\{' . $key . '[?]?\}/'; |
75 | }, array_keys($parameters)); |
76 | $parameters = array_values($parameters); |
77 | $url = preg_replace($keys, $parameters, $route['resource_name']); |
78 | $url = preg_replace('/\/\{.*\}/', '', $url); |
79 | $url = preg_replace('/^\//', '', $url); |
80 | |
81 | $this->resourceName = $url; |
82 | } |
83 | |
84 | return false; |
85 | } |
86 | } |
87 | } |
88 | } |
89 | } |
90 | }); |
91 | } |
92 | |
93 | protected function setRouteResource() |
94 | { |
95 | $route = explode('.', Route::currentRouteName()); |
96 | if (count($route) === 3) { |
97 | array_unshift($route, ''); |
98 | } |
99 | |
100 | |
101 | collect(config('api_gateway.routes'))->each(function($value, $key) use ($route) { |
102 | if (!empty($route[1])) { |
103 | if (isset($value['name']) && $value['name'] === $route[1] && isset($value['resources'])) { |
104 | foreach ($value['resources'] as $resource) { |
105 | if (isset($resource['resource_api']) && $resource['resource_api'] === $route[2]) { |
106 | if (isset($resource['external_routes'])) { |
107 | $this->externalAuthAcceptedMethods = $resource['external_routes']; |
108 | } |
109 | |
110 | if (isset($value['service_name'])) { |
111 | $this->serviceName = $value['service_name']; |
112 | } |
113 | |
114 | if (isset($resource['resource_name'])) { |
115 | $this->resourceName = $resource['resource_name']; |
116 | } |
117 | |
118 | return false; |
119 | } |
120 | } |
121 | } |
122 | } else if (empty($route[1]) && isset($value['resources'])) { |
123 | foreach ($value['resources'] as $resource) { |
124 | if (isset($resource['resource_api']) && $resource['resource_api'] === $route[2]) { |
125 | if (isset($resource['external_routes'])) { |
126 | $this->externalAuthAcceptedMethods = $resource['external_routes']; |
127 | } |
128 | |
129 | if (isset($value['service_name'])) { |
130 | $this->serviceName = $value['service_name']; |
131 | } |
132 | |
133 | if (isset($resource['resource_name'])) { |
134 | $this->resourceName = $resource['resource_name']; |
135 | } |
136 | |
137 | return false; |
138 | } |
139 | } |
140 | } |
141 | }); |
142 | |
143 | if (empty($this->serviceName) || empty($this->resourceName)) { |
144 | Log::debug('current route not found :' . var_export([$route], true)); |
145 | abort(404, 'Route not found'); |
146 | } |
147 | } |
148 | |
149 | public function requestApi(Request $request) |
150 | { |
151 | $methods = Route::current()->methods(); |
152 | if (!empty($methods[0])) { |
153 | $method = strtolower($methods[0]); |
154 | /*Log::debug(var_export([ |
155 | $this->externalAuthAcceptedMethods, |
156 | $this->serviceName, |
157 | $this->resourceName, |
158 | $method |
159 | ], true));*/ |
160 | switch ($method) { |
161 | case 'post': |
162 | return $this->store($request); |
163 | case 'put': |
164 | return $this->update($request); |
165 | case 'delete': |
166 | return $this->destroy(); |
167 | } |
168 | } |
169 | |
170 | return $this->index($request); |
171 | |
172 | } |
173 | |
174 | public function setDocRoutes() |
175 | { |
176 | $doc = new RouteDocFormat(__DIR__); |
177 | $doc->createFile(); |
178 | |
179 | return response()->json(['status' => 'ok'], 200); |
180 | |
181 | } |
182 | |
183 | |
184 | } |