File size: 3,121 Bytes
ed41019
bfe88a9
ed41019
bfe88a9
 
 
 
ed41019
bfe88a9
 
 
 
 
ed41019
 
bfe88a9
ed41019
bfe88a9
 
ed41019
bfe88a9
 
ed41019
bfe88a9
 
ed41019
bfe88a9
 
ed41019
bfe88a9
ed41019
bfe88a9
 
ed41019
bfe88a9
 
 
ed41019
bfe88a9
 
ed41019
 
 
 
 
bfe88a9
 
ed41019
bfe88a9
 
ed41019
bfe88a9
 
 
ed41019
bfe88a9
 
ed41019
 
 
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
# app/api.py
from fastapi import APIRouter, HTTPException, status, Depends, WebSocket, WebSocketDisconnect
# Remove JSONResponse if not explicitly needed
import logging

from . import schemas, crud, auth, models
from .websocket import manager
# --- Use the new dependency ---
from .dependencies import get_required_current_user

router = APIRouter()
logger = logging.getLogger(__name__)

# --- (register and login endpoints remain the same) ---
@router.post("/register", ...) # Keep as is
async def register_user(user_in: schemas.UserCreate):
    # ... same logic ...
    existing_user = await crud.get_user_by_email(user_in.email)
    if existing_user:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered")
    hashed_password = auth.get_password_hash(user_in.password)
    user_id = await crud.create_user(user_in=user_in, hashed_password=hashed_password)
    notification_msg = schemas.Notification(email=user_in.email, message=f"New user registered: {user_in.email}").model_dump_json()
    await manager.broadcast(notification_msg, sender_id=user_id)
    created_user = await crud.get_user_by_id(user_id)
    if not created_user: raise HTTPException(status_code=500, detail="Failed to retrieve created user")
    return models.User(id=created_user.id, email=created_user.email)

@router.post("/login", ...) # Keep as is
async def login_for_access_token(form_data: schemas.UserLogin):
     # ... same logic ...
    user = await crud.get_user_by_email(form_data.email)
    if not user or not auth.verify_password(form_data.password, user.hashed_password):
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect email or password", headers={"WWW-Authenticate": "Bearer"})
    access_token = auth.create_session_token(user_id=user.id)
    return {"access_token": access_token, "token_type": "bearer"}

# --- UPDATE this endpoint ---
@router.get("/users/me", response_model=models.User)
async def read_users_me(current_user: models.User = Depends(get_required_current_user)):
    """
    Returns the current authenticated user's details based on the
    Authorization: Bearer <token> header.
    """
    # The dependency now handles getting the user from the header token
    return current_user

# --- (websocket endpoint remains the same) ---
@router.websocket("/ws/{user_id_token}")
async def websocket_endpoint(websocket: WebSocket, user_id_token: str):
    # ... same logic ...
    user_id = await auth.get_user_id_from_token(user_id_token)
    if user_id is None:
        logger.warning(f"WebSocket connection rejected: Invalid token {user_id_token}")
        await websocket.close(code=status.WS_1008_POLICY_VIOLATION); return
    await manager.connect(websocket, user_id)
    try:
        while True: data = await websocket.receive_text(); logger.debug(f"Received WS msg from {user_id}: {data}")
    except WebSocketDisconnect: manager.disconnect(websocket); logger.info(f"WebSocket disconnected for user {user_id}")
    except Exception as e: manager.disconnect(websocket); logger.error(f"WebSocket error for user {user_id}: {e}")