93 lines
2.1 KiB
Python
93 lines
2.1 KiB
Python
from datetime import datetime
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class ActivityMetricsResponse(BaseModel):
|
|
model_config = {"from_attributes": True}
|
|
|
|
tss: float | None = None
|
|
normalized_power: float | None = None
|
|
intensity_factor: float | None = None
|
|
variability_index: float | None = None
|
|
avg_power: float | None = None
|
|
max_power: int | None = None
|
|
avg_hr: int | None = None
|
|
max_hr: int | None = None
|
|
avg_cadence: int | None = None
|
|
avg_speed: float | None = None
|
|
calories: int | None = None
|
|
|
|
|
|
class IntervalResponse(BaseModel):
|
|
model_config = {"from_attributes": True}
|
|
|
|
id: UUID
|
|
start_ts: datetime
|
|
end_ts: datetime
|
|
interval_type: str
|
|
avg_power: float | None = None
|
|
avg_hr: int | None = None
|
|
duration: int | None = None
|
|
|
|
|
|
class ActivityResponse(BaseModel):
|
|
model_config = {"from_attributes": True}
|
|
|
|
id: UUID
|
|
rider_id: UUID
|
|
name: str | None = None
|
|
activity_type: str
|
|
date: datetime
|
|
duration: int
|
|
distance: float | None = None
|
|
elevation_gain: float | None = None
|
|
metrics: ActivityMetricsResponse | None = None
|
|
intervals: list[IntervalResponse] = []
|
|
|
|
|
|
class ActivityListResponse(BaseModel):
|
|
items: list[ActivityResponse]
|
|
total: int
|
|
|
|
|
|
class DataPointResponse(BaseModel):
|
|
model_config = {"from_attributes": True}
|
|
|
|
timestamp: datetime
|
|
power: int | None = None
|
|
heart_rate: int | None = None
|
|
cadence: int | None = None
|
|
speed: float | None = None
|
|
latitude: float | None = None
|
|
longitude: float | None = None
|
|
altitude: float | None = None
|
|
temperature: int | None = None
|
|
|
|
|
|
class ZoneItem(BaseModel):
|
|
zone: int
|
|
name: str
|
|
seconds: int
|
|
percentage: float
|
|
|
|
|
|
class PowerZoneItem(ZoneItem):
|
|
min_watts: int
|
|
max_watts: int | None = None
|
|
|
|
|
|
class HrZoneItem(ZoneItem):
|
|
min_bpm: int
|
|
max_bpm: int | None = None
|
|
|
|
|
|
class ZonesResponse(BaseModel):
|
|
power_zones: list[PowerZoneItem] = []
|
|
hr_zones: list[HrZoneItem] = []
|
|
|
|
|
|
class PowerCurveResponse(BaseModel):
|
|
curve: dict[int, int] # {duration_seconds: max_power}
|