Files
My-KOPKB/be/app/Http/Controllers/OnlineUsersController.php
T
ISMAIL MASSERAN 94ecbe5887 first init
2026-06-08 11:37:14 +08:00

184 lines
5.7 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Services\OnlineUsersService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class OnlineUsersController extends Controller
{
protected OnlineUsersService $onlineUsersService;
public function __construct(OnlineUsersService $onlineUsersService)
{
$this->onlineUsersService = $onlineUsersService;
}
/**
* Get list of online users
*
* @param Request $request
* @return JsonResponse
*/
public function index(Request $request): JsonResponse
{
try {
$timeoutMinutes = 5; // Fixed to 5 minutes
$onlineUsers = $this->onlineUsersService->getOnlineUsers($timeoutMinutes);
return response()->json([
'success' => true,
'data' => $onlineUsers,
'meta' => [
'timeout_minutes' => $timeoutMinutes,
'total_online' => $onlineUsers->count(),
'timestamp' => now()->toISOString()
],
'message' => 'Online users retrieved successfully.'
]);
} catch (\Exception $e) {
Log::error('Error fetching online users: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Failed to retrieve online users.',
'error' => config('app.debug') ? $e->getMessage() : 'Internal server error'
], 500);
}
}
/**
* Get online users count
*
* @param Request $request
* @return JsonResponse
*/
public function count(Request $request): JsonResponse
{
try {
$timeoutMinutes = 5; // Fixed to 5 minutes
$count = $this->onlineUsersService->getOnlineUsersCount($timeoutMinutes);
return response()->json([
'success' => true,
'data' => [
'count' => $count,
'timeout_minutes' => $timeoutMinutes
],
'message' => 'Online users count retrieved successfully.'
]);
} catch (\Exception $e) {
Log::error('Error fetching online users count: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Failed to retrieve online users count.',
'error' => config('app.debug') ? $e->getMessage() : 'Internal server error'
], 500);
}
}
/**
* Get online users statistics
*
* @return JsonResponse
*/
public function stats(): JsonResponse
{
try {
$stats = $this->onlineUsersService->getOnlineUsersStats();
return response()->json([
'success' => true,
'data' => $stats,
'message' => 'Online users statistics retrieved successfully.'
]);
} catch (\Exception $e) {
Log::error('Error fetching online users stats: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Failed to retrieve online users statistics.',
'error' => config('app.debug') ? $e->getMessage() : 'Internal server error'
], 500);
}
}
/**
* Get current user's session information
*
* @param Request $request
* @return JsonResponse
*/
public function mySession(Request $request): JsonResponse
{
try {
$user = $request->user();
if (!$user) {
return response()->json([
'success' => false,
'message' => 'User not authenticated.'
], 401);
}
$sessionInfo = $this->onlineUsersService->getUserSessionInfo($user->id);
if (!$sessionInfo) {
return response()->json([
'success' => false,
'message' => 'No active session found.'
], 404);
}
return response()->json([
'success' => true,
'data' => $sessionInfo,
'message' => 'Session information retrieved successfully.'
]);
} catch (\Exception $e) {
Log::error('Error fetching user session info: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Failed to retrieve session information.',
'error' => config('app.debug') ? $e->getMessage() : 'Internal server error'
], 500);
}
}
/**
* Clear online users cache (admin only)
*
* @return JsonResponse
*/
public function clearCache(): JsonResponse
{
try {
$this->onlineUsersService->clearCache();
return response()->json([
'success' => true,
'message' => 'Online users cache cleared successfully.'
]);
} catch (\Exception $e) {
Log::error('Error clearing online users cache: ' . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Failed to clear cache.',
'error' => config('app.debug') ? $e->getMessage() : 'Internal server error'
], 500);
}
}
}