Work on high score endpoints
This commit is contained in:
93
src/crud.py
93
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
|
||||
"""
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -18,3 +18,5 @@ class HighScore(HighScoreBase):
|
||||
|
||||
class Config:
|
||||
orm_mode = True
|
||||
|
||||
|
||||
|
||||
@@ -20,3 +20,7 @@ class User(UserBase):
|
||||
|
||||
class UserCreate(UserBase):
|
||||
password: str
|
||||
|
||||
|
||||
class UserHighScore(UserBase):
|
||||
score_value: float
|
||||
|
||||
Reference in New Issue
Block a user