diff --git a/app/db/models.py b/app/db/models.py new file mode 100644 index 0000000..3028134 --- /dev/null +++ b/app/db/models.py @@ -0,0 +1,110 @@ +from datetime import date +from sqlalchemy import ( + sa, + Column, + Integer, + String, + Boolean, + Date, + Enum, + ForeignKey +) +from sqlalchemy.orm import DeclarativeBase, relationship + + +class Base(DeclarativeBase): + pass + + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + email = Column(String, unique=True, index=True) + username = Column(String, unique=True, index=True) + hashed_password = Column(String) + stats = Column(String) + is_active = Column(Boolean, default=True) + + tasks = relationship("Item", back_populates="owner") + events = relationship("Event", back_populates="owner") + goals = relationship("Goal", back_populates="owner") + sub_goals = relationship("SubGoal", back_populates="owner") + notes = relationship("Note", back_populates="owner") + + +class Task(Base): + __tablename__ = "tasks" + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + description = Column(String, index=True, nullable=False) + frequency = Column(Integer, default=4223, nullable=False) + reward = Column(Integer, nullable=True) + goal_id = Column(Integer, ForeignKey("goals.id"), default=None, nullable=True) + owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) + + start_date = Column(Date, server_default=sa.text("CURRENT_DATE"), nullable=False) + next_date = Column(Date, nullable=True) + + owner = relationship("User", back_populates="tasks") + goal = relationship("Goal", back_populates="tasks") + + +class Event(Base): + __tablename__ = "events" + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + name = Column(String, index=True, nullable=False) + description = Column(String, index=True, nullable=True) + frequency = Column(Integer, default=4223, nullable=False) + owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) + + owner = relationship("User", back_populates="events") + + +class Goal(Base): + __tablename__ = "goals" + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + title = Column(String, index=True, nullable=False) + description = Column(String, index=True, nullable=True) + state = Column(Enum("in_progress", "successful", "failed", "aborted"), default="in_progress", nullable=False) + owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) + + tasks = relationship("Task", back_populates="goal") + notes = relationship("Note", back_populates="goal") + sub_goals = relationship("SubGoal", back_populates="goal") + owner = relationship("User", back_populates="goals") + + +class SubGoal(Base): + __tablename__ = "sub_goals" + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + title = Column(String, index=True, nullable=False) + description = Column(String, index=True, nullable=True) + state = Column(Enum("in_progress", "successful", "failed", "aborted"), default="in_progress", nullable=False) + reward = Column(Integer, nullable=True) + goal_id = Column(Integer, ForeignKey("goals.id"), nullable=False) + owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) + + goal = relationship("Goal", back_populates="sub_goals") + owner = relationship("User", back_populates="sub_goals") + + +class Note(Base): + __tablename__ = "notes" + + id = Column(Integer, primary_key=True, index=True, autoincrement=True) + title = Column(String, index=True, nullable=False) + description = Column(String, index=True, nullable=True) + content = Column(String, index=True, nullable=True) + goal_id = Column(Integer, ForeignKey("goals.id"), nullable=True) + owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) + + created_at = Column(Date, server_default=sa.text("CURRENT_DATE"), nullable=False) + updated_at = Column(Date, server_default=sa.text("CURRENT_DATE"), nullable=False) + + goal = relationship("Goal", back_populates="notes") + owner = relationship("User", back_populates="notes") + diff --git a/app/models.py b/app/models.py deleted file mode 100644 index e69de29..0000000