优化 代码

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;
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);
}

View File

@ -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)

View File

@ -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, []);

View File

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

View File

@ -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);
}
}

View File

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

View File

@ -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('无法找到对应的工单。');
}

View File

@ -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

View File

@ -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) {

View File

@ -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());

View File

@ -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([

View File

@ -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
{

View File

@ -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 {

View File

@ -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() {}
}

View File

@ -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
{

View File

@ -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);
}

View File

@ -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)
{