mirror of
https://github.com/fromchat-messenger/web.git
synced 2026-09-22 19:15:08 +03:00
Fix everything
This commit is contained in:
@@ -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
|
||||||
@@ -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
@@ -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(
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user