Fix everything

This commit is contained in:
2025-08-18 19:44:33 +03:00
Unverified
parent 06d183d6e4
commit a5a501e364
6 changed files with 38 additions and 28 deletions
+1 -1
View File
@@ -35,4 +35,4 @@ def get_current_user(
detail="User not found", detail="User not found",
headers={"WWW-Authenticate": "Bearer"}, headers={"WWW-Authenticate": "Bearer"},
) )
return {"user_id": user.id, "username": user.username} return user
+16 -8
View File
@@ -2,6 +2,7 @@ from datetime import datetime
from fastapi import APIRouter, Depends, HTTPException, status from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from routes.messaging import convert_message
from dependencies import get_current_user, get_db from dependencies import get_current_user, get_db
from models import LoginRequest, RegisterRequest, User from models import LoginRequest, RegisterRequest, User
from utils import create_token, get_password_hash, verify_password 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() 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") @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 { return {
"authenticated": True, "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", "status": "success",
"message": "Login successful", "message": "Login successful",
"token": token, "token": token,
"username": user.username "user": convert_user(user)
} }
@@ -92,13 +102,11 @@ def register(request: RegisterRequest, db: Session = Depends(get_db)):
@router.get("/logout") @router.get("/logout")
def logout( def logout(
current_user: dict = Depends(get_current_user), current_user: User = Depends(get_current_user),
db: Session = Depends(get_db) db: Session = Depends(get_db)
): ):
user = db.query(User).filter(User.id == current_user["user_id"]).first() current_user.online = False
if user: current_user.last_seen = datetime.now()
user.online = False
user.last_seen = datetime.now()
db.commit() db.commit()
return { return {
+11 -12
View File
@@ -4,34 +4,33 @@ from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisco
from fastapi.security import HTTPAuthorizationCredentials from fastapi.security import HTTPAuthorizationCredentials
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 Message, SendMessageRequest from models import Message, SendMessageRequest, User
router = APIRouter() router = APIRouter()
def convert_message(msg: Message, current_user: dict) -> dict: def convert_message(msg: Message) -> dict:
return { return {
"id": msg.id, "id": msg.id,
"content": msg.content, "content": msg.content,
"timestamp": msg.timestamp.isoformat(), "timestamp": msg.timestamp.isoformat(),
"is_author": msg.user_id == current_user["user_id"],
"is_read": msg.is_read, "is_read": msg.is_read,
"username": msg.author.username "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 = db.query(Message).order_by(Message.timestamp.asc()).all()
messages_data = [] messages_data = []
for msg in messages: for msg in messages:
messages_data.append(convert_message(msg, current_user)) messages_data.append(convert_message(msg))
return { return {
"status": "success", "status": "success",
"messages": messages_data "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(): if not request.content.strip():
raise HTTPException( raise HTTPException(
status_code=400, status_code=400,
@@ -40,7 +39,7 @@ async def send_message_inner(request: SendMessageRequest, current_user: dict, db
new_message = Message( new_message = Message(
content=request.content.strip(), content=request.content.strip(),
user_id=current_user["user_id"], user_id=current_user.id,
timestamp=datetime.now() timestamp=datetime.now()
) )
@@ -48,12 +47,12 @@ async def send_message_inner(request: SendMessageRequest, current_user: dict, db
db.commit() db.commit()
db.refresh(new_message) 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") @router.post("/send_message")
async def send_message( async def send_message(
request: SendMessageRequest, request: SendMessageRequest,
current_user: dict = Depends(get_current_user), current_user: User = Depends(get_current_user),
db: Session = Depends(get_db) db: Session = Depends(get_db)
): ):
return await send_message_inner(request, current_user, db) return await send_message_inner(request, current_user, db)
@@ -61,10 +60,10 @@ async def send_message(
@router.get("/get_messages") @router.get("/get_messages")
async def 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) db: Session = Depends(get_db)
): ):
return await get_messages_inner(current_user, db) return await get_messages_inner(db)
class MessaggingSocketManager: class MessaggingSocketManager:
@@ -79,7 +78,7 @@ class MessaggingSocketManager:
data = await websocket.receive_json() data = await websocket.receive_json()
type = data["type"] type = data["type"]
def get_current_user_inner() -> dict | None: def get_current_user_inner() -> User | None:
if data["credentials"]: if data["credentials"]:
return get_current_user( return get_current_user(
HTTPAuthorizationCredentials( HTTPAuthorizationCredentials(
+1 -1
View File
@@ -90,7 +90,7 @@ document.getElementById('login-form-element')!.addEventListener('submit', async
const data: LoginResponse = await response.json(); const data: LoginResponse = await response.json();
// Store the JWT token // Store the JWT token
authToken = data.token; authToken = data.token;
currentUser = { username: data.username }; currentUser = data.user;
showChat(); showChat();
loadMessages(); // Start loading messages loadMessages(); // Start loading messages
} else { } else {
+3 -3
View File
@@ -1,5 +1,5 @@
import './css/style.scss'; 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 { API_BASE_URL, API_FULL_BASE_URL } from './config';
import type { Message, Messages, WebSocketMessage } from './types'; import type { Message, Messages, WebSocketMessage } from './types';
import "./links"; import "./links";
@@ -80,7 +80,7 @@ export function loadMessages() {
// Добавляем только новые сообщения // Добавляем только новые сообщения
data.messages.forEach(msg => { data.messages.forEach(msg => {
if (msg.id > lastMessageId) { 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) { switch (message.type) {
case "newMessage": { case "newMessage": {
const newMessage: Message = message.data; const newMessage: Message = message.data;
addMessage(newMessage, newMessage.is_author); addMessage(newMessage, newMessage.username == currentUser!.username);
break; break;
} }
} }
+5 -2
View File
@@ -11,7 +11,6 @@ export interface Message {
username: string; username: string;
content: string; content: string;
is_read: boolean; is_read: boolean;
is_author: boolean;
timestamp: string; timestamp: string;
} }
@@ -20,6 +19,10 @@ export interface Messages {
} }
export interface User { export interface User {
id: number;
created_at: string;
last_seen: string;
online: boolean;
username: string; username: string;
} }
@@ -42,7 +45,7 @@ export interface RegisterRequest {
// Responses // Responses
export interface LoginResponse { export interface LoginResponse {
username: string; user: User;
token: string; token: string;
} }