Work on high score endpoints

This commit is contained in:
lvrossem
2023-03-29 11:24:25 -06:00
parent fa543b19e7
commit 41e6be454a
4 changed files with 83 additions and 25 deletions

View File

@@ -1,9 +1,13 @@
from sqlalchemy.orm import Session
from sqlalchemy.dialects.postgresql import array
from models import CourseProgress, HighScore, User
from enums import MinigameEnum
from schemas.highscores import HighScoreCreate
from schemas.users import UserCreate
from schemas.users import UserCreate, UserHighScore
from sqlalchemy import desc
DEFAULT_NR_HIGH_SCORES = 10
def get_user_by_id(db: Session, user_id: int):
return db.query(User).filter(User.user_id == user_id).first()
@@ -25,26 +29,73 @@ def create_user(db: Session, user: UserCreate):
return db_user
def get_high_scores(db: Session):
return db.query(HighScore).all()
def get_high_scores(db: Session, minigame: MinigameEnum, n_highest: int):
user_high_scores = []
if not n_highest:
n_highest = DEFAULT_NR_HIGH_SCORES
if not minigame:
minigame = MinigameEnum.SpellingBee
high_scores = db.query(HighScore).filter(HighScore.minigame == minigame).order_by(desc(HighScore.score_value)).limit(n_highest).all()
for high_score in high_scores:
owner = db.query(User).filter(User.user_id == high_score.owner_id).first()
user_high_scores.append(UserHighScore(username = owner.username, score_value = high_score.score_value))
return user_high_scores
def create_high_score(db: Session, high_score: HighScoreCreate):
db_high_score = HighScore(
score_value=high_score.score_value,
minigame=high_score.minigame,
owner_id=high_score.owner_id,
)
db.add(db_high_score)
db.commit()
db.refresh(db_high_score)
owner = get_user_by_id(db, high_score.owner_id)
print("ID IS " + str(db_high_score.high_score_id) + " " + owner.username)
owner.high_score_ids.append(db_high_score.high_score_id)
owner.high_scores.append(db_high_score)
print("LIST OF IDS: " + str(owner.high_score_ids))
db.commit()
db.refresh(owner)
owner2 = db.query(User).filter(User.user_id == high_score.owner_id).first()
print("LIST OF IDS: " + str(owner2.high_score_ids))
return db_high_score
old_high_score = db.query(HighScore).filter(HighScore.owner_id == high_score.owner_id, HighScore.minigame == high_score.minigame).first()
if old_high_score:
print("Older high score found")
print(old_high_score.minigame)
if old_high_score.score_value < high_score.score_value:
print("Older score is lower")
db_high_score = HighScore(
score_value=high_score.score_value,
minigame=high_score.minigame,
owner_id=high_score.owner_id,
)
db.delete(old_high_score)
db.add(db_high_score)
db.commit()
db.refresh(db_high_score)
return db_high_score
else:
print("Older score is higher")
return old_high_score
else:
db_high_score = HighScore(
score_value=high_score.score_value,
minigame=high_score.minigame,
owner_id=high_score.owner_id,
)
db.add(db_high_score)
db.commit()
db.refresh(db_high_score)
return db_high_score
"""
db_high_score = HighScore(
score_value=high_score.score_value,
minigame=high_score.minigame,
owner_id=high_score.owner_id,
)
db.add(db_high_score)
db.commit()
db.refresh(db_high_score)
owner = db.query(User).filter(User.user_id == high_score.owner_id).first()
print("ID IS " + str(db_high_score.high_score_id) + " " + owner.username)
#owner.high_score_ids.append(db_high_score.high_score_id)
#db.add(owner)
#db.commit()
#owner.high_scores.append(db_high_score)
print("LIST OF IDS: " + str(owner.high_score_ids))
#db.flush()
#db.refresh(owner)
#owner2 = db.query(User).filter(User.user_id == high_score.owner_id).first()
#print("LIST OF IDS: " + str(owner2.high_score_ids))
return db_high_score
"""

View File

@@ -1,4 +1,4 @@
from typing import List
from typing import List, Optional
from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session
@@ -7,6 +7,7 @@ import crud
from database import SessionLocal, engine
from models import Base
from schemas import highscores, users
from enums import MinigameEnum
app = FastAPI()
@@ -40,9 +41,9 @@ async def create_user(user: users.UserCreate, db: Session = Depends(get_db)):
return crud.create_user(db=db, user=user)
@app.get("/highscores", response_model=List[highscores.HighScore])
async def read_high_scores(db: Session = Depends(get_db)):
high_scores = crud.get_high_scores(db)
@app.get("/highscores", response_model=List[users.UserHighScore])
async def read_high_scores(db: Session = Depends(get_db), minigame: Optional[MinigameEnum] = None, n_highest: Optional[int] = None):
high_scores = crud.get_high_scores(db, minigame, n_highest)
return high_scores

View File

@@ -18,3 +18,5 @@ class HighScore(HighScoreBase):
class Config:
orm_mode = True

View File

@@ -20,3 +20,7 @@ class User(UserBase):
class UserCreate(UserBase):
password: str
class UserHighScore(UserBase):
score_value: float