Enough for today

This commit is contained in:
lvrossem 2023-03-27 23:19:59 +02:00
parent 765f3e9bef
commit fc63176642
9 changed files with 80 additions and 52 deletions

2
.gitignore vendored
View File

@ -1,3 +1,3 @@
venv/*
venv
src/__pycache__*
*__pycache__*

View File

@ -1,23 +1,22 @@
from sqlalchemy.orm import Session
from models import User, HighScore, CourseProgress
from . import models, schemas
import schemas, models
def get_user(db: Session, user_id: int):
return db.query(models.User).filter(models.User.id == user_id).first()
return db.query(models.User).filter(models.User.user_id == user_id).first()
def get_user_by_username(db: Session, username: str):
return db.query(User).filter(User.email == email).first()
return db.query(User).filter(models.User.username == username).first()
def get_users(db: Session, skip: int = 0, limit: int = 100):
return db.query(User).all()
def get_users(db: Session):
return db.query(models.User).all()
def create_user(db: Session, username: str, hashed_password: str):
db_user = models.User(username=username, hashed_password=hashed_password)
def create_user(db: Session, user: schemas.users.UserCreate):
db_user = models.User(username=user.username, hashed_password=user.hashed_password)
db.add(db_user)
db.commit()
db.refresh(db_user)

View File

@ -1,4 +1,24 @@
from fastapi_utils.enums import StrEnum
from sqlalchemy.types import TypeDecorator, Enum
class StrEnumType(TypeDecorator):
impl = Enum
def __init__(self, enum_class, **kw):
self.enum_class = enum_class
super().__init__(enum_class, **kw)
def process_bind_param(self, value, dialect):
if value is None:
return None
return value.value
def process_result_value(self, value, dialect):
if value is None:
return None
return self.enum_class(value)
class MinigameEnum(StrEnum):
SpellingBee = 'SpellingBee'

View File

@ -2,7 +2,7 @@ from fastapi import Depends, FastAPI, HTTPException
from sqlalchemy.orm import Session
from models import Base
from database import SessionLocal, engine
from schemas import UserCreate
from schemas.users import UserCreate, User
import crud
app = FastAPI()
@ -17,7 +17,7 @@ def get_db():
db.close()
@app.post("/users/", response_model=schemas.User)
@app.post("/users/", response_model=User)
def create_user(user: UserCreate, db: Session = Depends(get_db)):
db_user = crud.get_user_by_email(db, email=user.email)
if db_user:

View File

@ -2,7 +2,7 @@ from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Float
from sqlalchemy.orm import relationship
from enum import Enum
from enums import MinigameEnum, CourseEnum
from enums import MinigameEnum, CourseEnum, StrEnumType
from database import Base
@ -22,7 +22,7 @@ class HighScore(Base):
high_score_id = Column(Integer, primary_key=True, index=True)
score_value = Column(Float, nullable=False)
minigame = Column(Enum(MinigameEnum), nullable=False)
minigame = Column(StrEnumType(MinigameEnum), nullable=False)
owner = Column(Integer, ForeignKey("users.user_id"))
@ -31,6 +31,6 @@ class CourseProgress(Base):
course_progress_id = Column(Integer, primary_key=True, index=True)
progress_value = Column(Float, nullable=False)
course = Column(Enum(CourseEnum), nullable=False)
course = Column(StrEnumType(CourseEnum), nullable=False)
owner = Column(Integer, ForeignKey("users.user_id"))

View File

@ -1,38 +0,0 @@
from pydantic import BaseModel
from enums import MinigameEnum, CourseEnum
class User(BaseModel):
user_id: int
username: str
hashed_password: str
high_scores: list[HighScore] = []
course_progresses: list[CourseProgress] = []
class Config:
orm_mode = True
class UserCreate(BaseModel):
username: str
password: str
class HighScore(BaseModel):
high_score_id: int
score_value: float
minigame: MinigameEnum
owner: User
class Config:
orm_mode = True
class CourseProgress(BaseModel):
course_progress_id: int
progress_value: float
course: CourseEnum
owner: User
class Config:
orm_mode = True

View File

@ -0,0 +1,12 @@
from pydantic import BaseModel
from enums import CourseEnum
class CourseProgress(BaseModel):
course_progress_id: int
progress_value: float
course: CourseEnum
owner: int
class Config:
orm_mode = True

17
src/schemas/highscores.py Normal file
View File

@ -0,0 +1,17 @@
from pydantic import BaseModel
from src.enums import MinigameEnum
class HighScore(BaseModel):
high_score_id: int
score_value: float
minigame: MinigameEnum
owner_id: "User"
class Config:
orm_mode = True
# It's ugly, but I have no choice
from users import User
HighScore.update_forward_refs()

18
src/schemas/users.py Normal file
View File

@ -0,0 +1,18 @@
from pydantic import BaseModel
class User(BaseModel):
user_id: int
username: str
hashed_password: str
high_scores: list[int] = []
course_progresses: list[int] = []
class Config:
orm_mode = True
class UserCreate(BaseModel):
username: str
password: str