import sys from typing import List, Optional from fastapi import Depends, FastAPI from sqlalchemy.orm import Session sys.path.append("..") from src.crud import authentication as crud_authentication from src.crud import courseprogress as crud_courseprogress from src.crud import highscores as crud_highscores from src.crud import saved_data as crud_saved_data from src.crud import users as crud_users from src.database import Base, engine, get_db from src.enums import CourseEnum, MinigameEnum from src.schemas import courseprogress, highscores, users, saved_data app = FastAPI() Base.metadata.create_all(bind=engine) @app.get("/") async def root(): return {"message": "Hello world!"} @app.get("/allusers", response_model=List[users.User]) async def read_users(db: Session = Depends(get_db)): return crud_users.get_users(db) @app.get("/users", response_model=users.User) async def read_user( current_user_name: str = Depends(crud_authentication.get_current_user_name), db: Session = Depends(get_db), ): return crud_users.get_user_by_username(db, current_user_name) @app.patch("/users") async def patch_current_user( user: users.UserCreate, current_user_name=Depends(crud_authentication.get_current_user_name), db: Session = Depends(get_db), ): crud_users.patch_user(db, current_user_name, user) @app.get("/saveddata", response_model=saved_data.SavedUser) async def read_saved_data( current_user_name: str = Depends(crud_authentication.get_current_user_name), db: Session = Depends(get_db), ): return crud_saved_data.get_saved_data(db, current_user_name) @app.post("/register") async def register(user: users.UserCreate, db: Session = Depends(get_db)): access_token = crud_authentication.register( db, user.username, user.password, user.avatar_index ) user = crud_users.get_user_by_username(db, user.username) crud_courseprogress.initialize_user(db, user) return access_token @app.post("/login") async def login(user: users.UserCreate, db: Session = Depends(get_db)): return crud_authentication.login(db, user.username, user.password) @app.get("/highscores/{minigame}", response_model=List[highscores.Score]) async def get_high_scores( minigame: MinigameEnum, amount: Optional[int] = 1, mine_only: Optional[bool] = True, most_recent: Optional[bool] = False, current_user_name: str = Depends(crud_authentication.get_current_user_name), db: Session = Depends(get_db), ): if most_recent: return crud_highscores.get_most_recent_high_scores(db, minigame, amount) user = crud_users.get_user_by_username(db, current_user_name) return crud_highscores.get_highest_high_scores( db, minigame, user, amount, mine_only ) @app.put("/highscores/{minigame}", response_model=highscores.HighScore) async def create_high_score( minigame: MinigameEnum, high_score: highscores.HighScoreBase, current_user_name: str = Depends(crud_authentication.get_current_user_name), db: Session = Depends(get_db), ): current_user = crud_users.get_user_by_username(db, current_user_name) return crud_highscores.create_high_score(db, current_user, minigame, high_score) @app.get( "/courseprogress/{course}", response_model=List[courseprogress.CourseProgressParent] ) async def get_course_progress( course: Optional[CourseEnum] = CourseEnum.All, current_user_name: str = Depends(crud_authentication.get_current_user_name), db: Session = Depends(get_db), ): current_user = crud_users.get_user_by_username(db, current_user_name) return crud_courseprogress.get_course_progress(db, current_user, course) @app.patch( "/courseprogress/{course}", response_model=List[courseprogress.CourseProgressParent] ) async def patch_course_progress( course: CourseEnum, course_progress: courseprogress.CourseProgressBase, current_user_name: str = Depends(crud_authentication.get_current_user_name), db: Session = Depends(get_db), ): current_user = crud_users.get_user_by_username(db, current_user_name) return crud_courseprogress.patch_course_progress( db, current_user, course, course_progress )