diff --git a/app/Events/ServerEvent.php b/app/Events/ServerEvent.php new file mode 100644 index 0000000..f7cc540 --- /dev/null +++ b/app/Events/ServerEvent.php @@ -0,0 +1,29 @@ +servers = $servers; + } + + public function broadcastOn() + { + return new Channel('servers'); + } + + public function broadcastAs() + { + return 'servers'; + } +} diff --git a/app/Events/UserEvent.php b/app/Events/UserEvent.php index 0a7b81b..c744784 100644 --- a/app/Events/UserEvent.php +++ b/app/Events/UserEvent.php @@ -2,34 +2,52 @@ namespace App\Events; -use App\Models\User; -use Illuminate\Broadcasting\Channel; use Illuminate\Queue\SerializesModels; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow; -use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Auth; class UserEvent extends Event implements ShouldBroadcastNow { use SerializesModels; - public User $user; + public $user_id; + public string $type = 'ping'; + public $message; + public $module; /** * Create a new event instance. * * @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() { - return new PrivateChannel('users.' . $this->user->id); + return new PrivateChannel('users.' . $this->user_id); } public function broadcastAs() diff --git a/app/Http/Controllers/ServerController.php b/app/Http/Controllers/ServerController.php index 30a8478..36af186 100644 --- a/app/Http/Controllers/ServerController.php +++ b/app/Http/Controllers/ServerController.php @@ -2,12 +2,14 @@ namespace App\Http\Controllers; +use App\Events\UserEvent; use Illuminate\Http\Request; use Illuminate\Support\Facades\Cache; class ServerController extends Controller { - public function __invoke(Request $request) { + public function __invoke(Request $request) + { $servers = Cache::get('servers', []); // diff --git a/app/Jobs/Remote/FetchModule.php b/app/Jobs/Remote/FetchModule.php index 9a7aaba..6b6a59d 100644 --- a/app/Jobs/Remote/FetchModule.php +++ b/app/Jobs/Remote/FetchModule.php @@ -2,6 +2,7 @@ namespace App\Jobs\Remote; +use App\Events\ServerEvent; use App\Models\Module\Module; use Illuminate\Bus\Queueable; use Illuminate\Support\Facades\Log; @@ -12,8 +13,6 @@ use GuzzleHttp\Exception\ConnectException; use Illuminate\Contracts\Queue\ShouldQueue; -// use Illuminate\Contracts\Queue\ShouldBeUnique; - class FetchModule implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; @@ -77,6 +76,8 @@ public function handle() ] ]; }, $json['data']['servers'])); + + broadcast(new ServerEvent($servers)); } // $module->update([ // 'data' => $response->json() diff --git a/app/Jobs/Remote/WorkOrder/Reply.php b/app/Jobs/Remote/WorkOrder/Reply.php index 083a242..9de723c 100644 --- a/app/Jobs/Remote/WorkOrder/Reply.php +++ b/app/Jobs/Remote/WorkOrder/Reply.php @@ -2,15 +2,16 @@ namespace App\Jobs\Remote\WorkOrder; +use Log; +use App\Events\UserEvent; use Illuminate\Bus\Queueable; use Illuminate\Support\Facades\Http; use Illuminate\Queue\SerializesModels; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Contracts\Queue\ShouldQueue; // use Illuminate\Contracts\Queue\ShouldBeUnique; +use Illuminate\Queue\InteractsWithQueue; +use Illuminate\Contracts\Queue\ShouldQueue; use App\Models\WorkOrder\Reply as WorkOrderReply; -use Log; class Reply implements ShouldQueue { @@ -47,6 +48,9 @@ public function handle() if ($response->successful()) { $this->reply->is_pending = false; + + broadcast(new UserEvent($this->reply->workOrder->user_id, 'work-order.replied', $this->reply)); + } else { $this->reply->is_pending = true; } diff --git a/app/Jobs/Remote/WorkOrder/WorkOrder.php b/app/Jobs/Remote/WorkOrder/WorkOrder.php index 8a9b412..9753e99 100644 --- a/app/Jobs/Remote/WorkOrder/WorkOrder.php +++ b/app/Jobs/Remote/WorkOrder/WorkOrder.php @@ -2,12 +2,13 @@ namespace App\Jobs\Remote\WorkOrder; +use App\Events\UserEvent; use Illuminate\Bus\Queueable; use Illuminate\Support\Facades\Http; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Contracts\Queue\ShouldQueue; // use Illuminate\Contracts\Queue\ShouldBeUnique; +use Illuminate\Contracts\Queue\ShouldQueue; use App\Models\WorkOrder\WorkOrder as WorkOrderWorkOrder; class WorkOrder implements ShouldQueue @@ -46,6 +47,8 @@ public function handle() if (!$response->successful()) { $this->workOrder->status = 'error'; + } else { + broadcast(new UserEvent($this->workOrder->user_id, 'work-order.updated', $this->workOrder)); } $this->workOrder->save(); diff --git a/app/Models/Host.php b/app/Models/Host.php index 4063280..d7f7acc 100644 --- a/app/Models/Host.php +++ b/app/Models/Host.php @@ -2,10 +2,11 @@ namespace App\Models; +use App\Events\UserEvent; use App\Models\Transaction; use App\Models\Module\Module; -use App\Models\WorkOrder\WorkOrder; // use Illuminate\Database\Eloquent\SoftDeletes; +use App\Models\WorkOrder\WorkOrder; use Illuminate\Support\Facades\Cache; use Illuminate\Database\Eloquent\Model; 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); + broadcast(new UserEvent($this->user_id, 'balances.drops.reduced', $this->user)); + return true; } - /** - * 创建主机 - * - * 在此之后,所有的主机都将由 module 创建,并且主机的数据仅被用作计费。 - * - * 废弃 - * @deprecated - */ - // on create protected static function boot() { parent::boot(); - // static::creating(function ($model) { - // // if sanctum - // // 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::created(function ($model) { + broadcast(new UserEvent($model->user_id, 'hosts.created', $model)); + }); static::updating(function ($model) { if ($model->status == 'suspended') { @@ -181,6 +159,8 @@ protected static function boot() } else if ($model->status == 'running') { $model->suspended_at = null; } + + broadcast(new UserEvent($model->user_id, 'hosts.updating', $model)); }); // when Updated @@ -188,16 +168,18 @@ protected static function boot() dispatch(new \App\Jobs\Remote\Host($model, 'patch')); Cache::forget('user_hosts_' . $model->user_id); + + broadcast(new UserEvent($model->user_id, 'hosts.updated', $model)); }); - // // when delete + // // static::deleting(function ($model) { - // // return false; - - // // dispatch(new \App\Jobs\Remote\Host($model, 'delete')); + // broadcast(new UserEvent($model->user_id, 'hosts.deleting', $model)); // }); static::deleted(function ($model) { + broadcast(new UserEvent($model->user_id, 'hosts.deleted', $model)); + Cache::forget('user_hosts_' . $model->user_id); }); } diff --git a/app/Models/Server/Status.php b/app/Models/Server/Status.php deleted file mode 100644 index 4bda10b..0000000 --- a/app/Models/Server/Status.php +++ /dev/null @@ -1,38 +0,0 @@ -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.'); - } - }); - } -} diff --git a/app/Models/User/Task.php b/app/Models/User/Task.php index a2822f1..04e4493 100644 --- a/app/Models/User/Task.php +++ b/app/Models/User/Task.php @@ -3,11 +3,12 @@ namespace App\Models\User; use App\Models\Host; +use Ramsey\Uuid\Uuid; +use App\Events\UserEvent; use App\Exceptions\CommonException; +use Illuminate\Support\Facades\Cache; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Support\Facades\Cache; -use Ramsey\Uuid\Uuid; 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 static::updating(function ($model) { if ($model->progress == 100) { @@ -96,11 +103,16 @@ protected static function boot() // updated and delete static::updated(function ($model) { Cache::forget('user_tasks_' . $model->user_id); + + $model->load('host'); + broadcast(new UserEvent($model->user_id, 'tasks.updated', $model)); }); static::deleted(function ($model) { Cache::forget('user_tasks_' . $model->user_id); + + broadcast(new UserEvent($model->user_id, 'tasks.deleted', $model)); }); } } diff --git a/app/Models/WorkOrder/Reply.php b/app/Models/WorkOrder/Reply.php index 788f2b3..e66ea26 100644 --- a/app/Models/WorkOrder/Reply.php +++ b/app/Models/WorkOrder/Reply.php @@ -2,8 +2,9 @@ namespace App\Models\WorkOrder; -use App\Exceptions\CommonException; use App\Models\User; +use App\Events\UserEvent; +use App\Exceptions\CommonException; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; @@ -60,6 +61,8 @@ protected static function boot() if (auth('remote')->check()) { $model->user_id = null; $model->workOrder->status = 'replied'; + + broadcast(new UserEvent($model->user_id, 'work-order.replied', $model->workOrder)); } $model->workOrder->save(); diff --git a/routes/api.php b/routes/api.php index 9743b38..320e3b0 100644 --- a/routes/api.php +++ b/routes/api.php @@ -106,6 +106,4 @@ $router->delete('/{route:.*}/', $controller); }); - -$router->get('broadcasting/auth', ['uses' => 'BroadcastController@authenticate']); $router->post('broadcasting/auth', ['uses' => 'BroadcastController@authenticate']); diff --git a/routes/channels.php b/routes/channels.php index 3a035ce..2136020 100644 --- a/routes/channels.php +++ b/routes/channels.php @@ -5,3 +5,7 @@ Broadcast::channel('users.{userId}', function ($user, $userId) { return (int) $user->id === (int) $userId; }); + +Broadcast::channel('servers', function () { + return true; +});