added segments

This commit is contained in:
2026-01-09 12:10:58 -08:00
parent 55e37fbca8
commit 67357b5038
55 changed files with 2310 additions and 75 deletions

View File

@@ -12,4 +12,6 @@ from .sync_log import SyncLog
from .activity_state import GarminActivityState
from .health_state import HealthSyncState
from .scheduled_job import ScheduledJob
from .bike_setup import BikeSetup
from .bike_setup import BikeSetup
from .segment import Segment
from .segment_effort import SegmentEffort

View File

@@ -0,0 +1,23 @@
from sqlalchemy import Column, Integer, String, Float, Text, DateTime, JSON
from sqlalchemy.sql import func
from ..models import Base
class Segment(Base):
__tablename__ = "segments"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, nullable=False)
description = Column(String, nullable=True)
distance = Column(Float, nullable=False) # in meters
avg_grade = Column(Float, nullable=True) # %. e.g. 5.5
elevation_gain = Column(Float, nullable=True) # meters
# Store simplified geometry as List[[lon, lat]] or similar
points = Column(JSON, nullable=False)
# Bounding box for fast filtering: [min_lat, min_lon, max_lat, max_lon]
bounds = Column(JSON, nullable=False)
activity_type = Column(String, nullable=False) # 'cycling', 'running'
created_at = Column(DateTime(timezone=True), server_default=func.now())

View File

@@ -0,0 +1,26 @@
from sqlalchemy import Column, Integer, String, Float, DateTime, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from ..models import Base
class SegmentEffort(Base):
__tablename__ = "segment_efforts"
id = Column(Integer, primary_key=True, index=True)
segment_id = Column(Integer, ForeignKey("segments.id"), nullable=False)
activity_id = Column(Integer, ForeignKey("activities.id"), nullable=False)
elapsed_time = Column(Integer, nullable=False) # seconds
start_time = Column(DateTime, nullable=False) # Absolute start time of the effort
end_time = Column(DateTime, nullable=False)
avg_power = Column(Integer, nullable=True)
avg_hr = Column(Integer, nullable=True)
# Potential for ranking (1 = KOM/PR, etc.) - calculated dynamically or stored
kom_rank = Column(Integer, nullable=True)
created_at = Column(DateTime(timezone=True), server_default=func.now())
segment = relationship("Segment")
activity = relationship("Activity")