from sqlalchemy import Date,Column, Integer, String, Float, ForeignKey, DateTime,Boolean from sqlalchemy.orm import relationship from app.db.database import Base from datetime import datetime class User(Base): __tablename__="users" id=Column(Integer,primary_key=True,index=True) username=Column(String,unique=True,index=True,nullable=False) email=Column(String,unique=True,index=True,nullable=False) hashed_password=Column(String,nullable=False) created_at=Column(DateTime,default=datetime.utcnow) is_2fa_enabled=Column(Boolean,default=False) totp_secret=Column(String,nullable=True) history=relationship("History",back_populates="user") reset_codes=relationship("PasswordReset",back_populates="user") full_name=Column(String,nullable=True) age=Column(Integer, nullable=True) gender = Column(String, nullable=True) height_cm = Column(Float, nullable=True) weight_kg = Column(Float, nullable=True) activity_level = Column(String, nullable=True) goal_type = Column(String, nullable=True) calorie_goal_mode = Column(String, nullable=True) calorie_goal_manual = Column(Float, nullable=True) weight_goal_kg = Column(Float, nullable=True) setup_completed = Column(Boolean, default=False) start_weight = Column(Float, nullable=True) weight_logs = relationship("WeightLog", back_populates="user", cascade="all, delete-orphan") class WeightLog(Base): __tablename__="weight_logs" id=Column(Integer,primary_key=True,index=True) user_id=Column(Integer,ForeignKey("users.id"),nullable=False) weight_kg = Column(Float, nullable=False) date = Column(Date, nullable=False) created_at = Column(DateTime, default=datetime.utcnow) user=relationship("User",back_populates="weight_logs") class History(Base): __tablename__="history" id=Column(Integer,primary_key=True,index=True) label=Column(String,nullable=False) grams=Column(Integer,nullable=False) calories=Column(Float,nullable=False) protein_g=Column(Float,nullable=False,default=0.0) carbs_g=Column(Float,nullable=False,default=0.0) fat_g=Column(Float,nullable=False,default=0.0) meal_type = Column(String, nullable=True) meal_time = Column(String, nullable=True) log_date = Column(DateTime, nullable=True) created_at=Column(DateTime,default=datetime.utcnow) user_id=Column(Integer,ForeignKey("users.id")) user=relationship("User",back_populates="history") class PasswordReset(Base): __tablename__="password_resets" id=Column(Integer,primary_key=True,index=True) user_id=Column(Integer,ForeignKey("users.id"),nullable=False) reset_code=Column(String,nullable=False) expires_at=Column(DateTime,nullable=False) is_used=Column(Integer,default=0) created_at=Column(DateTime,default=datetime.utcnow) user=relationship("User",back_populates="reset_codes")