From 86da37fe197cea7366f92b73f1a50444aff02179 Mon Sep 17 00:00:00 2001 From: "iVampireSP.com" Date: Sun, 20 Nov 2022 22:35:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Helpers/ApiResponse.php | 78 +++++++++++-------- app/Http/Controllers/Api/ForumController.php | 4 +- app/Http/Controllers/Api/HostController.php | 5 -- app/Http/Controllers/Api/ServerController.php | 2 - app/Http/Controllers/Api/TaskController.php | 7 +- app/Http/Controllers/Api/UserController.php | 1 - .../Controllers/Api/WorkOrderController.php | 4 +- .../Modules/BroadcastController.php | 4 - .../Controllers/Modules/HostController.php | 1 - .../Controllers/Modules/ModuleController.php | 3 - .../Controllers/Modules/ReplyController.php | 16 +++- .../Controllers/Modules/TaskController.php | 21 +++-- .../Controllers/Modules/UserController.php | 5 -- .../Modules/WorkOrderController.php | 26 ++----- app/Models/Host.php | 63 +++++++-------- app/Models/Task.php | 34 +++----- app/Models/Transaction.php | 9 +-- 17 files changed, 127 insertions(+), 156 deletions(-) diff --git a/app/Helpers/ApiResponse.php b/app/Helpers/ApiResponse.php index 4bbb7aa..e2a6fb8 100644 --- a/app/Helpers/ApiResponse.php +++ b/app/Helpers/ApiResponse.php @@ -2,32 +2,48 @@ namespace App\Helpers; +use Illuminate\Http\JsonResponse; +use Illuminate\Pagination\Paginator; + trait ApiResponse { // RESTful API response - public function remoteResponse($response, $status = 200) + public function moduleResponse($response, int $status = 200): JsonResponse { - return response()->json($response, $status)->setEncodingOptions(JSON_UNESCAPED_UNICODE); + if (isset($response['data'])) { + $response = $response['data']; + } + + return match ($status) { + 200 => $this->success($response), + 201 => $this->created($response), + 204 => $this->noContent(), + 400 => $this->badRequest(), + 401 => $this->serviceUnavailable(), + 403 => $this->forbidden(), + 404 => $this->notFound($response), + 405 => $this->methodNotAllowed(), + 429 => $this->tooManyRequests(), + 500 => $this->serverError(), + + default => response()->json($response['data'], $status), + }; } - public function notFound($message = 'Not found') + public function notFound($message = 'Not found'): JsonResponse { return $this->error($message, 404); } - // success - - public function error($message = '', $code = 400) + public function error($message = '', $code = 400): JsonResponse { return $this->apiResponse($message, $code); } - // error - - public function apiResponse($data = [], $status = 200) + public function apiResponse($data = [], $status = 200): JsonResponse { // if data is paginated, return paginated data - if ($data instanceof \Illuminate\Pagination\Paginator) { + if ($data instanceof Paginator) { $data = $data->toArray(); $data['data'] = $data['data'] ?? []; $data['meta'] = [ @@ -42,6 +58,7 @@ public function apiResponse($data = [], $status = 200) 'data' => $data, ]; } + $data['status'] = $status; if ($status >= 200 && $status <= 299) { @@ -53,111 +70,104 @@ public function apiResponse($data = [], $status = 200) return response()->json($data, $status)->setEncodingOptions(JSON_UNESCAPED_UNICODE); } - - // not found - - public function forbidden($message = 'Forbidden') + public function forbidden($message = 'Forbidden'): JsonResponse { return $this->error($message, 403); } - // forbidden - - public function unauthorized($message = 'Unauthorized') + public function unauthorized($message = 'Unauthorized'): JsonResponse { return $this->error($message, 401); } - // unauthorized - - public function badRequest($message = 'Bad request') + public function badRequest($message = 'Bad request'): JsonResponse { return $this->error($message, 400); } // bad request - public function created($message = 'Created') + public function created($message = 'Created'): JsonResponse { return $this->success($message, 201); } // created - public function success($data = []) + public function success($data = []): JsonResponse { return $this->apiResponse($data, 200); } // accepted - public function accepted($message = 'Accepted') + public function accepted($message = 'Accepted'): JsonResponse { return $this->success($message, 202); } // no content - public function noContent($message = 'No content') + public function noContent($message = 'No content'): JsonResponse { return $this->success($message, 204); } // updated - public function updated($message = 'Updated') + public function updated($message = 'Updated'): JsonResponse { return $this->success($message, 200); } // deleted - public function deleted($message = 'Deleted') + public function deleted($message = 'Deleted'): JsonResponse { return $this->success($message, 200); } // not allowed - public function notAllowed($message = 'Not allowed') + public function notAllowed($message = 'Not allowed'): JsonResponse { return $this->error($message, 405); } // conflict - public function conflict($message = 'Conflict') + public function conflict($message = 'Conflict'): JsonResponse { return $this->error($message, 409); } // too many requests - public function tooManyRequests($message = 'Too many requests') + public function tooManyRequests($message = 'Too many requests'): JsonResponse { return $this->error($message, 429); } // server error - public function serverError($message = 'Server error') + public function serverError($message = 'Server error'): JsonResponse { return $this->error($message, 500); } // service unavailable - public function serviceUnavailable($message = 'Service unavailable') + public function serviceUnavailable($message = 'Service unavailable'): JsonResponse { return $this->error($message, 503); } // method not allowed - public function methodNotAllowed($message = 'Method not allowed') + public function methodNotAllowed($message = 'Method not allowed'): JsonResponse { return $this->error($message, 405); } // not acceptable - public function notAcceptable($message = 'Not acceptable') + public function notAcceptable($message = 'Not acceptable'): JsonResponse { return $this->error($message, 406); } // precondition failed - public function preconditionFailed($message = 'Precondition failed') + public function preconditionFailed($message = 'Precondition failed'): JsonResponse { return $this->error($message, 412); } diff --git a/app/Http/Controllers/Api/ForumController.php b/app/Http/Controllers/Api/ForumController.php index 4153d79..53b110e 100644 --- a/app/Http/Controllers/Api/ForumController.php +++ b/app/Http/Controllers/Api/ForumController.php @@ -18,7 +18,6 @@ class ForumController extends Controller public function __construct() { $this->baseUrl = config('forum.base_url'); - $this->http = Http::baseUrl($this->baseUrl . '/api')->throw(); } @@ -43,8 +42,7 @@ public function cache(Closure $callback) public function get($url) { - $resp = $this->http->get($url)->json()['data']; - return $resp; + return $this->http->get($url)->json()['data']; } public function resp($data) diff --git a/app/Http/Controllers/Api/HostController.php b/app/Http/Controllers/Api/HostController.php index 2c532ae..cddcfed 100644 --- a/app/Http/Controllers/Api/HostController.php +++ b/app/Http/Controllers/Api/HostController.php @@ -39,9 +39,7 @@ public function update(Request $request, Host $host): JsonResponse public function destroy(Host $host) { if ($host->user_id == auth()->id()) { - if ($host->status == 'pending') { - // 如果上次更新时间大于 5min if (time() - strtotime($host->updated_at) > 300) { $host->delete(); @@ -62,9 +60,6 @@ public function usages(): JsonResponse { $month = now()->month; - // $month_cache_key = 'user_' . auth()->id() . '_month_' . $month . '_hosts_drops'; - // $hosts_drops = Cache::get($month_cache_key, []); - $month_cache_key = 'user_' . auth()->id() . '_month_' . $month . '_hosts_balances'; $hosts_balances = Cache::get($month_cache_key, []); diff --git a/app/Http/Controllers/Api/ServerController.php b/app/Http/Controllers/Api/ServerController.php index 3ae7268..b1c9ba9 100644 --- a/app/Http/Controllers/Api/ServerController.php +++ b/app/Http/Controllers/Api/ServerController.php @@ -10,9 +10,7 @@ class ServerController extends Controller { public function __invoke(Request $request) { - $servers = Cache::get('servers', []); - // if ($request->has('module_id')) { // 查找指定 module_id diff --git a/app/Http/Controllers/Api/TaskController.php b/app/Http/Controllers/Api/TaskController.php index c6e926e..e3de56c 100644 --- a/app/Http/Controllers/Api/TaskController.php +++ b/app/Http/Controllers/Api/TaskController.php @@ -4,14 +4,13 @@ use App\Http\Controllers\Controller; use App\Models\Task; +use Illuminate\Http\Request; class TaskController extends Controller { - public function __invoke() + public function __invoke(Request $request) { - // - $tasks = (new Task())->getCurrentUserTasks(); - + $tasks = Task::where('user_id', $request->user()->id)->with('host')->latest()->get(); return $this->success($tasks); } } diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php index 3f0da9f..fba65cc 100644 --- a/app/Http/Controllers/Api/UserController.php +++ b/app/Http/Controllers/Api/UserController.php @@ -7,7 +7,6 @@ class UserController extends Controller { - public function index(Request $request) { return $this->success($request->user()); diff --git a/app/Http/Controllers/Api/WorkOrderController.php b/app/Http/Controllers/Api/WorkOrderController.php index 6f73ef0..8b49591 100644 --- a/app/Http/Controllers/Api/WorkOrderController.php +++ b/app/Http/Controllers/Api/WorkOrderController.php @@ -10,10 +10,8 @@ class WorkOrderController extends Controller { - // public function index(WorkOrder $workOrder): JsonResponse { - $workOrder = $workOrder->thisUser()->with(['user', 'module', 'host'])->simplePaginate(100); return $this->success($workOrder); @@ -31,6 +29,7 @@ public function store(Request $request) 'host_id' => 'nullable|sometimes|exists:hosts,id', ]); + // 这里无法直接调用,得先转换成 Array $request_data = $request->toArray(); @@ -65,7 +64,6 @@ public function show(WorkOrder $workOrder): JsonResponse */ public function update(Request $request, WorkOrder $workOrder) { - if (auth()->id() !== $workOrder->user_id) { return $this->notFound('无法找到对应的工单。'); } diff --git a/app/Http/Controllers/Modules/BroadcastController.php b/app/Http/Controllers/Modules/BroadcastController.php index be37eb3..dca0ccb 100644 --- a/app/Http/Controllers/Modules/BroadcastController.php +++ b/app/Http/Controllers/Modules/BroadcastController.php @@ -10,8 +10,6 @@ class BroadcastController extends Controller { - // - public function broadcast_to_user(Request $request, User $user) { $this->validate($request, $this->rules()); @@ -22,7 +20,6 @@ public function broadcast_to_user(Request $request, User $user) ])); return $this->created($request->message); - } private function rules() @@ -36,7 +33,6 @@ public function broadcast_to_host(Request $request, Host $host) { $this->validate($request, $this->rules()); - broadcast(new UserEvent($host->user_id, 'modules.hosts.event', [ 'host' => $host, 'message' => $request->message diff --git a/app/Http/Controllers/Modules/HostController.php b/app/Http/Controllers/Modules/HostController.php index 77d2f5f..524359d 100644 --- a/app/Http/Controllers/Modules/HostController.php +++ b/app/Http/Controllers/Modules/HostController.php @@ -41,7 +41,6 @@ public function store(Request $request): Response|JsonResponse 'user_id' => 'required|integer|exists:users,id', ]); - // $user = User::findOrFail($request->user_id); if ($request->price > 0) { diff --git a/app/Http/Controllers/Modules/ModuleController.php b/app/Http/Controllers/Modules/ModuleController.php index 516375c..819afbc 100644 --- a/app/Http/Controllers/Modules/ModuleController.php +++ b/app/Http/Controllers/Modules/ModuleController.php @@ -14,16 +14,13 @@ class ModuleController extends Controller public function index() { $module = auth('module')->user()->calculate(); - return $this->success($module); } public function call(Request $request, Module $module) { $path = request()->path(); - $path = substr($path, strlen('/api/modules/' . $module->id)); - $path = preg_replace('/[^a-zA-Z0-9\/]/', '', $path); $method = Str::lower($request->method()); diff --git a/app/Http/Controllers/Modules/ReplyController.php b/app/Http/Controllers/Modules/ReplyController.php index 4d9b84b..d6c05b0 100644 --- a/app/Http/Controllers/Modules/ReplyController.php +++ b/app/Http/Controllers/Modules/ReplyController.php @@ -4,14 +4,18 @@ use App\Http\Controllers\Controller; use App\Models\WorkOrder\Reply; +use App\Models\WorkOrder\WorkOrder; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; class ReplyController extends Controller { /** * Display a listing of the resource. * + * @param Request $request + * * @return JsonResponse */ public function index(Request $request): JsonResponse @@ -28,10 +32,18 @@ public function index(Request $request): JsonResponse * * @return JsonResponse */ - public function store(Request $request): JsonResponse + public function store(Request $request, WorkOrder $work_order): JsonResponse { - // + $this->validate($request, [ + 'content' => 'required|string|max:255', + 'work_order_id' => 'required|integer|exists:work_orders,id', + ]); + if ($work_order->module_id !== auth('module')->id()) { + return $this->error('您没有权限回复此工单。'); + } + + // 需要转换成数组 $request_array = $request->all(); $reply = Reply::create([ diff --git a/app/Http/Controllers/Modules/TaskController.php b/app/Http/Controllers/Modules/TaskController.php index 3d54fbc..60116b3 100644 --- a/app/Http/Controllers/Modules/TaskController.php +++ b/app/Http/Controllers/Modules/TaskController.php @@ -7,25 +7,24 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; +use Illuminate\Validation\ValidationException; class TaskController extends Controller { - public $user_id, $host_id; - + public int $user_id, $host_id; /** * Display a listing of the resource. * - * @return Response|null + * @param Request $request + * + * @return JsonResponse */ - public function index(Request $request): ?Response + public function index(Request $request): JsonResponse { - // - // $this->assignId($request); + $modules = Task::where('module_id', $request->user('module')->id())->simplePaginate(100); - // return $this->getTasks(); - - return null; + return $this->success($modules); } /** @@ -34,7 +33,7 @@ public function index(Request $request): ?Response * @param Request $request * * @return JsonResponse - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function store(Request $request): JsonResponse { @@ -57,7 +56,7 @@ public function store(Request $request): JsonResponse * @param Task $task * * @return JsonResponse - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function update(Request $request, Task $task): JsonResponse { diff --git a/app/Http/Controllers/Modules/UserController.php b/app/Http/Controllers/Modules/UserController.php index dcfa311..adc0cba 100644 --- a/app/Http/Controllers/Modules/UserController.php +++ b/app/Http/Controllers/Modules/UserController.php @@ -11,8 +11,6 @@ class UserController extends Controller { - // - public function index(Request $request) { $this->validate($request, [ @@ -47,8 +45,6 @@ public function index(Request $request) public function show(User $user) { - $transaction = new Transaction(); - return $this->success($user); } @@ -67,7 +63,6 @@ public function reduce(Request $request, User $user) ]); $module = auth('module')->user(); - $transaction = new Transaction(); try { diff --git a/app/Http/Controllers/Modules/WorkOrderController.php b/app/Http/Controllers/Modules/WorkOrderController.php index ce23088..7d04d0d 100644 --- a/app/Http/Controllers/Modules/WorkOrderController.php +++ b/app/Http/Controllers/Modules/WorkOrderController.php @@ -6,36 +6,29 @@ use App\Http\Requests\Remote\WorkOrderRequest; use App\Models\WorkOrder\WorkOrder; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Illuminate\Validation\ValidationException; class WorkOrderController extends Controller { - // public function index(WorkOrder $workOrder): JsonResponse { - // $work_orders = new WorkOrder(); - // // if route has user - // if ($request->route('user')) { - // $work_orders = $work_orders->where('user_id', $request->route('user')); - // } - - // $work_orders = $work_orders->simplePaginate(10); - $workOrder = $workOrder->thisModule()->simplePaginate(10); return $this->success($workOrder); } - // public function store(Request $request) { - - // } - - public function show(WorkOrderRequest $request, WorkOrder $workOrder): JsonResponse + public function show(Request $request, WorkOrder $workOrder): JsonResponse { + if ($workOrder->module_id !== $request->user('module')->id) { + return $this->error('您没有权限查看此工单。'); + } + return $this->success($workOrder); } /** - * @throws \Illuminate\Validation\ValidationException + * @throws ValidationException */ public function update(WorkOrderRequest $request, WorkOrder $workOrder): JsonResponse { @@ -46,7 +39,4 @@ public function update(WorkOrderRequest $request, WorkOrder $workOrder): JsonRes $workOrder->update($request->only('status')); return $this->success($workOrder); } - - // public function destroy() {} - } diff --git a/app/Models/Host.php b/app/Models/Host.php index ab1dabf..fbfbe21 100644 --- a/app/Models/Host.php +++ b/app/Models/Host.php @@ -5,6 +5,7 @@ use App\Events\UserEvent; use App\Models\WorkOrder\WorkOrder; use GeneaLabs\LaravelModelCaching\Traits\Cachable; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo as BelongsToAlias; @@ -13,23 +14,23 @@ /** * App\Models\Host * - * @property int $id - * @property string $name - * @property string $module_id - * @property int $user_id - * @property float $price - * @property float|null $managed_price - * @property mixed|null $configuration - * @property string $status - * @property int|null $hour - * @property \Illuminate\Support\Carbon|null $suspended_at - * @property string|null $deleted_at - * @property \Illuminate\Support\Carbon|null $created_at - * @property \Illuminate\Support\Carbon|null $updated_at - * @property-read \App\Models\Module $module - * @property-read \App\Models\User $user - * @property-read \Illuminate\Database\Eloquent\Collection|WorkOrder[] $workOrders - * @property-read int|null $work_orders_count + * @property int $id + * @property string $name + * @property string $module_id + * @property int $user_id + * @property float $price + * @property float|null $managed_price + * @property mixed|null $configuration + * @property string $status + * @property int|null $hour + * @property \Illuminate\Support\Carbon|null $suspended_at + * @property string|null $deleted_at + * @property \Illuminate\Support\Carbon|null $created_at + * @property \Illuminate\Support\Carbon|null $updated_at + * @property-read \App\Models\Module $module + * @property-read \App\Models\User $user + * @property-read Collection|WorkOrder[] $workOrders + * @property-read int|null $work_orders_count * @method static \GeneaLabs\LaravelModelCaching\CachedBuilder|Host active() * @method static \GeneaLabs\LaravelModelCaching\CachedBuilder|Host all($columns = []) * @method static \GeneaLabs\LaravelModelCaching\CachedBuilder|Host avg($column) @@ -157,7 +158,7 @@ protected static function boot() }); } - public function getUserHosts($user_id = null) + public function getUserHosts($user_id = null): array|Collection { return $this->where('user_id', $user_id)->with('module', function ($query) { $query->select(['id', 'name']); @@ -182,19 +183,19 @@ public function module(): BelongsToAlias // cost - // public function scopeActive($query) - // { - // return $query->whereIn('status', ['running', 'stopped']); - // } - // - // public function scopeThisUser($query, $module = null) - // { - // if ($module) { - // return $query->where('user_id', auth()->id())->where('module_id', $module); - // } else { - // return $query->where('user_id', auth()->id()); - // } - // } + public function scopeActive($query) + { + return $query->whereIn('status', ['running', 'stopped']); + } + + public function scopeThisUser($query, $module = null) + { + if ($module) { + return $query->where('user_id', auth()->id())->where('module_id', $module); + } else { + return $query->where('user_id', auth()->id()); + } + } public function safeDelete(): bool { diff --git a/app/Models/Task.php b/app/Models/Task.php index 78788ef..5b6a920 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -7,6 +7,7 @@ use GeneaLabs\LaravelModelCaching\Traits\Cachable; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Support\Facades\Cache; use Ramsey\Uuid\Uuid; use function auth; @@ -83,6 +84,10 @@ protected static function boot() // id 为 uuid $model->id = Uuid::uuid4()->toString(); + // 如果是模块创建的任务 + if (auth('module')->check()) { + $model->module_id = auth('module')->id(); + } // host_id 和 user_id 至少存在一个 if (!$model->host_id && !$model->user_id) { @@ -97,14 +102,6 @@ protected static function boot() throw new CommonException('host_id 不存在'); } - // dd($model); - - // dd($model->host_id); - // $host = Host::where('id', $model->host_id)->first(); - - // dd($host); - - $model->user_id = $model->host->user_id; Cache::forget('user_tasks_' . $model->user_id); @@ -134,27 +131,16 @@ protected static function boot() static::deleted(function ($model) { - // Cache::forget('user_tasks_' . $model->user_id); - broadcast(new UserEvent($model->user_id, 'tasks.deleted', $model)); }); } - public function scopeUser($query) - { - return $query->where('user_id', auth()->id()); - } + // public function scopeUser($query) + // { + // return $query->where('user_id', auth()->id()); + // } - public function getCurrentUserTasks() - { - return Cache::remember('user_tasks_' . auth()->id(), 3600, function () { - return $this->user()->with('host')->latest()->get(); - }); - } - - // before create - - public function host() + public function host(): BelongsTo { return $this->belongsTo(Host::class); } diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 39d452a..a59efa9 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -54,11 +54,10 @@ class Transaction extends Model ]; - // scope this user - // public function scopeThisUser($query) - // { - // return $query->where('user_id', auth()->id()); - // } + public function scopeThisUser($query) + { + return $query->where('user_id', auth()->id()); + } private function addLog($user_id, $data) {