From a5a501e3648f18e13163ab199fe7aadea5b62168 Mon Sep 17 00:00:00 2001 From: denis0001-dev Date: Mon, 18 Aug 2025 19:44:33 +0300 Subject: [PATCH] Fix everything --- backend/dependencies.py | 2 +- backend/routes/account.py | 26 +++++++++++++++++--------- backend/routes/messaging.py | 23 +++++++++++------------ frontend/src/auth.ts | 2 +- frontend/src/main.ts | 6 +++--- frontend/src/types.ts | 7 +++++-- 6 files changed, 38 insertions(+), 28 deletions(-) diff --git a/backend/dependencies.py b/backend/dependencies.py index 4ac1da5..7dd7199 100644 --- a/backend/dependencies.py +++ b/backend/dependencies.py @@ -35,4 +35,4 @@ def get_current_user( detail="User not found", headers={"WWW-Authenticate": "Bearer"}, ) - return {"user_id": user.id, "username": user.username} \ No newline at end of file + return user \ No newline at end of file diff --git a/backend/routes/account.py b/backend/routes/account.py index ff1a4e7..32a822a 100644 --- a/backend/routes/account.py +++ b/backend/routes/account.py @@ -2,6 +2,7 @@ from datetime import datetime from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session +from routes.messaging import convert_message from dependencies import get_current_user, get_db from models import LoginRequest, RegisterRequest, User from utils import create_token, get_password_hash, verify_password @@ -9,11 +10,20 @@ from validation import is_valid_password, is_valid_username router = APIRouter() +def convert_user(user: User) -> dict: + return { + "id": user.id, + "created_at": user.created_at.isoformat(), + "last_seen": user.last_seen.isoformat(), + "online": user.online, + "username": user.username + } + @router.get("/check_auth") -def check_auth(current_user: dict = Depends(get_current_user)): +def check_auth(current_user: User = Depends(get_current_user)): return { "authenticated": True, - "username": current_user["username"] + "username": current_user.username } @@ -37,7 +47,7 @@ def login(request: LoginRequest, db: Session = Depends(get_db)): "status": "success", "message": "Login successful", "token": token, - "username": user.username + "user": convert_user(user) } @@ -92,14 +102,12 @@ def register(request: RegisterRequest, db: Session = Depends(get_db)): @router.get("/logout") def logout( - current_user: dict = Depends(get_current_user), + current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): - user = db.query(User).filter(User.id == current_user["user_id"]).first() - if user: - user.online = False - user.last_seen = datetime.now() - db.commit() + current_user.online = False + current_user.last_seen = datetime.now() + db.commit() return { "status": "success", diff --git a/backend/routes/messaging.py b/backend/routes/messaging.py index 13d63f3..6ec86d1 100644 --- a/backend/routes/messaging.py +++ b/backend/routes/messaging.py @@ -4,34 +4,33 @@ from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisco from fastapi.security import HTTPAuthorizationCredentials from sqlalchemy.orm import Session from dependencies import get_current_user, get_db -from models import Message, SendMessageRequest +from models import Message, SendMessageRequest, User router = APIRouter() -def convert_message(msg: Message, current_user: dict) -> dict: +def convert_message(msg: Message) -> dict: return { "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 } -async def get_messages_inner(current_user: dict, db: Session): +async def get_messages_inner(db: Session): messages = db.query(Message).order_by(Message.timestamp.asc()).all() messages_data = [] for msg in messages: - messages_data.append(convert_message(msg, current_user)) + messages_data.append(convert_message(msg)) return { "status": "success", "messages": messages_data } -async def send_message_inner(request: SendMessageRequest, current_user: dict, db: Session): +async def send_message_inner(request: SendMessageRequest, current_user: User, db: Session): if not request.content.strip(): raise HTTPException( status_code=400, @@ -40,7 +39,7 @@ async def send_message_inner(request: SendMessageRequest, current_user: dict, db new_message = Message( content=request.content.strip(), - user_id=current_user["user_id"], + user_id=current_user.id, timestamp=datetime.now() ) @@ -48,12 +47,12 @@ async def send_message_inner(request: SendMessageRequest, current_user: dict, db db.commit() db.refresh(new_message) - return {"status": "success", "message": convert_message(new_message, current_user)} + return {"status": "success", "message": convert_message(new_message)} @router.post("/send_message") async def send_message( request: SendMessageRequest, - current_user: dict = Depends(get_current_user), + current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): return await send_message_inner(request, current_user, db) @@ -61,10 +60,10 @@ async def send_message( @router.get("/get_messages") async def get_messages( - current_user: dict = Depends(get_current_user), + current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): - return await get_messages_inner(current_user, db) + return await get_messages_inner(db) class MessaggingSocketManager: @@ -79,7 +78,7 @@ class MessaggingSocketManager: data = await websocket.receive_json() type = data["type"] - def get_current_user_inner() -> dict | None: + def get_current_user_inner() -> User | None: if data["credentials"]: return get_current_user( HTTPAuthorizationCredentials( diff --git a/frontend/src/auth.ts b/frontend/src/auth.ts index 054b3e3..d6c1bd6 100644 --- a/frontend/src/auth.ts +++ b/frontend/src/auth.ts @@ -90,7 +90,7 @@ document.getElementById('login-form-element')!.addEventListener('submit', async const data: LoginResponse = await response.json(); // Store the JWT token authToken = data.token; - currentUser = { username: data.username }; + currentUser = data.user; showChat(); loadMessages(); // Start loading messages } else { diff --git a/frontend/src/main.ts b/frontend/src/main.ts index b0ee549..f3ca8fe 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -1,5 +1,5 @@ import './css/style.scss'; -import { showLogin, getAuthHeaders, authToken } from './auth'; +import { showLogin, getAuthHeaders, authToken, currentUser } from './auth'; import { API_BASE_URL, API_FULL_BASE_URL } from './config'; import type { Message, Messages, WebSocketMessage } from './types'; import "./links"; @@ -80,7 +80,7 @@ export function loadMessages() { // Добавляем только новые сообщения data.messages.forEach(msg => { if (msg.id > lastMessageId) { - addMessage(msg, msg.is_author); + addMessage(msg, msg.username == currentUser!.username); } }); } @@ -125,7 +125,7 @@ websocket.addEventListener("message", (e) => { switch (message.type) { case "newMessage": { const newMessage: Message = message.data; - addMessage(newMessage, newMessage.is_author); + addMessage(newMessage, newMessage.username == currentUser!.username); break; } } diff --git a/frontend/src/types.ts b/frontend/src/types.ts index defaf34..d341be8 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -11,7 +11,6 @@ export interface Message { username: string; content: string; is_read: boolean; - is_author: boolean; timestamp: string; } @@ -20,6 +19,10 @@ export interface Messages { } export interface User { + id: number; + created_at: string; + last_seen: string; + online: boolean; username: string; } @@ -42,7 +45,7 @@ export interface RegisterRequest { // Responses export interface LoginResponse { - username: string; + user: User; token: string; }