Files
back-end/src/crud.py

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