Files
back-end/src/main.py
2023-04-17 07:51:53 -06:00

125 lines
4.1 KiB
Python

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
)