API 加入 room/heartbeat 20250522

This commit is contained in:
allen.yan 2025-05-22 12:21:31 +08:00
parent 3bbb1a5cc0
commit d2f5576f94
5 changed files with 69 additions and 13 deletions

View File

@ -4,7 +4,7 @@ namespace App\Http\Controllers;
use App\Http\Requests\SendRoomSwitchCommandRequest; use App\Http\Requests\SendRoomSwitchCommandRequest;
use App\Http\Requests\ReceiveRoomRegisterRequest; use App\Http\Requests\ReceiveRoomRegisterRequest;
use App\Http\Requests\ReceiveRoomStatusRequest; use App\Http\Requests\ReceiveRoomStatusDataRequest;
use App\Services\TcpSocketClient; use App\Services\TcpSocketClient;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@ -99,7 +99,7 @@ class RoomControlController extends Controller
} }
// 6. 更新包廂資訊 // 6. 更新包廂資訊
$room->internal_ip = $request->ip(); $room->internal_ip = $validated['room_ip'];
$room->port = 1000; // 預設值 $room->port = 1000; // 預設值
$room->is_online =1; $room->is_online =1;
$room->status = RoomStatus::Closed; $room->status = RoomStatus::Closed;
@ -112,15 +112,57 @@ class RoomControlController extends Controller
'room' => $room, 'room' => $room,
]); ]);
} }
public function StatusReport(ReceiveRoomStatusRequest $request)
/**
* @OA\Post(
* path="/api/room/heartbeat",
* summary="包廂心跳封包指令",
* description="",
* operationId="heartbeatRoomCommand",
* tags={"Room Control"},
* security={{"Authorization":{}}},
* @OA\RequestBody(
* required=true,
* @OA\JsonContent(ref="#/components/schemas/ReceiveRoomStatusDataRequest")
* ),
* @OA\Response(
* response=200,
* description="成功傳送指令並回傳 TCP 回應",
* @OA\JsonContent(
* allOf={
* @OA\Schema(ref="#/components/schemas/ApiResponse"),
* @OA\Schema(
* @OA\Property(property="data", ref="#/components/schemas/MachineStatus")
* )
* }
* )
* ),
* @OA\Response(
* response=401,
* description="Unauthorized",
* @OA\JsonContent(
* allOf={
* @OA\Schema(ref="#/components/schemas/ApiResponse"),
* @OA\Schema(
* @OA\Property(property="code", type="string", example="UNAUTHORIZED"),
* @OA\Property(property="message", type="string", example="Unauthorized"),
* @OA\Property(property="data", type="null")
* )
* }
* )
* ),
* @OA\Parameter(
* name="Accept",
* in="header",
* required=true,
* @OA\Schema(type="string", default="application/json")
* )
* )
*/
public function StatusReport(ReceiveRoomStatusDataRequest $request)
{ {
$data = $request->validate([ return ApiResponse::success([
'hostname' => 'required|string', 'data' => MachineStatus::create($request->validated()),
'ip' => 'required|string',
'cpu' => 'nullable|numeric',
'memory' => 'nullable|numeric',
'disk' => 'nullable|numeric',
'status' => 'required|string',
]); ]);
} }
/** /**

View File

@ -10,6 +10,7 @@ use Illuminate\Foundation\Http\FormRequest;
* required={"branch_id", "room_name", "email" ,"password"}, * required={"branch_id", "room_name", "email" ,"password"},
* @OA\Property(property="branch_id", type="integer", example="1"), * @OA\Property(property="branch_id", type="integer", example="1"),
* @OA\Property(property="room_name", type="string", example="102"), * @OA\Property(property="room_name", type="string", example="102"),
* @OA\Property(property="room_ip", type="string", example="192.168.1.1"),
* @OA\Property(property="email", type="string", example="XX@gmail.com"), * @OA\Property(property="email", type="string", example="XX@gmail.com"),
* @OA\Property(property="password", type="string", example="XXX"), * @OA\Property(property="password", type="string", example="XXX"),
* ) * )
@ -26,6 +27,7 @@ class ReceiveRoomRegisterRequest extends ApiRequest
return [ return [
'branch_id' => 'required|integer|exists:branches,id', 'branch_id' => 'required|integer|exists:branches,id',
'room_name' => 'required|string', 'room_name' => 'required|string',
'room_ip' => 'required|string',
'email' => 'required|email', 'email' => 'required|email',
'password' => 'required', 'password' => 'required',
]; ];

View File

@ -6,7 +6,7 @@ use Illuminate\Foundation\Http\FormRequest;
/** /**
* @OA\Schema( * @OA\Schema(
* schema="ReceiveRoomStatusRequest", * schema="ReceiveRoomStatusDataRequest",
* required={"hostname", "ip", "status"}, * required={"hostname", "ip", "status"},
* @OA\Property(property="hostname", type="string", example=""), * @OA\Property(property="hostname", type="string", example=""),
* @OA\Property(property="ip", type="string", example=""), * @OA\Property(property="ip", type="string", example=""),
@ -16,7 +16,7 @@ use Illuminate\Foundation\Http\FormRequest;
* @OA\Property(property="status", type="string", example=""), * @OA\Property(property="status", type="string", example=""),
* ) * )
*/ */
class ReceiveRoomStatusRequest extends ApiRequest class ReceiveRoomStatusDataRequest extends ApiRequest
{ {
/** /**
* Get the validation rules that apply to the request. * Get the validation rules that apply to the request.

View File

@ -4,6 +4,18 @@ namespace App\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
/**
* @OA\Schema(
* schema="MachineStatus",
* type="object",
* @OA\Property(property="hostname", type="string", example=""),
* @OA\Property(property="ip", type="string", example=""),
* @OA\Property(property="cpu", type="string"),
* @OA\Property(property="memory", type="string", example=""),
* @OA\Property(property="disk", type="string", example=""),
* @OA\Property(property="status", type="string", example=""),
* )
*/
class MachineStatus extends Model class MachineStatus extends Model
{ {
protected $fillable = [ protected $fillable = [

View File

@ -12,5 +12,5 @@ Route::post('/room/receiveRegister', [RoomControlController::class, 'receiveRegi
Route::middleware('auth:sanctum')->group(function () { Route::middleware('auth:sanctum')->group(function () {
Route::get('/profile', [AuthController::class, 'profile']); Route::get('/profile', [AuthController::class, 'profile']);
Route::post('/room/sendSwitch', [RoomControlController::class, 'sendSwitch']); Route::post('/room/sendSwitch', [RoomControlController::class, 'sendSwitch']);
Route::post('/room/system-status', [RoomControlController::class, 'StatusReport']); Route::post('/room/heartbeat', [RoomControlController::class, 'StatusReport']);
}); });