Rolled back login endpoint functionality, added endpoints for managing friend requests.

This commit is contained in:
Mercurio 2024-12-21 19:34:39 +01:00
parent da53dbe060
commit 3e6ddd9d54
2 changed files with 107 additions and 17 deletions

View file

@ -3,6 +3,7 @@ from db import get_db_connection
import base64 import base64
import secrets import secrets
import time import time
import json
def register_user(email, display_name, password): def register_user(email, display_name, password):
hashed_password = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode() hashed_password = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
@ -34,10 +35,9 @@ def authenticate_user(email, password):
random_int = secrets.randbelow(1000000) random_int = secrets.randbelow(1000000)
token_data = f"{email}:{password}:{epoch_timestamp}:{random_int}" token_data = f"{email}:{password}:{epoch_timestamp}:{random_int}"
encoded_token = base64.b64encode(token_data.encode()).decode() encoded_token = base64.b64encode(token_data.encode()).decode()
hashed_token = bcrypt.hashpw(encoded_token.encode(), bcrypt.gensalt()) cursor.execute("UPDATE users SET session_token = %s WHERE email = %s;", (encoded_token, email))
cursor.execute("UPDATE users SET session_token = %s WHERE email = %s;", (hashed_token, email))
conn.commit() conn.commit()
return hashed_token.decode() return encoded_token
return None return None
finally: finally:
@ -49,7 +49,7 @@ def reauth_user(token):
conn = get_db_connection() conn = get_db_connection()
cursor = conn.cursor() cursor = conn.cursor()
try: try:
cursor.execute("SELECT email, display_name, current_elo, session_token FROM users WHERE session_token IS = %s;", (token,)) cursor.execute("SELECT email, display_name, current_elo, session_token FROM users WHERE session_token = %s;", (token,))
user = cursor.fetchone() user = cursor.fetchone()
if user: if user:
user_data = { user_data = {
@ -57,25 +57,38 @@ def reauth_user(token):
"display_name": user["display_name"], "display_name": user["display_name"],
"elo": user["current_elo"] "elo": user["current_elo"]
} }
return json.dumps(user_data) return user_data
return None return None
finally: finally:
cursor.close() cursor.close()
conn.close() conn.close()
def add_friend(user_uid, friend_uid): def add_friend(token, friend_uid):
conn = get_db_connection() conn = get_db_connection()
cursor = conn.cursor() cursor = conn.cursor()
try: try:
cursor.execute("SELECT friend_list FROM users WHERE uid = %s;", (user_uid,)) cursor.execute("SELECT friend_list FROM users WHERE session_token = %s;", (token,))
friends = cursor.fetchone()["friend_list"] result = cursor.fetchone()
if friend_uid not in friends: if result:
friends.append(friend_uid) friends = result["friend_list"] or {}
else:
friends = {}
index = len(friends)
friend_key = f"friend{index}"
if friend_key not in friends:
friends[friend_key] = friend_uid
friends_json = json.dumps(friends)
cursor.execute( cursor.execute(
"UPDATE users SET friend_list = %s WHERE uid = %s;", "UPDATE users SET friend_list = %s WHERE session_token = %s;",
(friends, user_uid) (friends_json, token)
) )
conn.commit() conn.commit()
else:
return False
return True return True
except Exception as e: except Exception as e:
conn.rollback() conn.rollback()
@ -84,6 +97,20 @@ def add_friend(user_uid, friend_uid):
cursor.close() cursor.close()
conn.close() conn.close()
def get_leaderboard():
conn = get_db_connection()
cursor = conn.cursor()
try:
cursor.execute("SELECT display_name, current_elo, uid FROM users WHERE current_elo IS NOT NULL ORDER BY current_elo DESC;")
players = cursor.fetchall()
player_elo_list = [{"player_name": player["display_name"], "elo_rating": player["current_elo"], "friend_code": player["uid"]} for player in players]
return player_elo_list
finally:
cursor.close()
conn.close()
def send_match_invite(sender_uid, receiver_uid): def send_match_invite(sender_uid, receiver_uid):
conn = get_db_connection() conn = get_db_connection()
cursor = conn.cursor() cursor = conn.cursor()
@ -251,4 +278,5 @@ def update_elo(player1_display_name, player2_display_name, player1_score, player
finally: finally:
cursor.close() cursor.close()
conn.close() conn.close()

70
main.py
View file

@ -1,7 +1,8 @@
from fastapi import FastAPI, HTTPException from fastapi import FastAPI, HTTPException
from pydantic import BaseModel from pydantic import BaseModel
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from calls import register_user, authenticate_user, reauth_user, add_friend, send_match_invite, accept_match_invite, get_all_matches, get_elo, update_elo from calls import *
from db import get_db_connection
app = FastAPI() app = FastAPI()
app.add_middleware( app.add_middleware(
@ -19,9 +20,12 @@ class RegisterRequest(BaseModel):
class LoginRequest(BaseModel): class LoginRequest(BaseModel):
email: str email: str
password: str password: str
class ReloginRequest(BaseModel):
token: str
class FriendRequest(BaseModel): class FriendRequest(BaseModel):
user_uid: int token: str
friend_uid: int friend_uid: int
class MatchInviteRequest(BaseModel): class MatchInviteRequest(BaseModel):
@ -32,6 +36,9 @@ class AcceptInviteRequest(BaseModel):
match_id: int match_id: int
player2_uid: int player2_uid: int
class getFriendList(BaseModel):
token: str
@app.post("/register") @app.post("/register")
def register(request: RegisterRequest): def register(request: RegisterRequest):
try: try:
@ -47,11 +54,19 @@ def login(request: LoginRequest):
return {"message": "Login successful", "uid": sessiontoken} return {"message": "Login successful", "uid": sessiontoken}
else: else:
raise HTTPException(status_code=401, detail="Invalid credentials") raise HTTPException(status_code=401, detail="Invalid credentials")
@app.post("/auth")
def login(request: ReloginRequest):
sessiontoken = reauth_user(request.token)
if sessiontoken:
return {"message": "Login successful", "uid": sessiontoken}
else:
raise HTTPException(status_code=503, detail="Bad Token")
@app.post("/add_friend") @app.post("/add_friend")
def add_friend_endpoint(request: FriendRequest): def add_friend_endpoint(request: FriendRequest):
try: try:
success = add_friend(request.user_uid, request.friend_uid) success = add_friend(request.token, request.friend_uid)
return {"message": "Friend added successfully"} if success else HTTPException(400, "Failed to add friend") return {"message": "Friend added successfully"} if success else HTTPException(400, "Failed to add friend")
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=str(e)) raise HTTPException(status_code=400, detail=str(e))
@ -80,6 +95,14 @@ def get_matches():
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=str(e)) raise HTTPException(status_code=400, detail=str(e))
@app.get("/leaderboards")
def leaderboard():
try:
leaderboard = get_leaderboard()
return leaderboard
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
@app.post("/elo") @app.post("/elo")
def get_elo_endpoint(authorization: str): def get_elo_endpoint(authorization: str):
print(f"Received Authorization header: {authorization}") print(f"Received Authorization header: {authorization}")
@ -88,3 +111,42 @@ def get_elo_endpoint(authorization: str):
return result return result
except Exception as e: except Exception as e:
raise HTTPException(status_code=400, detail=str(e)) raise HTTPException(status_code=400, detail=str(e))
def get_friend_details(friend_uid):
conn = get_db_connection()
cursor = conn.cursor()
try:
cursor.execute("SELECT uid, display_name FROM users WHERE uid = %s;", (friend_uid,))
result = cursor.fetchone()
if result:
return {"uid": result["uid"], "name": result["display_name"]}
return None
finally:
cursor.close()
conn.close()
@app.post("/get_friends")
def get_friends_list(request: getFriendList):
token = request.token
conn = get_db_connection()
cursor = conn.cursor()
try:
cursor.execute("SELECT friend_list FROM users WHERE session_token = %s;", (token,))
result = cursor.fetchone()
if not result or not result["friend_list"]:
raise HTTPException(status_code=404, detail="No friends found.")
friends = result["friend_list"]
friends_details = []
for key, friend_uid in friends.items():
friend_details = get_friend_details(friend_uid)
if friend_details:
friends_details.append(friend_details)
return {"friends": friends_details}
except Exception as e:
raise HTTPException(status_code=400, detail=str(e))
finally:
cursor.close()
conn.close()