from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin from app import db class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(255), nullable=False, unique=True) password_hash = db.Column(db.Text, nullable=False) profile = db.relationship('Profile', backref='user', uselist=False, lazy='joined') class Profile(db.Model): id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False, index=True) name = db.Column(db.String(100)) email = db.Column(db.String(150), unique=True) profile_pic = db.deferred(db.Column(db.Text)) # Store image as a base64 string, deferred so it doesn't load on every query systolic_threshold = db.Column(db.Integer, default=140) diastolic_threshold = db.Column(db.Integer, default=90) dark_mode = db.Column(db.Boolean, default=False) timezone = db.Column(db.String(50), default='UTC') # e.g., 'Australia/Sydney' updated_at = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now()) class Reading(db.Model): __table_args__ = ( db.Index('ix_reading_user_timestamp', 'user_id', 'timestamp'), ) id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) timestamp = db.Column(db.DateTime, nullable=False) systolic = db.Column(db.Integer, nullable=False) diastolic = db.Column(db.Integer, nullable=False) heart_rate = db.Column(db.Integer, nullable=False) user = db.relationship('User', backref='readings')