Add matched training signals, daily recovery and performance analysis

This commit is contained in:
Peter Stockings
2026-10-03 13:22:32 +10:00
parent e6e2f22479
commit 418e03583a
37 changed files with 1380 additions and 47 deletions
+16
View File
@@ -16,9 +16,11 @@ class User(UserMixin, db.Model):
# Assigned only by local setup / operator CLI. Never accepted from registration input.
local_account_key = db.Column(db.String(64), unique=True)
created_at = db.Column(db.DateTime(timezone=True), default=lambda: datetime.now(UTC))
hr_bands = db.Column(db.JSON)
activities = db.relationship(
"Activity", backref="owner", lazy="select", cascade="all, delete-orphan"
)
daily_health = db.relationship("DailyHealth", cascade="all, delete-orphan")
def set_password(self, password):
self.password_hash = generate_password_hash(password)
@@ -38,6 +40,9 @@ class GarminConnection(db.Model):
last_success = db.Column(db.DateTime(timezone=True))
message = db.Column(db.String(200), nullable=False, default="Sync queued.")
failures = db.Column(db.Integer, nullable=False, default=0)
health_enabled = db.Column(db.Boolean, nullable=False, default=False, server_default=db.false())
health_message = db.Column(db.String(200), nullable=False, default="Daily recovery sync is off.",
server_default="Daily recovery sync is off.")
class Activity(db.Model):
@@ -51,6 +56,7 @@ class Activity(db.Model):
duration_s = db.Column(db.Float, nullable=False, default=0)
elevation_m = db.Column(db.Float, nullable=False, default=0)
avg_hr = db.Column(db.Float)
session_context = db.Column(db.JSON, nullable=False, default=dict, server_default="{}")
metrics = db.Column(db.JSON, nullable=False, default=dict, server_default="{}")
visibility = db.Column(db.String(12), nullable=False, default="private")
share_token = db.Column(db.String(64), unique=True)
@@ -123,6 +129,16 @@ class SavedAnalysis(db.Model):
)
class DailyHealth(db.Model):
id = db.Column(db.Integer, primary_key=True)
owner_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False, index=True)
day = db.Column(db.Date, nullable=False)
values = db.Column(db.JSON, nullable=False, default=dict)
fetched_at = db.Column(db.DateTime(timezone=True), nullable=False,
default=lambda: datetime.now(UTC))
__table_args__ = (db.UniqueConstraint("owner_id", "day"),)
class Friendship(db.Model):
id = db.Column(db.Integer, primary_key=True)
low_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)