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)
{
// test
$handle = new \App\Jobs\Remote\PushHost();
$handle->handle();
// $handle = new \App\Jobs\Remote\PushHost();
// $handle->handle();
$handle = new \App\Jobs\Remote\PushWorkOrder();
$handle->handle();
// $handle = new \App\Jobs\Remote\PushWorkOrder();
// $handle->handle();
// if logged in
if (Auth::check()) {

View File

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

View File

@ -2,35 +2,30 @@
namespace App\Http\Controllers\Remote\Host;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use App\Models\Host;
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
{
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.
*
* @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([
'host_id' => 'required|exists:hosts,id',
'title' => 'required|max:255',
'progress' => 'sometimes|integer|max:100',
'status' => 'required|in:pending,processing,need_operation,done,success,failed,error,canceled',
]);
return $this->created($this->pushTask([
'title' => $request->title,
'progress' => $request->progress,
'status' => $request->status,
]));
$task = Task::create($request->all());
return $this->success($task);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @param Task $task
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
public function update(Request $request, Task $task)
{
//
$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
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;
return $this->updated($task);
}
}

View File

@ -6,6 +6,7 @@
use Illuminate\Http\Request;
use App\Models\Module\Module;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Http;
class HostController extends Controller
{
@ -36,6 +37,33 @@ public function store(Request $request, Module $module)
'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
// $host = $module->hosts()->create([
// 'name' => $request->name,
@ -51,7 +79,6 @@ public function store(Request $request, Module $module)
*/
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

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

View File

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

View File

@ -48,6 +48,17 @@ public function remote($func, $requests)
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()
{
parent::boot();

View File

@ -2,10 +2,66 @@
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\Factories\HasFactory;
use Ramsey\Uuid\Uuid;
class Task extends Model
{
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\Remote;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\User\TaskController;
Route::name('client.')->middleware(['api', 'auth:sanctum'])->group(function () {
// Route::apiResource('users', Controllers\User\UserController::class);
@ -11,6 +12,10 @@
Route::apiResource('drops', User\DropController::class);
Route::get('tasks', [TaskController::class, 'index']);
Route::apiResource('work-orders', User\WorkOrder\WorkOrderController::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('servers', Remote\ServerController::class);
Route::apiResource('hosts', Remote\Host\HostController::class);
// Route::patch('hosts/{host}', [Remote\Host\DropController::class, 'update']);
Route::apiResource('hosts.tasks', Remote\Host\TaskController::class);
Route::patch('hosts/{host}', [Remote\Host\DropController::class, 'update']);
// 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.replies', Remote\WorkOrder\ReplyController::class);