This commit is contained in:
iVampireSP.com 2022-08-26 22:37:20 +08:00
parent c333e3bc38
commit c277f8b310
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
12 changed files with 266 additions and 85 deletions

View File

@ -20,13 +20,12 @@ class AuthController extends Controller
public function index(Request $request) public function index(Request $request)
{ {
// test // test
$handle = new \App\Jobs\Remote\PushHost(); // $handle = new \App\Jobs\Remote\PushHost();
$handle->handle(); // $handle->handle();
$handle = new \App\Jobs\Remote\PushWorkOrder(); // $handle = new \App\Jobs\Remote\PushWorkOrder();
$handle->handle(); // $handle->handle();
// if logged in // if logged in
if (Auth::check()) { if (Auth::check()) {

View File

@ -87,6 +87,8 @@ public function destroy(Host $host)
// //
$host->delete(); $host->delete();
//
return $this->deleted($host); return $this->deleted($host);
} }
} }

View File

@ -2,35 +2,30 @@
namespace App\Http\Controllers\Remote\Host; namespace App\Http\Controllers\Remote\Host;
use App\Http\Controllers\Controller; use App\Models\Host;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Ramsey\Uuid\Uuid; use Ramsey\Uuid\Uuid;
use App\Models\User\Task;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
class TaskController extends Controller class TaskController extends Controller
{ {
public $user_id, $host_id; public $user_id, $host_id;
public function __construct(Request $request)
{
$request->validate([
'host_id' => 'sometimes|integer|exists:hosts,id',
// 'user_id' => 'integer|exists:users,id',
]);
// $this->user_id = $request->user_id;
$this->host_id = $request->host_id;
}
/** /**
* Display a listing of the resource. * Display a listing of the resource.
* *
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function index() public function index(Request $request)
{ {
// //
// $this->assignId($request);
// return $this->getTasks();
} }
/** /**
@ -43,80 +38,34 @@ public function store(Request $request)
{ {
// //
$request->validate([ $request->validate([
'host_id' => 'required|exists:hosts,id',
'title' => 'required|max:255', 'title' => 'required|max:255',
'progress' => 'sometimes|integer|max:100', 'progress' => 'sometimes|integer|max:100',
'status' => 'required|in:pending,processing,need_operation,done,success,failed,error,canceled', 'status' => 'required|in:pending,processing,need_operation,done,success,failed,error,canceled',
]); ]);
$task = Task::create($request->all());
return $this->created($this->pushTask([ return $this->success($task);
'title' => $request->title,
'progress' => $request->progress,
'status' => $request->status,
]));
} }
/** /**
* Update the specified resource in storage. * Update the specified resource in storage.
* *
* @param \Illuminate\Http\Request $request * @param \Illuminate\Http\Request $request
* @param int $id * @param Task $task
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function update(Request $request, $id) public function update(Request $request, Task $task)
{ {
//
$request->validate([ $request->validate([
'id' => 'max:40|required', 'progress' => 'sometimes|integer|max:100',
'status' => 'sometimes|in:pending,processing,need_operation,done,success,failed,error,canceled',
]); ]);
$tasks = $this->getTasks(); $task->update($request->all());
// check if task exists return $this->updated($task);
if (!isset($tasks[$id])) {
// create task
$task = [
'title' => $request->title,
'progress' => 0,
'status' => $request->status,
];
$this->pushTask($task, $request->id);
} else {
$task = $tasks[$id];
}
// patch task
$task = array_merge($task, $request->only(['title', 'progress', 'status']));
// update task
$this->pushTask($task, $request->id);
}
public function getTasks()
{
$cache_key = 'user_tasks_' . $this->user_id;
return Cache::get($cache_key, []);
}
public function pushTask($task, $id = null)
{
$cache_key = 'user_tasks_' . $this->user_id;
$data = [
// 'user_id' => $this->user_id,
'done_at' => null,
'host_id' => $this->host_id
];
if ($id === null) {
$data['id'] = Uuid::uuid6()->toString();
} else {
$data['id'] = $id;
}
$task = array_merge($task, $data);
$tasks = $this->getTasks();
$tasks[] = $task;
Cache::put($cache_key, $tasks, 600);
return $task;
} }
} }

View File

@ -6,6 +6,7 @@
use Illuminate\Http\Request; use Illuminate\Http\Request;
use App\Models\Module\Module; use App\Models\Module\Module;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Http;
class HostController extends Controller class HostController extends Controller
{ {
@ -36,6 +37,33 @@ public function store(Request $request, Module $module)
'configuration' => 'required|json', 'configuration' => 'required|json',
]); ]);
$data = [
'name' => $request->name,
'module_id' => $module->id,
'configuration' => $request->configuration ?? [],
];
// if (!$data['confirm']) {
// $data['confirm'] = false;
// }
// $calc = $module->remotePost('/hosts', ['data' => $data]);
// $data['price'] = $calc[0]['data']['price'];
$host = Host::create($data);
return $this->created($host);
// if ($request->confirm) {
// $host = Host::create($data);
// return $this->created($host);
// } else {
// // return $this->apiResponse($calc[0]['data'], $calc[1]);
// }
// // post to module // // post to module
// $host = $module->hosts()->create([ // $host = $module->hosts()->create([
// 'name' => $request->name, // 'name' => $request->name,
@ -51,7 +79,6 @@ public function store(Request $request, Module $module)
*/ */
public function show() public function show()
{ {
} }
/** /**

View File

@ -0,0 +1,68 @@
<?php
namespace App\Http\Controllers\User;
use App\Models\User\Task;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class TaskController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$tasks = Task::user()->get();
return $this->success($tasks);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}

View File

@ -43,6 +43,11 @@ public function handle()
if (!$response->successful()) { if (!$response->successful()) {
$host->status = 'error'; $host->status = 'error';
} }
// dd($response);
$response_json = $response->json();
$host->price = $response_json['data']['price'];
$host->save(); $host->save();

View File

@ -7,12 +7,12 @@
use App\Models\WorkOrder\WorkOrder; use App\Models\WorkOrder\WorkOrder;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes; // use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
class Host extends Model class Host extends Model
{ {
use HasFactory, SoftDeletes; use HasFactory;
protected $table = 'hosts'; protected $table = 'hosts';
@ -96,7 +96,7 @@ public function cost($price = null)
if ($price !== null) { if ($price !== null) {
$this->managed_price = $price; $this->managed_price = $price;
} }
if ($this->managed_price) { if ($this->managed_price) {
$this->price = $this->managed_price; $this->price = $this->managed_price;
} }
@ -125,6 +125,9 @@ protected static function boot()
throw_if(!User::find($model->user_id), CommonException::class, 'user is not exists'); throw_if(!User::find($model->user_id), CommonException::class, 'user is not exists');
} }
// set price to 0
$model->price = 0;
// $model->load('module'); // $model->load('module');
// $model->module->load(['provider', 'module']); // $model->module->load(['provider', 'module']);
@ -139,7 +142,7 @@ protected static function boot()
// when delete // when delete
static::deleting(function ($model) { static::deleting(function ($model) {
return false; // return false;
dispatch(new \App\Jobs\Remote\Host($model, 'delete')); dispatch(new \App\Jobs\Remote\Host($model, 'delete'));
}); });

View File

@ -48,6 +48,17 @@ public function remote($func, $requests)
return [$json, $status]; return [$json, $status];
} }
public function remotePost($path = '', $data = [])
{
$http = Http::remote($this->api_token, $this->url);
$response = $http->post($path, $data);
$json = $response->json();
$status = $response->status();
return [$json, $status];
}
protected static function boot() protected static function boot()
{ {
parent::boot(); parent::boot();

View File

@ -2,10 +2,66 @@
namespace App\Models\User; namespace App\Models\User;
use Illuminate\Database\Eloquent\Factories\HasFactory; use App\Models\Host;
use App\Exceptions\CommonException;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Ramsey\Uuid\Uuid;
class Task extends Model class Task extends Model
{ {
use HasFactory; use HasFactory;
protected $fillable = [
'host_id',
'title',
'progress',
'status',
];
protected $casts = [
'id' => 'string',
'progress' => 'integer',
];
public $incrementing = false;
public function scopeUser($query) {
return $query->where('user_id', auth()->id());
}
public function host() {
return $this->belongsTo(Host::class);
}
// before create
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
// id 为 uuid
$model->id = Uuid::uuid4()->toString();
// host_id 和 user_id 至少存在一个
if (!$model->host_id && !$model->user_id) {
throw new CommonException('host_id 和 user_id 至少存在一个');
}
// if host_id
if ($model->host_id) {
$model->load('host');
// dd($model);
// dd($model->host_id);
// $host = Host::where('id', $model->host_id)->first();
// dd($host);
$model->user_id = $model->host->user_id;
}
});
}
} }

View File

@ -0,0 +1,55 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::dropIfExists('tasks');
Schema::create(
'tasks',
function (Blueprint $table) {
$table->uuid('id')->primary()->unique();
$table->string('title');
// progress (max 100)
$table->integer('progress')->default(0);
// status
$table->enum('status', ['pending', 'done', 'success', 'failed', 'error', 'cancelled', 'processing', 'need_operation'])->index();
// user id
$table->unsignedBigInteger('user_id')->index();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
// host id
$table->unsignedBigInteger('host_id')->index();
$table->foreign('host_id')->references('id')->on('hosts')->onDelete('cascade');
$table->timestamps();
}
);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
Schema::dropIfExists('tasks');
}
};

View File

@ -3,6 +3,7 @@
use App\Http\Controllers\User; use App\Http\Controllers\User;
use App\Http\Controllers\Remote; use App\Http\Controllers\Remote;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use App\Http\Controllers\User\TaskController;
Route::name('client.')->middleware(['api', 'auth:sanctum'])->group(function () { Route::name('client.')->middleware(['api', 'auth:sanctum'])->group(function () {
// Route::apiResource('users', Controllers\User\UserController::class); // Route::apiResource('users', Controllers\User\UserController::class);
@ -11,6 +12,10 @@
Route::apiResource('drops', User\DropController::class); Route::apiResource('drops', User\DropController::class);
Route::get('tasks', [TaskController::class, 'index']);
Route::apiResource('work-orders', User\WorkOrder\WorkOrderController::class); Route::apiResource('work-orders', User\WorkOrder\WorkOrderController::class);
Route::apiResource('work-orders.replies', User\WorkOrder\ReplyController::class); Route::apiResource('work-orders.replies', User\WorkOrder\ReplyController::class);

View File

@ -7,8 +7,9 @@
Route::apiResource('modules', Remote\ModuleController::class)->only(['index']); Route::apiResource('modules', Remote\ModuleController::class)->only(['index']);
Route::apiResource('servers', Remote\ServerController::class); Route::apiResource('servers', Remote\ServerController::class);
Route::apiResource('hosts', Remote\Host\HostController::class); Route::apiResource('hosts', Remote\Host\HostController::class);
// Route::patch('hosts/{host}', [Remote\Host\DropController::class, 'update']); Route::patch('hosts/{host}', [Remote\Host\DropController::class, 'update']);
Route::apiResource('hosts.tasks', Remote\Host\TaskController::class); // Route::patch('tasks', Remote\Host\TaskController::class);
Route::apiResource('tasks', Remote\Host\TaskController::class);
Route::apiResource('work-orders', Remote\WorkOrder\WorkOrderController::class); Route::apiResource('work-orders', Remote\WorkOrder\WorkOrderController::class);
Route::apiResource('work-orders.replies', Remote\WorkOrder\ReplyController::class); Route::apiResource('work-orders.replies', Remote\WorkOrder\ReplyController::class);