增加 基本 Event

This commit is contained in:
iVampireSP.com 2022-09-22 14:00:03 +08:00
parent 4f5073e6e1
commit 9ccc08c2b7
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
12 changed files with 108 additions and 90 deletions

View File

@ -0,0 +1,29 @@
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class ServerEvent extends Event implements ShouldBroadcast
{
public array $servers;
public string $type = 'servers.updated';
public function __construct($servers)
{
$this->servers = $servers;
}
public function broadcastOn()
{
return new Channel('servers');
}
public function broadcastAs()
{
return 'servers';
}
}

View File

@ -2,34 +2,52 @@
namespace App\Events; namespace App\Events;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Auth;
class UserEvent extends Event implements ShouldBroadcastNow class UserEvent extends Event implements ShouldBroadcastNow
{ {
use SerializesModels; use SerializesModels;
public User $user; public $user_id;
public string $type = 'ping';
public $message;
public $module;
/** /**
* Create a new event instance. * Create a new event instance.
* *
* @return void * @return void
*/ */
public function __construct(User $user) public function __construct($user_id, $type, $message)
{ {
// //
$this->user = $user; $this->user_id = $user_id;
$this->type = $type;
// if message is model
if (is_object($message)) {
$this->message = $message->toArray();
} else {
$this->message = $message;
}
// if (Auth::check()) {
if (Auth::guard('remote')->check()) {
$this->module = Auth::guard('remote')->user();
} else {
$this->module = null;
}
} }
public function broadcastOn() public function broadcastOn()
{ {
return new PrivateChannel('users.' . $this->user->id); return new PrivateChannel('users.' . $this->user_id);
} }
public function broadcastAs() public function broadcastAs()

View File

@ -2,12 +2,14 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Events\UserEvent;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
class ServerController extends Controller class ServerController extends Controller
{ {
public function __invoke(Request $request) { public function __invoke(Request $request)
{
$servers = Cache::get('servers', []); $servers = Cache::get('servers', []);
// //

View File

@ -2,6 +2,7 @@
namespace App\Jobs\Remote; namespace App\Jobs\Remote;
use App\Events\ServerEvent;
use App\Models\Module\Module; use App\Models\Module\Module;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
@ -12,8 +13,6 @@
use GuzzleHttp\Exception\ConnectException; use GuzzleHttp\Exception\ConnectException;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
// use Illuminate\Contracts\Queue\ShouldBeUnique;
class FetchModule implements ShouldQueue class FetchModule implements ShouldQueue
{ {
use InteractsWithQueue, Queueable, SerializesModels; use InteractsWithQueue, Queueable, SerializesModels;
@ -77,6 +76,8 @@ public function handle()
] ]
]; ];
}, $json['data']['servers'])); }, $json['data']['servers']));
broadcast(new ServerEvent($servers));
} }
// $module->update([ // $module->update([
// 'data' => $response->json() // 'data' => $response->json()

View File

@ -2,15 +2,16 @@
namespace App\Jobs\Remote\WorkOrder; namespace App\Jobs\Remote\WorkOrder;
use Log;
use App\Events\UserEvent;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
// use Illuminate\Contracts\Queue\ShouldBeUnique; // use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\WorkOrder\Reply as WorkOrderReply; use App\Models\WorkOrder\Reply as WorkOrderReply;
use Log;
class Reply implements ShouldQueue class Reply implements ShouldQueue
{ {
@ -47,6 +48,9 @@ public function handle()
if ($response->successful()) { if ($response->successful()) {
$this->reply->is_pending = false; $this->reply->is_pending = false;
broadcast(new UserEvent($this->reply->workOrder->user_id, 'work-order.replied', $this->reply));
} else { } else {
$this->reply->is_pending = true; $this->reply->is_pending = true;
} }

View File

@ -2,12 +2,13 @@
namespace App\Jobs\Remote\WorkOrder; namespace App\Jobs\Remote\WorkOrder;
use App\Events\UserEvent;
use Illuminate\Bus\Queueable; use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
// use Illuminate\Contracts\Queue\ShouldBeUnique; // use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\WorkOrder\WorkOrder as WorkOrderWorkOrder; use App\Models\WorkOrder\WorkOrder as WorkOrderWorkOrder;
class WorkOrder implements ShouldQueue class WorkOrder implements ShouldQueue
@ -46,6 +47,8 @@ public function handle()
if (!$response->successful()) { if (!$response->successful()) {
$this->workOrder->status = 'error'; $this->workOrder->status = 'error';
} else {
broadcast(new UserEvent($this->workOrder->user_id, 'work-order.updated', $this->workOrder));
} }
$this->workOrder->save(); $this->workOrder->save();

View File

@ -2,10 +2,11 @@
namespace App\Models; namespace App\Models;
use App\Events\UserEvent;
use App\Models\Transaction; use App\Models\Transaction;
use App\Models\Module\Module; use App\Models\Module\Module;
use App\Models\WorkOrder\WorkOrder;
// use Illuminate\Database\Eloquent\SoftDeletes; // use Illuminate\Database\Eloquent\SoftDeletes;
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 App\Exceptions\User\BalanceNotEnoughException; use App\Exceptions\User\BalanceNotEnoughException;
@ -139,41 +140,18 @@ public function cost($price = null, $auto = true)
$transaction->reduceDrops($this->user_id, $this->id, $this->module_id, $auto, $this->price); $transaction->reduceDrops($this->user_id, $this->id, $this->module_id, $auto, $this->price);
broadcast(new UserEvent($this->user_id, 'balances.drops.reduced', $this->user));
return true; return true;
} }
/**
* 创建主机
*
* 在此之后,所有的主机都将由 module 创建,并且主机的数据仅被用作计费。
*
* 废弃
* @deprecated
*/
// on create
protected static function boot() protected static function boot()
{ {
parent::boot(); parent::boot();
// static::creating(function ($model) { static::created(function ($model) {
// // if sanctum broadcast(new UserEvent($model->user_id, 'hosts.created', $model));
// // if (auth('api')->check()) { });
// // $model->user_id = auth('api')->id();
// // } else {
// // // if user_id is null
// // // check user_id is 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->module->load(['provider', 'module']);
// // add to queue
// });
static::updating(function ($model) { static::updating(function ($model) {
if ($model->status == 'suspended') { if ($model->status == 'suspended') {
@ -181,6 +159,8 @@ protected static function boot()
} else if ($model->status == 'running') { } else if ($model->status == 'running') {
$model->suspended_at = null; $model->suspended_at = null;
} }
broadcast(new UserEvent($model->user_id, 'hosts.updating', $model));
}); });
// when Updated // when Updated
@ -188,16 +168,18 @@ protected static function boot()
dispatch(new \App\Jobs\Remote\Host($model, 'patch')); dispatch(new \App\Jobs\Remote\Host($model, 'patch'));
Cache::forget('user_hosts_' . $model->user_id); Cache::forget('user_hosts_' . $model->user_id);
broadcast(new UserEvent($model->user_id, 'hosts.updated', $model));
}); });
// // when delete //
// static::deleting(function ($model) { // static::deleting(function ($model) {
// // return false; // broadcast(new UserEvent($model->user_id, 'hosts.deleting', $model));
// // dispatch(new \App\Jobs\Remote\Host($model, 'delete'));
// }); // });
static::deleted(function ($model) { static::deleted(function ($model) {
broadcast(new UserEvent($model->user_id, 'hosts.deleted', $model));
Cache::forget('user_hosts_' . $model->user_id); Cache::forget('user_hosts_' . $model->user_id);
}); });
} }

View File

@ -1,38 +0,0 @@
<?php
namespace App\Models\Server;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Status extends Model
{
use HasFactory;
protected $table = 'server_status';
protected $fillable = [
'name',
'ip',
'status',
'module_id',
];
// scope
public function scopeModule($query)
{
return $query->where('module_id', auth('remote')->id());
}
// when update, check owner
protected static function boot()
{
parent::boot();
static::updating(function ($model) {
if ($model->module_id !== auth('remote')->id()) {
abort(403, 'Unauthorized action.');
}
});
}
}

View File

@ -3,11 +3,12 @@
namespace App\Models\User; namespace App\Models\User;
use App\Models\Host; use App\Models\Host;
use Ramsey\Uuid\Uuid;
use App\Events\UserEvent;
use App\Exceptions\CommonException; use App\Exceptions\CommonException;
use Illuminate\Support\Facades\Cache;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Support\Facades\Cache;
use Ramsey\Uuid\Uuid;
class Task extends Model class Task extends Model
{ {
@ -86,6 +87,12 @@ protected static function boot()
} }
}); });
// created
static::created(function ($model) {
$model->load('host');
broadcast(new UserEvent($model->user_id, 'tasks.created', $model));
});
// updateing // updateing
static::updating(function ($model) { static::updating(function ($model) {
if ($model->progress == 100) { if ($model->progress == 100) {
@ -96,11 +103,16 @@ protected static function boot()
// updated and delete // updated and delete
static::updated(function ($model) { static::updated(function ($model) {
Cache::forget('user_tasks_' . $model->user_id); Cache::forget('user_tasks_' . $model->user_id);
$model->load('host');
broadcast(new UserEvent($model->user_id, 'tasks.updated', $model));
}); });
static::deleted(function ($model) { static::deleted(function ($model) {
Cache::forget('user_tasks_' . $model->user_id); Cache::forget('user_tasks_' . $model->user_id);
broadcast(new UserEvent($model->user_id, 'tasks.deleted', $model));
}); });
} }
} }

View File

@ -2,8 +2,9 @@
namespace App\Models\WorkOrder; namespace App\Models\WorkOrder;
use App\Exceptions\CommonException;
use App\Models\User; use App\Models\User;
use App\Events\UserEvent;
use App\Exceptions\CommonException;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
@ -60,6 +61,8 @@ protected static function boot()
if (auth('remote')->check()) { if (auth('remote')->check()) {
$model->user_id = null; $model->user_id = null;
$model->workOrder->status = 'replied'; $model->workOrder->status = 'replied';
broadcast(new UserEvent($model->user_id, 'work-order.replied', $model->workOrder));
} }
$model->workOrder->save(); $model->workOrder->save();

View File

@ -106,6 +106,4 @@
$router->delete('/{route:.*}/', $controller); $router->delete('/{route:.*}/', $controller);
}); });
$router->get('broadcasting/auth', ['uses' => 'BroadcastController@authenticate']);
$router->post('broadcasting/auth', ['uses' => 'BroadcastController@authenticate']); $router->post('broadcasting/auth', ['uses' => 'BroadcastController@authenticate']);

View File

@ -5,3 +5,7 @@
Broadcast::channel('users.{userId}', function ($user, $userId) { Broadcast::channel('users.{userId}', function ($user, $userId) {
return (int) $user->id === (int) $userId; return (int) $user->id === (int) $userId;
}); });
Broadcast::channel('servers', function () {
return true;
});