99 lines
2.9 KiB
Python
99 lines
2.9 KiB
Python
from sqlalchemy import desc
|
|
from sqlalchemy.dialects.postgresql import array
|
|
from sqlalchemy.orm import Session
|
|
from fastapi import HTTPException
|
|
|
|
from enums import MinigameEnum
|
|
from models import CourseProgress, HighScore, User
|
|
from schemas.highscores import HighScoreCreate
|
|
from schemas.users import UserCreate, UserHighScore
|
|
|
|
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()
|
|
|
|
|
|
def get_user_by_username(db: Session, username: str):
|
|
return db.query(User).filter(User.username == username).first()
|
|
|
|
|
|
def get_users(db: Session):
|
|
return db.query(User).all()
|
|
|
|
|
|
def create_user(db: Session, user: UserCreate):
|
|
db_user = User(username=user.username, hashed_password=user.password)
|
|
db.add(db_user)
|
|
db.commit()
|
|
db.refresh(db_user)
|
|
return db_user
|
|
|
|
|
|
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):
|
|
owner = db.query(User).filter(User.user_id == high_score.owner_id).first()
|
|
if not owner:
|
|
raise HTTPException(status_code=400, detail="User does not exist")
|
|
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
|
|
|