Files
laravel_swoole/app/Http/Controllers/System/WebSocket.php
2026-02-08 22:38:13 +08:00

396 lines
11 KiB
PHP

<?php
namespace App\Http\Controllers\System;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
use App\Services\WebSocket\WebSocketService;
/**
* WebSocket Controller
*
* Provides API endpoints for WebSocket operations
*/
class WebSocket extends Controller
{
/**
* @var WebSocketService
*/
protected $webSocketService;
/**
* WebSocket constructor
*/
public function __construct()
{
$this->webSocketService = app(WebSocketService::class);
}
/**
* Get online user count
*
* @return JsonResponse
*/
public function getOnlineCount(): JsonResponse
{
$count = $this->webSocketService->getOnlineUserCount();
return response()->json([
'code' => 200,
'message' => 'success',
'data' => [
'online_count' => $count
]
]);
}
/**
* Get online user IDs
*
* @return JsonResponse
*/
public function getOnlineUsers(): JsonResponse
{
$userIds = $this->webSocketService->getOnlineUserIds();
return response()->json([
'code' => 200,
'message' => 'success',
'data' => [
'user_ids' => $userIds,
'count' => count($userIds)
]
]);
}
/**
* Check if a user is online
*
* @param Request $request
* @return JsonResponse
*/
public function checkOnline(Request $request): JsonResponse
{
$request->validate([
'user_id' => 'required|integer'
]);
$userId = $request->input('user_id');
$isOnline = $this->webSocketService->isUserOnline($userId);
return response()->json([
'code' => 200,
'message' => 'success',
'data' => [
'user_id' => $userId,
'is_online' => $isOnline
]
]);
}
/**
* Send message to a specific user
*
* @param Request $request
* @return JsonResponse
*/
public function sendToUser(Request $request): JsonResponse
{
$request->validate([
'user_id' => 'required|integer',
'type' => 'required|string',
'data' => 'required|array'
]);
$userId = $request->input('user_id');
$type = $request->input('type');
$data = $request->input('data');
$message = [
'type' => $type,
'data' => $data
];
$sent = $this->webSocketService->sendToUser($userId, $message);
return response()->json([
'code' => $sent ? 200 : 404,
'message' => $sent ? 'Message sent successfully' : 'User is not online',
'data' => [
'user_id' => $userId,
'sent' => $sent
]
], $sent ? 200 : 404);
}
/**
* Send message to multiple users
*
* @param Request $request
* @return JsonResponse
*/
public function sendToUsers(Request $request): JsonResponse
{
$request->validate([
'user_ids' => 'required|array',
'user_ids.*' => 'integer',
'type' => 'required|string',
'data' => 'required|array'
]);
$userIds = $request->input('user_ids');
$type = $request->input('type');
$data = $request->input('data');
$message = [
'type' => $type,
'data' => $data
];
$sentTo = $this->webSocketService->sendToUsers($userIds, $message);
return response()->json([
'code' => 200,
'message' => 'success',
'data' => [
'total_users' => count($userIds),
'sent_to' => $sentTo,
'failed' => count($userIds) - count($sentTo)
]
]);
}
/**
* Broadcast message to all users
*
* @param Request $request
* @return JsonResponse
*/
public function broadcast(Request $request): JsonResponse
{
$request->validate([
'type' => 'required|string',
'data' => 'required|array',
'exclude_user_id' => 'nullable|integer'
]);
$type = $request->input('type');
$data = $request->input('data');
$excludeUserId = $request->input('exclude_user_id');
$message = [
'type' => $type,
'data' => $data
];
$count = $this->webSocketService->broadcast($message, $excludeUserId);
return response()->json([
'code' => 200,
'message' => 'Broadcast sent successfully',
'data' => [
'sent_to' => $count,
'exclude_user_id' => $excludeUserId
]
]);
}
/**
* Send message to a channel
*
* @param Request $request
* @return JsonResponse
*/
public function sendToChannel(Request $request): JsonResponse
{
$request->validate([
'channel' => 'required|string',
'type' => 'required|string',
'data' => 'required|array'
]);
$channel = $request->input('channel');
$type = $request->input('type');
$data = $request->input('data');
$message = [
'type' => $type,
'data' => $data
];
$count = $this->webSocketService->sendToChannel($channel, $message);
return response()->json([
'code' => 200,
'message' => 'Message sent to channel successfully',
'data' => [
'channel' => $channel,
'sent_to' => $count
]
]);
}
/**
* Send system notification
*
* @param Request $request
* @return JsonResponse
*/
public function sendNotification(Request $request): JsonResponse
{
$request->validate([
'title' => 'required|string|max:255',
'message' => 'required|string|max:1000',
'type' => 'nullable|string|in:info,success,warning,error',
'extra_data' => 'nullable|array'
]);
$title = $request->input('title');
$message = $request->input('message');
$type = $request->input('type', 'info');
$extraData = $request->input('extra_data', []);
$count = $this->webSocketService->sendSystemNotification($title, $message, $type, $extraData);
return response()->json([
'code' => 200,
'message' => 'Notification sent successfully',
'data' => [
'sent_to' => $count
]
]);
}
/**
* Send notification to specific users
*
* @param Request $request
* @return JsonResponse
*/
public function sendNotificationToUsers(Request $request): JsonResponse
{
$request->validate([
'user_ids' => 'required|array',
'user_ids.*' => 'integer',
'title' => 'required|string|max:255',
'message' => 'required|string|max:1000',
'type' => 'nullable|string|in:info,success,warning,error',
'extra_data' => 'nullable|array'
]);
$userIds = $request->input('user_ids');
$title = $request->input('title');
$message = $request->input('message');
$type = $request->input('type', 'info');
$extraData = $request->input('extra_data', []);
$sentTo = $this->webSocketService->sendNotificationToUsers($userIds, $title, $message, $type, $extraData);
return response()->json([
'code' => 200,
'message' => 'Notification sent successfully',
'data' => [
'total_users' => count($userIds),
'sent_to' => $sentTo,
'failed' => count($userIds) - count($sentTo)
]
]);
}
/**
* Push data update
*
* @param Request $request
* @return JsonResponse
*/
public function pushDataUpdate(Request $request): JsonResponse
{
$request->validate([
'user_ids' => 'required|array',
'user_ids.*' => 'integer',
'resource_type' => 'required|string',
'action' => 'required|string|in:create,update,delete',
'data' => 'required|array'
]);
$userIds = $request->input('user_ids');
$resourceType = $request->input('resource_type');
$action = $request->input('action');
$data = $request->input('data');
$sentTo = $this->webSocketService->pushDataUpdate($userIds, $resourceType, $action, $data);
return response()->json([
'code' => 200,
'message' => 'Data update pushed successfully',
'data' => [
'resource_type' => $resourceType,
'action' => $action,
'total_users' => count($userIds),
'sent_to' => $sentTo,
'failed' => count($userIds) - count($sentTo)
]
]);
}
/**
* Push data update to channel
*
* @param Request $request
* @return JsonResponse
*/
public function pushDataUpdateToChannel(Request $request): JsonResponse
{
$request->validate([
'channel' => 'required|string',
'resource_type' => 'required|string',
'action' => 'required|string|in:create,update,delete',
'data' => 'required|array'
]);
$channel = $request->input('channel');
$resourceType = $request->input('resource_type');
$action = $request->input('action');
$data = $request->input('data');
$count = $this->webSocketService->pushDataUpdateToChannel($channel, $resourceType, $action, $data);
return response()->json([
'code' => 200,
'message' => 'Data update pushed to channel successfully',
'data' => [
'channel' => $channel,
'resource_type' => $resourceType,
'action' => $action,
'sent_to' => $count
]
]);
}
/**
* Disconnect a user from WebSocket
*
* @param Request $request
* @return JsonResponse
*/
public function disconnectUser(Request $request): JsonResponse
{
$request->validate([
'user_id' => 'required|integer'
]);
$userId = $request->input('user_id');
$disconnected = $this->webSocketService->disconnectUser($userId);
return response()->json([
'code' => $disconnected ? 200 : 404,
'message' => $disconnected ? 'User disconnected successfully' : 'User is not online',
'data' => [
'user_id' => $userId,
'disconnected' => $disconnected
]
], $disconnected ? 200 : 404);
}
}