Add websocket endpoint

This commit is contained in:
2025-08-18 15:42:22 +03:00
Unverified
parent b9d89a7ff4
commit 4e54b8bec2
2 changed files with 45 additions and 21 deletions
+2 -1
View File
@@ -2,4 +2,5 @@ PyJWT>=2.8.0
fastapi[standard]>=0.116.1 fastapi[standard]>=0.116.1
pydantic>=2.11.7 pydantic>=2.11.7
sqlalchemy>=2.0.43 sqlalchemy>=2.0.43
bcrypt>=4.3.0 bcrypt>=4.3.0
websockets>=15.0.1
+43 -20
View File
@@ -1,16 +1,34 @@
from datetime import datetime from datetime import datetime
from mailbox import Message from fastapi import APIRouter, Depends, HTTPException, WebSocket
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from dependencies import get_current_user, get_db from dependencies import get_current_user, get_db
from models import SendMessageRequest from models import Message, SendMessageRequest
router = APIRouter() router = APIRouter()
async def get_messages_inner(current_user: dict, db: Session):
messages = db.query(Message).order_by(Message.timestamp.asc()).all()
messages_data = []
for msg in messages:
messages_data.append({
"id": msg.id,
"content": msg.content,
"timestamp": msg.timestamp.isoformat(),
"is_author": msg.user_id == current_user["user_id"],
"is_read": msg.is_read,
"username": msg.author.username
})
return {
"status": "success",
"messages": messages_data
}
@router.post("/send_message") @router.post("/send_message")
def send_message( async def send_message(
request: SendMessageRequest, request: SendMessageRequest,
current_user: dict = Depends(get_current_user), current_user: dict = Depends(get_current_user),
db: Session = Depends(get_db) db: Session = Depends(get_db)
@@ -35,24 +53,29 @@ def send_message(
@router.get("/get_messages") @router.get("/get_messages")
def get_messages( async def get_messages(
current_user: dict = Depends(get_current_user), current_user: dict = Depends(get_current_user),
db: Session = Depends(get_db) db: Session = Depends(get_db)
): ):
messages = db.query(Message).order_by(Message.timestamp.asc()).all() return await get_messages_inner(current_user, db)
messages_data = []
for msg in messages:
messages_data.append({
"id": msg.id,
"content": msg.content,
"timestamp": msg.timestamp.isoformat(),
"is_author": msg.user_id == current_user["user_id"],
"is_read": msg.is_read,
"username": msg.author.username
})
return { @router.websocket("/chat/ws")
"status": "success", async def messaging(websocket: WebSocket):
"messages": messages_data await websocket.accept()
}
while True:
data = await websocket.receive_json()
if data.type == "ping":
await websocket.send_json({"type": "ping", "data": {"status": "success"}})
elif data.type == "getMessages":
try:
current_user = get_current_user()
db = next(get_db())
await websocket.send_json({"type": "getMessages", "data": await get_messages_inner(current_user, db)})
except HTTPException as e:
await websocket.send_json({"type": "getMessages", "error": {"code": e.status_code, "detail": e.detail}})
else:
await websocket.send_json({"type": data.type, "error": {"code": 400, "detail": "Invalid type"}})