from sqlalchemy import Column, Float, ForeignKey, Integer, String from sqlalchemy.dialects.postgresql import ARRAY from sqlalchemy.orm import relationship from src.database import Base from src.enums import CourseEnum, MinigameEnum, StrEnumType class User(Base): """The database model for users""" __tablename__ = "users" user_id = Column(Integer, primary_key=True, index=True) username = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=False) avatar = Column(String, nullable=False) high_scores = relationship( "HighScore", back_populates="owner", cascade="all, delete", lazy="dynamic" ) course_progress = relationship( "CourseProgress", back_populates="owner", cascade="all, delete", lazy="dynamic" ) class HighScore(Base): """The database model for high scores""" __tablename__ = "high_scores" high_score_id = Column(Integer, primary_key=True, index=True) score_value = Column(Float, nullable=False) minigame = Column(String, nullable=False) owner_id = Column(Integer, ForeignKey("users.user_id")) owner = relationship("User", back_populates="high_scores") class CourseProgress(Base): """The database model for course progress""" __tablename__ = "course_progress" course_progress_id = Column(Integer, primary_key=True, index=True) progress_value = Column(Float, nullable=False) course = Column(String, nullable=False) owner_id = Column(Integer, ForeignKey("users.user_id")) owner = relationship("User", back_populates="course_progress")