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 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 79
GatewayController
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 5
1892
0.00% covered (danger)
0.00%
0 / 79
 __construct
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 8
 setRouteApi
0.00% covered (danger)
0.00%
0 / 1
132
0.00% covered (danger)
0.00%
0 / 27
 setRouteResource
0.00% covered (danger)
0.00%
0 / 1
506
0.00% covered (danger)
0.00%
0 / 30
 requestApi
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 11
 setDocRoutes
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 3
1<?php
2
3namespace Qmp\Laravel\ApiGateway\Controllers;
4
5use Illuminate\Http\Exceptions\HttpResponseException;
6use Illuminate\Http\Request;
7use Illuminate\Support\Facades\Log;
8use Illuminate\Support\Facades\Route;
9use Illuminate\Support\Str;
10use Qmp\Laravel\ApiGateway\Controllers\AbstractApiController;
11use Qmp\Laravel\ApiGateway\Controllers\TraitProxyApiController;
12use \Illuminate\Http\Response;
13use Qmp\Laravel\ApiGateway\Services\Route\RouteDocFormat;
14
15class 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}