Enough for today
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,3 +1,3 @@
|
|||||||
venv/*
|
venv/*
|
||||||
venv
|
venv
|
||||||
src/__pycache__*
|
*__pycache__*
|
||||||
15
src/crud.py
15
src/crud.py
@@ -1,23 +1,22 @@
|
|||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
|
|
||||||
from models import User, HighScore, CourseProgress
|
from models import User, HighScore, CourseProgress
|
||||||
from . import models, schemas
|
import schemas, models
|
||||||
|
|
||||||
|
|
||||||
def get_user(db: Session, user_id: int):
|
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):
|
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):
|
def get_users(db: Session):
|
||||||
return db.query(User).all()
|
return db.query(models.User).all()
|
||||||
|
|
||||||
|
|
||||||
def create_user(db: Session, username: str, hashed_password: str):
|
def create_user(db: Session, user: schemas.users.UserCreate):
|
||||||
db_user = models.User(username=username, hashed_password=hashed_password)
|
db_user = models.User(username=user.username, hashed_password=user.hashed_password)
|
||||||
db.add(db_user)
|
db.add(db_user)
|
||||||
db.commit()
|
db.commit()
|
||||||
db.refresh(db_user)
|
db.refresh(db_user)
|
||||||
|
|||||||
20
src/enums.py
20
src/enums.py
@@ -1,4 +1,24 @@
|
|||||||
from fastapi_utils.enums import StrEnum
|
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):
|
class MinigameEnum(StrEnum):
|
||||||
SpellingBee = 'SpellingBee'
|
SpellingBee = 'SpellingBee'
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from fastapi import Depends, FastAPI, HTTPException
|
|||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
from models import Base
|
from models import Base
|
||||||
from database import SessionLocal, engine
|
from database import SessionLocal, engine
|
||||||
from schemas import UserCreate
|
from schemas.users import UserCreate, User
|
||||||
import crud
|
import crud
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
@@ -17,7 +17,7 @@ def get_db():
|
|||||||
db.close()
|
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)):
|
def create_user(user: UserCreate, db: Session = Depends(get_db)):
|
||||||
db_user = crud.get_user_by_email(db, email=user.email)
|
db_user = crud.get_user_by_email(db, email=user.email)
|
||||||
if db_user:
|
if db_user:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Float
|
|||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
from enums import MinigameEnum, CourseEnum
|
from enums import MinigameEnum, CourseEnum, StrEnumType
|
||||||
from database import Base
|
from database import Base
|
||||||
|
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ class HighScore(Base):
|
|||||||
|
|
||||||
high_score_id = Column(Integer, primary_key=True, index=True)
|
high_score_id = Column(Integer, primary_key=True, index=True)
|
||||||
score_value = Column(Float, nullable=False)
|
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"))
|
owner = Column(Integer, ForeignKey("users.user_id"))
|
||||||
|
|
||||||
|
|
||||||
@@ -31,6 +31,6 @@ class CourseProgress(Base):
|
|||||||
|
|
||||||
course_progress_id = Column(Integer, primary_key=True, index=True)
|
course_progress_id = Column(Integer, primary_key=True, index=True)
|
||||||
progress_value = Column(Float, nullable=False)
|
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"))
|
owner = Column(Integer, ForeignKey("users.user_id"))
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
12
src/schemas/courseprogress.py
Normal file
12
src/schemas/courseprogress.py
Normal 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
17
src/schemas/highscores.py
Normal 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
18
src/schemas/users.py
Normal 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
|
||||||
Reference in New Issue
Block a user