From 3b1e919d4b29d0969fa7e947cc6da7a9e928d445 Mon Sep 17 00:00:00 2001 From: "iVampireSP.com" Date: Mon, 29 Aug 2022 17:31:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9B=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Remote/Host/HostController.php | 33 ++++++++++++++++--- .../Controllers/Remote/ModuleController.php | 18 ++++++++-- app/Models/Module/Module.php | 28 ++++++++++++++++ app/Providers/AppServiceProvider.php | 1 + routes/api.php | 3 +- 5 files changed, 74 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/Remote/Host/HostController.php b/app/Http/Controllers/Remote/Host/HostController.php index e373665..f64e51c 100644 --- a/app/Http/Controllers/Remote/Host/HostController.php +++ b/app/Http/Controllers/Remote/Host/HostController.php @@ -2,10 +2,11 @@ namespace App\Http\Controllers\Remote\Host; -use App\Http\Controllers\Controller; -use App\Models\Host; use Cache; +use App\Models\Host; +use Illuminate\Support\Str; use Illuminate\Http\Request; +use App\Http\Controllers\Controller; class HostController extends Controller { @@ -29,7 +30,29 @@ public function index() public function store(Request $request) { // 存储计费项目 - + $request->validate([ + 'status' => 'required|in:running,stopped,error,suspended,pending', + 'price' => 'required|numeric', + 'user_id' => 'required|integer|exists:users,id', + ]); + + // 如果没有 name,则随机 + $name = $request->input('name', Str::random(10)); + + $data = [ + 'name' => $name, + 'status' => $request->status, + 'price' => $request->price, + 'user_id' => $request->user_id, + 'module_id' => auth('remote')->id() + ]; + + $host = Host::create($data); + + $host['host_id'] = $host->id; + + return $this->created($host); + } /** @@ -58,8 +81,8 @@ public function update(Request $request, Host $host) { // $request->validate([ - 'status' => 'sometimes|in:stopped,running,suspended,error', - 'managed_price' => 'sometimes|numeric|nullable', + 'status' => 'sometimes|in:running,stopped,error,suspended,pending', + // 'managed_price' => 'sometimes|numeric|nullable', // 如果是立即扣费 'cost_once' => 'sometimes|boolean|nullable', diff --git a/app/Http/Controllers/Remote/ModuleController.php b/app/Http/Controllers/Remote/ModuleController.php index d0302fe..656ac2e 100644 --- a/app/Http/Controllers/Remote/ModuleController.php +++ b/app/Http/Controllers/Remote/ModuleController.php @@ -27,8 +27,22 @@ public function call(Request $request, Module $module) $func = substr($func, 1); } - $response = $module->remote($func, $request->all()); + // 过滤除了 "/" 以外的特殊字符 + $func = preg_replace('/[^a-zA-Z0-9\/]/', '', $func); + - return $this->apiResponse($response[0], $response[1]); + + // dd($func); + + $method = Str::lower($request->method()); + + + $response = $module->remoteRequest($method, $func, $request->all()); + + if ($response['json'] === null && $response['body'] !== null) { + return response($response['body'], $response['status']); + } + + return $this->apiResponse($response['json'], $response['status']); } } diff --git a/app/Models/Module/Module.php b/app/Models/Module/Module.php index f640c25..8501193 100644 --- a/app/Models/Module/Module.php +++ b/app/Models/Module/Module.php @@ -48,6 +48,34 @@ public function remote($func, $requests) return [$json, $status]; } + + // post, get, patch, delete 等请求 + public function remoteRequest($method, $func, $requests) + { + $http = Http::remote($this->api_token, $this->url) + ->accept('application/json') + ->withHeaders(['X-Func' => $func]); + + + unset($requests['func']); + + $requests['user_id'] = auth('sanctum')->id(); + + $response = $http->{$method}("functions/{$func}", $requests); + + $json = $response->json(); + + $status = $response->status(); + + return [ + 'body' => $response->body(), + 'json' => $json, + 'status' => $status + ]; + } + + + public function remotePost($path = '', $data = []) { $http = Http::remote($this->api_token, $this->url); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index fbd607e..a3382e9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -30,6 +30,7 @@ public function boot() // 关闭证书验证 return Http::withoutVerifying()->withHeaders([ 'X-Remote-Api-Token' => $api_token, + 'Content-Type' => 'application/json' ])->baseUrl($url); }); diff --git a/routes/api.php b/routes/api.php index 15b4fd1..e9cc38b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -19,7 +19,6 @@ Route::apiResource('work-orders.replies', ReplyController::class); // 调用远程 API - // Route::post('hosts/{host}/func/{func}', [Remote\CallController::class, 'host'])->name('host.call'); - Route::post('/modules/{module}', [ModuleController::class, 'call'])->name('module.call'); + Route::any('/modules/{module}', [ModuleController::class, 'call'])->name('module.call'); });