File size: 2,626 Bytes
73d7d26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c89717a
 
 
 
 
 
 
 
fb8eda3
 
73d7d26
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Depends, HTTPException, status, Request
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.orm import Session
import json
import asyncio
from typing import Optional

from database import engine, get_db, Base
from models import User, Message, Conversation, ConversationMember, GroupMessage, Group, GroupMember
from auth import router as auth_router, get_current_user_ws, get_current_user
from chat import router as chat_router
from ws_manager import manager

Base.metadata.create_all(bind=engine)

app = FastAPI(title="SecureChat")

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

app.include_router(auth_router, prefix="/api/auth")
app.include_router(chat_router, prefix="/api/chat")

app.mount("/static", StaticFiles(directory="static"), name="static")

@app.get("/", response_class=HTMLResponse)
async def root():
    with open("static/index.html") as f:
        return f.read()

@app.websocket("/ws/{token}")
async def websocket_endpoint(websocket: WebSocket, token: str, db: Session = Depends(get_db)):
    user = await get_current_user_ws(token, db)
    if not user:
        await websocket.close(code=4001)
        return

    await manager.connect(websocket, user.id)
    try:
        while True:
            data = await websocket.receive_text()
            msg = json.loads(data)
            msg_type = msg.get("type")

            if msg_type == "dm":
                await manager.handle_dm(msg, user, db)
            elif msg_type == "group":
                await manager.handle_group(msg, user, db)
            elif msg_type == "typing":
                await manager.handle_typing(msg, user)
            elif msg_type == "read":
                await manager.handle_read(msg, user, db)
            elif msg_type == "call_offer":
                await manager.handle_call_offer(msg, user)
            elif msg_type == "call_answer":
                await manager.handle_call_answer(msg, user)
            elif msg_type == "ice_candidate":
                await manager.handle_ice_candidate(msg, user)
            elif msg_type == "call_end":
                await manager.handle_call_end(msg, user)
            elif msg_type == "video_toggle":
                await manager.handle_video_toggle(msg, user)

    except WebSocketDisconnect:
        manager.disconnect(user.id)
    except Exception as e:
        manager.disconnect(user.id)