71 lines
1.9 KiB
Python
71 lines
1.9 KiB
Python
"""Socket.IO API endpoints for WebSocket management."""
|
|
|
|
from typing import Annotated
|
|
|
|
from fastapi import APIRouter, Depends
|
|
|
|
from app.core.dependencies import get_current_user
|
|
from app.models.user import User
|
|
from app.services.socket import socket_manager
|
|
|
|
router = APIRouter(prefix="/socket", tags=["socket"])
|
|
|
|
|
|
@router.get("/status")
|
|
async def get_socket_status(
|
|
current_user: Annotated[User, Depends(get_current_user)],
|
|
) -> dict[str, int | bool]:
|
|
"""Get current socket connection status."""
|
|
connected_users = socket_manager.get_connected_users()
|
|
|
|
return {
|
|
"connected": str(current_user.id) in connected_users,
|
|
"user_id": current_user.id,
|
|
"total_connected": len(connected_users),
|
|
}
|
|
|
|
|
|
@router.post("/send-message")
|
|
async def send_message_to_user(
|
|
target_user_id: int,
|
|
message: str,
|
|
current_user: Annotated[User, Depends(get_current_user)],
|
|
) -> dict[str, int | bool | str]:
|
|
"""Send a message to a specific user via WebSocket."""
|
|
success = await socket_manager.send_to_user(
|
|
str(target_user_id),
|
|
"user_message",
|
|
{
|
|
"from_user_id": current_user.id,
|
|
"from_user_name": current_user.name,
|
|
"message": message,
|
|
},
|
|
)
|
|
|
|
return {
|
|
"success": success,
|
|
"target_user_id": target_user_id,
|
|
"message": "Message sent" if success else "User not connected",
|
|
}
|
|
|
|
|
|
@router.post("/broadcast")
|
|
async def broadcast_message(
|
|
message: str,
|
|
current_user: Annotated[User, Depends(get_current_user)],
|
|
) -> dict[str, bool | str]:
|
|
"""Broadcast a message to all connected users."""
|
|
await socket_manager.broadcast_to_all(
|
|
"broadcast_message",
|
|
{
|
|
"from_user_id": current_user.id,
|
|
"from_user_name": current_user.name,
|
|
"message": message,
|
|
},
|
|
)
|
|
|
|
return {
|
|
"success": True,
|
|
"message": "Message broadcasted to all users",
|
|
}
|