优化 代码

This commit is contained in:
iVampireSP.com 2022-11-20 22:35:53 +08:00
parent 358c54b0f0
commit 86da37fe19
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
17 changed files with 127 additions and 156 deletions

View File

@ -2,32 +2,48 @@
namespace App\Helpers; namespace App\Helpers;
use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\Paginator;
trait ApiResponse trait ApiResponse
{ {
// RESTful API response // 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); return $this->error($message, 404);
} }
// success public function error($message = '', $code = 400): JsonResponse
public function error($message = '', $code = 400)
{ {
return $this->apiResponse($message, $code); return $this->apiResponse($message, $code);
} }
// error public function apiResponse($data = [], $status = 200): JsonResponse
public function apiResponse($data = [], $status = 200)
{ {
// if data is paginated, return paginated data // if data is paginated, return paginated data
if ($data instanceof \Illuminate\Pagination\Paginator) { if ($data instanceof Paginator) {
$data = $data->toArray(); $data = $data->toArray();
$data['data'] = $data['data'] ?? []; $data['data'] = $data['data'] ?? [];
$data['meta'] = [ $data['meta'] = [
@ -42,6 +58,7 @@ public function apiResponse($data = [], $status = 200)
'data' => $data, 'data' => $data,
]; ];
} }
$data['status'] = $status; $data['status'] = $status;
if ($status >= 200 && $status <= 299) { if ($status >= 200 && $status <= 299) {
@ -53,111 +70,104 @@ public function apiResponse($data = [], $status = 200)
return response()->json($data, $status)->setEncodingOptions(JSON_UNESCAPED_UNICODE); return response()->json($data, $status)->setEncodingOptions(JSON_UNESCAPED_UNICODE);
} }
public function forbidden($message = 'Forbidden'): JsonResponse
// not found
public function forbidden($message = 'Forbidden')
{ {
return $this->error($message, 403); return $this->error($message, 403);
} }
// forbidden public function unauthorized($message = 'Unauthorized'): JsonResponse
public function unauthorized($message = 'Unauthorized')
{ {
return $this->error($message, 401); return $this->error($message, 401);
} }
// unauthorized public function badRequest($message = 'Bad request'): JsonResponse
public function badRequest($message = 'Bad request')
{ {
return $this->error($message, 400); return $this->error($message, 400);
} }
// bad request // bad request
public function created($message = 'Created') public function created($message = 'Created'): JsonResponse
{ {
return $this->success($message, 201); return $this->success($message, 201);
} }
// created // created
public function success($data = []) public function success($data = []): JsonResponse
{ {
return $this->apiResponse($data, 200); return $this->apiResponse($data, 200);
} }
// accepted // accepted
public function accepted($message = 'Accepted') public function accepted($message = 'Accepted'): JsonResponse
{ {
return $this->success($message, 202); return $this->success($message, 202);
} }
// no content // no content
public function noContent($message = 'No content') public function noContent($message = 'No content'): JsonResponse
{ {
return $this->success($message, 204); return $this->success($message, 204);
} }
// updated // updated
public function updated($message = 'Updated') public function updated($message = 'Updated'): JsonResponse
{ {
return $this->success($message, 200); return $this->success($message, 200);
} }
// deleted // deleted
public function deleted($message = 'Deleted') public function deleted($message = 'Deleted'): JsonResponse
{ {
return $this->success($message, 200); return $this->success($message, 200);
} }
// not allowed // not allowed
public function notAllowed($message = 'Not allowed') public function notAllowed($message = 'Not allowed'): JsonResponse
{ {
return $this->error($message, 405); return $this->error($message, 405);
} }
// conflict // conflict
public function conflict($message = 'Conflict') public function conflict($message = 'Conflict'): JsonResponse
{ {
return $this->error($message, 409); return $this->error($message, 409);
} }
// too many requests // too many requests
public function tooManyRequests($message = 'Too many requests') public function tooManyRequests($message = 'Too many requests'): JsonResponse
{ {
return $this->error($message, 429); return $this->error($message, 429);
} }
// server error // server error
public function serverError($message = 'Server error') public function serverError($message = 'Server error'): JsonResponse
{ {
return $this->error($message, 500); return $this->error($message, 500);
} }
// service unavailable // service unavailable
public function serviceUnavailable($message = 'Service unavailable') public function serviceUnavailable($message = 'Service unavailable'): JsonResponse
{ {
return $this->error($message, 503); return $this->error($message, 503);
} }
// method not allowed // method not allowed
public function methodNotAllowed($message = 'Method not allowed') public function methodNotAllowed($message = 'Method not allowed'): JsonResponse
{ {
return $this->error($message, 405); return $this->error($message, 405);
} }
// not acceptable // not acceptable
public function notAcceptable($message = 'Not acceptable') public function notAcceptable($message = 'Not acceptable'): JsonResponse
{ {
return $this->error($message, 406); return $this->error($message, 406);
} }
// precondition failed // precondition failed
public function preconditionFailed($message = 'Precondition failed') public function preconditionFailed($message = 'Precondition failed'): JsonResponse
{ {
return $this->error($message, 412); return $this->error($message, 412);
} }

View File

@ -18,7 +18,6 @@ class ForumController extends Controller
public function __construct() public function __construct()
{ {
$this->baseUrl = config('forum.base_url'); $this->baseUrl = config('forum.base_url');
$this->http = Http::baseUrl($this->baseUrl . '/api')->throw(); $this->http = Http::baseUrl($this->baseUrl . '/api')->throw();
} }
@ -43,8 +42,7 @@ public function cache(Closure $callback)
public function get($url) public function get($url)
{ {
$resp = $this->http->get($url)->json()['data']; return $this->http->get($url)->json()['data'];
return $resp;
} }
public function resp($data) public function resp($data)

View File

@ -39,9 +39,7 @@ public function update(Request $request, Host $host): JsonResponse
public function destroy(Host $host) public function destroy(Host $host)
{ {
if ($host->user_id == auth()->id()) { if ($host->user_id == auth()->id()) {
if ($host->status == 'pending') { if ($host->status == 'pending') {
// 如果上次更新时间大于 5min // 如果上次更新时间大于 5min
if (time() - strtotime($host->updated_at) > 300) { if (time() - strtotime($host->updated_at) > 300) {
$host->delete(); $host->delete();
@ -62,9 +60,6 @@ public function usages(): JsonResponse
{ {
$month = now()->month; $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'; $month_cache_key = 'user_' . auth()->id() . '_month_' . $month . '_hosts_balances';
$hosts_balances = Cache::get($month_cache_key, []); $hosts_balances = Cache::get($month_cache_key, []);

View File

@ -10,9 +10,7 @@ class ServerController extends Controller
{ {
public function __invoke(Request $request) public function __invoke(Request $request)
{ {
$servers = Cache::get('servers', []); $servers = Cache::get('servers', []);
//
if ($request->has('module_id')) { if ($request->has('module_id')) {
// 查找指定 module_id // 查找指定 module_id

View File

@ -4,14 +4,13 @@
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Task; use App\Models\Task;
use Illuminate\Http\Request;
class TaskController extends Controller class TaskController extends Controller
{ {
public function __invoke() public function __invoke(Request $request)
{ {
// $tasks = Task::where('user_id', $request->user()->id)->with('host')->latest()->get();
$tasks = (new Task())->getCurrentUserTasks();
return $this->success($tasks); return $this->success($tasks);
} }
} }

View File

@ -7,7 +7,6 @@
class UserController extends Controller class UserController extends Controller
{ {
public function index(Request $request) public function index(Request $request)
{ {
return $this->success($request->user()); return $this->success($request->user());

View File

@ -10,10 +10,8 @@
class WorkOrderController extends Controller class WorkOrderController extends Controller
{ {
//
public function index(WorkOrder $workOrder): JsonResponse public function index(WorkOrder $workOrder): JsonResponse
{ {
$workOrder = $workOrder->thisUser()->with(['user', 'module', 'host'])->simplePaginate(100); $workOrder = $workOrder->thisUser()->with(['user', 'module', 'host'])->simplePaginate(100);
return $this->success($workOrder); return $this->success($workOrder);
@ -31,6 +29,7 @@ public function store(Request $request)
'host_id' => 'nullable|sometimes|exists:hosts,id', 'host_id' => 'nullable|sometimes|exists:hosts,id',
]); ]);
// 这里无法直接调用,得先转换成 Array
$request_data = $request->toArray(); $request_data = $request->toArray();
@ -65,7 +64,6 @@ public function show(WorkOrder $workOrder): JsonResponse
*/ */
public function update(Request $request, WorkOrder $workOrder) public function update(Request $request, WorkOrder $workOrder)
{ {
if (auth()->id() !== $workOrder->user_id) { if (auth()->id() !== $workOrder->user_id) {
return $this->notFound('无法找到对应的工单。'); return $this->notFound('无法找到对应的工单。');
} }

View File

@ -10,8 +10,6 @@
class BroadcastController extends Controller class BroadcastController extends Controller
{ {
//
public function broadcast_to_user(Request $request, User $user) public function broadcast_to_user(Request $request, User $user)
{ {
$this->validate($request, $this->rules()); $this->validate($request, $this->rules());
@ -22,7 +20,6 @@ public function broadcast_to_user(Request $request, User $user)
])); ]));
return $this->created($request->message); return $this->created($request->message);
} }
private function rules() private function rules()
@ -36,7 +33,6 @@ public function broadcast_to_host(Request $request, Host $host)
{ {
$this->validate($request, $this->rules()); $this->validate($request, $this->rules());
broadcast(new UserEvent($host->user_id, 'modules.hosts.event', [ broadcast(new UserEvent($host->user_id, 'modules.hosts.event', [
'host' => $host, 'host' => $host,
'message' => $request->message 'message' => $request->message

View File

@ -41,7 +41,6 @@ public function store(Request $request): Response|JsonResponse
'user_id' => 'required|integer|exists:users,id', 'user_id' => 'required|integer|exists:users,id',
]); ]);
//
$user = User::findOrFail($request->user_id); $user = User::findOrFail($request->user_id);
if ($request->price > 0) { if ($request->price > 0) {

View File

@ -14,16 +14,13 @@ class ModuleController extends Controller
public function index() public function index()
{ {
$module = auth('module')->user()->calculate(); $module = auth('module')->user()->calculate();
return $this->success($module); return $this->success($module);
} }
public function call(Request $request, Module $module) public function call(Request $request, Module $module)
{ {
$path = request()->path(); $path = request()->path();
$path = substr($path, strlen('/api/modules/' . $module->id)); $path = substr($path, strlen('/api/modules/' . $module->id));
$path = preg_replace('/[^a-zA-Z0-9\/]/', '', $path); $path = preg_replace('/[^a-zA-Z0-9\/]/', '', $path);
$method = Str::lower($request->method()); $method = Str::lower($request->method());

View File

@ -4,14 +4,18 @@
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\WorkOrder\Reply; use App\Models\WorkOrder\Reply;
use App\Models\WorkOrder\WorkOrder;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class ReplyController extends Controller class ReplyController extends Controller
{ {
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
* @param Request $request
*
* @return JsonResponse * @return JsonResponse
*/ */
public function index(Request $request): JsonResponse public function index(Request $request): JsonResponse
@ -28,10 +32,18 @@ public function index(Request $request): JsonResponse
* *
* @return 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(); $request_array = $request->all();
$reply = Reply::create([ $reply = Reply::create([

View File

@ -7,25 +7,24 @@
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use Illuminate\Validation\ValidationException;
class TaskController extends Controller class TaskController extends Controller
{ {
public $user_id, $host_id; public int $user_id, $host_id;
/** /**
* Display a listing of the resource. * 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
{ {
// $modules = Task::where('module_id', $request->user('module')->id())->simplePaginate(100);
// $this->assignId($request);
// return $this->getTasks(); return $this->success($modules);
return null;
} }
/** /**
@ -34,7 +33,7 @@ public function index(Request $request): ?Response
* @param Request $request * @param Request $request
* *
* @return JsonResponse * @return JsonResponse
* @throws \Illuminate\Validation\ValidationException * @throws ValidationException
*/ */
public function store(Request $request): JsonResponse public function store(Request $request): JsonResponse
{ {
@ -57,7 +56,7 @@ public function store(Request $request): JsonResponse
* @param Task $task * @param Task $task
* *
* @return JsonResponse * @return JsonResponse
* @throws \Illuminate\Validation\ValidationException * @throws ValidationException
*/ */
public function update(Request $request, Task $task): JsonResponse public function update(Request $request, Task $task): JsonResponse
{ {

View File

@ -11,8 +11,6 @@
class UserController extends Controller class UserController extends Controller
{ {
//
public function index(Request $request) public function index(Request $request)
{ {
$this->validate($request, [ $this->validate($request, [
@ -47,8 +45,6 @@ public function index(Request $request)
public function show(User $user) public function show(User $user)
{ {
$transaction = new Transaction();
return $this->success($user); return $this->success($user);
} }
@ -67,7 +63,6 @@ public function reduce(Request $request, User $user)
]); ]);
$module = auth('module')->user(); $module = auth('module')->user();
$transaction = new Transaction(); $transaction = new Transaction();
try { try {

View File

@ -6,36 +6,29 @@
use App\Http\Requests\Remote\WorkOrderRequest; use App\Http\Requests\Remote\WorkOrderRequest;
use App\Models\WorkOrder\WorkOrder; use App\Models\WorkOrder\WorkOrder;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
class WorkOrderController extends Controller class WorkOrderController extends Controller
{ {
//
public function index(WorkOrder $workOrder): JsonResponse 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); $workOrder = $workOrder->thisModule()->simplePaginate(10);
return $this->success($workOrder); return $this->success($workOrder);
} }
// public function store(Request $request) { public function show(Request $request, WorkOrder $workOrder): JsonResponse
// }
public function show(WorkOrderRequest $request, WorkOrder $workOrder): JsonResponse
{ {
if ($workOrder->module_id !== $request->user('module')->id) {
return $this->error('您没有权限查看此工单。');
}
return $this->success($workOrder); return $this->success($workOrder);
} }
/** /**
* @throws \Illuminate\Validation\ValidationException * @throws ValidationException
*/ */
public function update(WorkOrderRequest $request, WorkOrder $workOrder): JsonResponse 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')); $workOrder->update($request->only('status'));
return $this->success($workOrder); return $this->success($workOrder);
} }
// public function destroy() {}
} }

View File

@ -5,6 +5,7 @@
use App\Events\UserEvent; use App\Events\UserEvent;
use App\Models\WorkOrder\WorkOrder; use App\Models\WorkOrder\WorkOrder;
use GeneaLabs\LaravelModelCaching\Traits\Cachable; use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo as BelongsToAlias; use Illuminate\Database\Eloquent\Relations\BelongsTo as BelongsToAlias;
@ -13,23 +14,23 @@
/** /**
* App\Models\Host * App\Models\Host
* *
* @property int $id * @property int $id
* @property string $name * @property string $name
* @property string $module_id * @property string $module_id
* @property int $user_id * @property int $user_id
* @property float $price * @property float $price
* @property float|null $managed_price * @property float|null $managed_price
* @property mixed|null $configuration * @property mixed|null $configuration
* @property string $status * @property string $status
* @property int|null $hour * @property int|null $hour
* @property \Illuminate\Support\Carbon|null $suspended_at * @property \Illuminate\Support\Carbon|null $suspended_at
* @property string|null $deleted_at * @property string|null $deleted_at
* @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $updated_at
* @property-read \App\Models\Module $module * @property-read \App\Models\Module $module
* @property-read \App\Models\User $user * @property-read \App\Models\User $user
* @property-read \Illuminate\Database\Eloquent\Collection|WorkOrder[] $workOrders * @property-read Collection|WorkOrder[] $workOrders
* @property-read int|null $work_orders_count * @property-read int|null $work_orders_count
* @method static \GeneaLabs\LaravelModelCaching\CachedBuilder|Host active() * @method static \GeneaLabs\LaravelModelCaching\CachedBuilder|Host active()
* @method static \GeneaLabs\LaravelModelCaching\CachedBuilder|Host all($columns = []) * @method static \GeneaLabs\LaravelModelCaching\CachedBuilder|Host all($columns = [])
* @method static \GeneaLabs\LaravelModelCaching\CachedBuilder|Host avg($column) * @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) { return $this->where('user_id', $user_id)->with('module', function ($query) {
$query->select(['id', 'name']); $query->select(['id', 'name']);
@ -182,19 +183,19 @@ public function module(): BelongsToAlias
// cost // cost
// public function scopeActive($query) public function scopeActive($query)
// { {
// return $query->whereIn('status', ['running', 'stopped']); return $query->whereIn('status', ['running', 'stopped']);
// } }
//
// public function scopeThisUser($query, $module = null) public function scopeThisUser($query, $module = null)
// { {
// if ($module) { if ($module) {
// return $query->where('user_id', auth()->id())->where('module_id', $module); return $query->where('user_id', auth()->id())->where('module_id', $module);
// } else { } else {
// return $query->where('user_id', auth()->id()); return $query->where('user_id', auth()->id());
// } }
// } }
public function safeDelete(): bool public function safeDelete(): bool
{ {

View File

@ -7,6 +7,7 @@
use GeneaLabs\LaravelModelCaching\Traits\Cachable; use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Ramsey\Uuid\Uuid; use Ramsey\Uuid\Uuid;
use function auth; use function auth;
@ -83,6 +84,10 @@ protected static function boot()
// id 为 uuid // id 为 uuid
$model->id = Uuid::uuid4()->toString(); $model->id = Uuid::uuid4()->toString();
// 如果是模块创建的任务
if (auth('module')->check()) {
$model->module_id = auth('module')->id();
}
// host_id 和 user_id 至少存在一个 // host_id 和 user_id 至少存在一个
if (!$model->host_id && !$model->user_id) { if (!$model->host_id && !$model->user_id) {
@ -97,14 +102,6 @@ protected static function boot()
throw new CommonException('host_id 不存在'); 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; $model->user_id = $model->host->user_id;
Cache::forget('user_tasks_' . $model->user_id); Cache::forget('user_tasks_' . $model->user_id);
@ -134,27 +131,16 @@ protected static function boot()
static::deleted(function ($model) { static::deleted(function ($model) {
// Cache::forget('user_tasks_' . $model->user_id);
broadcast(new UserEvent($model->user_id, 'tasks.deleted', $model)); broadcast(new UserEvent($model->user_id, 'tasks.deleted', $model));
}); });
} }
public function scopeUser($query) // public function scopeUser($query)
{ // {
return $query->where('user_id', auth()->id()); // return $query->where('user_id', auth()->id());
} // }
public function getCurrentUserTasks() public function host(): BelongsTo
{
return Cache::remember('user_tasks_' . auth()->id(), 3600, function () {
return $this->user()->with('host')->latest()->get();
});
}
// before create
public function host()
{ {
return $this->belongsTo(Host::class); return $this->belongsTo(Host::class);
} }

View File

@ -54,11 +54,10 @@ class Transaction extends Model
]; ];
// scope this user public function scopeThisUser($query)
// public function scopeThisUser($query) {
// { return $query->where('user_id', auth()->id());
// return $query->where('user_id', auth()->id()); }
// }
private function addLog($user_id, $data) private function addLog($user_id, $data)
{ {