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