diff --git a/app/core/config.py b/app/core/config.py index ce7b81c..f3e8157 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -15,7 +15,6 @@ class Settings(BaseSettings): DATABASE_USER: str DATABASE_PASSWORD: str DATABASE_NAME: str - DATABASE_DRIVER: str # ========================= # FASTAPI diff --git a/app/db/__init__.py b/app/db/__init__.py index fda1ab0..5138f4b 100644 --- a/app/db/__init__.py +++ b/app/db/__init__.py @@ -8,4 +8,4 @@ __version__ = "1.0.0" from .engine import engine, async_engine from .session import SessionLocal, AsyncSessionLocal, get_db, get_async_db -from .models import Base +from .models import * diff --git a/app/db/models.py b/app/db/models.py index 3028134..a8e345e 100644 --- a/app/db/models.py +++ b/app/db/models.py @@ -1,90 +1,134 @@ -from datetime import date from sqlalchemy import ( - sa, - Column, - Integer, - String, + Column, + Integer, + String, + Text, Boolean, Date, + DateTime, + Time, Enum, - ForeignKey + ForeignKey, + text, ) from sqlalchemy.orm import DeclarativeBase, relationship - +# ---------------------------------------------------------------------- +# Base class +# ---------------------------------------------------------------------- class Base(DeclarativeBase): pass +# ---------------------------------------------------------------------- +# User +# ---------------------------------------------------------------------- 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) + id = Column(Integer, primary_key=True, autoincrement=True, index=True) + email = Column(String(255), nullable=False, unique=True, index=True) + username = Column(String(150), nullable=False, unique=True, index=True) + hashed_password = Column(String(255), nullable=False) - 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") + # JSON est idéal pour stocker un dict, sinon utilise String + server_default + stats = Column(Text, nullable=False) + + # bool → TINYINT(1) avec server_default + is_active = Column(Boolean, nullable=False, server_default=text("1")) + + # Relations + tasks = relationship("Task", back_populates="owner", cascade="all, delete-orphan") + events = relationship("Event", back_populates="owner", cascade="all, delete-orphan") + goals = relationship("Goal", back_populates="owner", cascade="all, delete-orphan") + sub_goals = relationship("SubGoal", back_populates="owner", cascade="all, delete-orphan") + notes = relationship("Note", back_populates="owner", cascade="all, delete-orphan") +# ---------------------------------------------------------------------- +# Task +# ---------------------------------------------------------------------- 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) + id = Column(Integer, primary_key=True, autoincrement=True, index=True) + description = Column(String(255), nullable=False, index=True) + frequency = Column(Integer, nullable=False, + server_default=text("4223")) # valeur par défaut côté serveur reward = Column(Integer, nullable=True) - goal_id = Column(Integer, ForeignKey("goals.id"), default=None, nullable=True) + + goal_id = Column(Integer, ForeignKey("goals.id"), nullable=True) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) - start_date = Column(Date, server_default=sa.text("CURRENT_DATE"), nullable=False) + start_date = Column(Date, nullable=False) next_date = Column(Date, nullable=True) owner = relationship("User", back_populates="tasks") goal = relationship("Goal", back_populates="tasks") +# ---------------------------------------------------------------------- +# Event +# ---------------------------------------------------------------------- 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) + id = Column(Integer, primary_key=True, autoincrement=True, index=True) + name = Column(String(255), nullable=False, index=True) # texte court → String + description = Column(String(255), nullable=True, index=True) + frequency = Column(Integer, nullable=False, server_default=text("4223")) + start_time = Column(Time, nullable=False) + end_time = Column(Time, nullable=False) + owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) owner = relationship("User", back_populates="events") +# ---------------------------------------------------------------------- +# Goal +# ---------------------------------------------------------------------- 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) + id = Column(Integer, primary_key=True, autoincrement=True, index=True) + title = Column(String(255), nullable=False, index=True) + description = Column(Text, nullable=True) + + # Enum avec nom explicite + state = Column( + Enum("in_progress", "successful", "failed", "aborted", + name="goal_state"), + nullable=False, + server_default=text("'in_progress'") + ) + 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") + tasks = relationship("Task", back_populates="goal", cascade="all, delete-orphan") + notes = relationship("Note", back_populates="goal", cascade="all, delete-orphan") + sub_goals = relationship("SubGoal", back_populates="goal", cascade="all, delete-orphan") owner = relationship("User", back_populates="goals") +# ---------------------------------------------------------------------- +# SubGoal +# ---------------------------------------------------------------------- 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) + id = Column(Integer, primary_key=True, autoincrement=True, index=True) + title = Column(String(255), nullable=False, index=True) + description = Column(Text, nullable=True) + + state = Column( + Enum("in_progress", "successful", "failed", "aborted", + name="subgoal_state"), + nullable=False, + server_default=text("'in_progress'") + ) + reward = Column(Integer, nullable=True) + goal_id = Column(Integer, ForeignKey("goals.id"), nullable=False) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) @@ -92,19 +136,26 @@ class SubGoal(Base): owner = relationship("User", back_populates="sub_goals") +# ---------------------------------------------------------------------- +# Note +# ---------------------------------------------------------------------- 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) + id = Column(Integer, primary_key=True, autoincrement=True, index=True) + title = Column(String(255), nullable=False, index=True) + description = Column(Text, nullable=True) + content = Column(Text, 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) + created_at = Column(DateTime, nullable=False) + updated_at = Column(DateTime, nullable=False) goal = relationship("Goal", back_populates="notes") owner = relationship("User", back_populates="notes") + +# -------------------------------------------------------------- +__all__ = ["Base", "User", "Task", "Event", "Goal", "SubGoal", "Note"] \ No newline at end of file