diff --git a/src/crud.py b/src/crud.py index 104409e..bfb61ca 100644 --- a/src/crud.py +++ b/src/crud.py @@ -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 +""" diff --git a/src/main.py b/src/main.py index 89a1243..2782dde 100644 --- a/src/main.py +++ b/src/main.py @@ -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 diff --git a/src/schemas/highscores.py b/src/schemas/highscores.py index afec43f..45a8578 100644 --- a/src/schemas/highscores.py +++ b/src/schemas/highscores.py @@ -18,3 +18,5 @@ class HighScore(HighScoreBase): class Config: orm_mode = True + + diff --git a/src/schemas/users.py b/src/schemas/users.py index 7543434..eed0d7d 100644 --- a/src/schemas/users.py +++ b/src/schemas/users.py @@ -20,3 +20,7 @@ class User(UserBase): class UserCreate(UserBase): password: str + + +class UserHighScore(UserBase): + score_value: float