This commit is contained in:
2025-09-08 12:51:15 -07:00
commit 574feb1ea1
62 changed files with 10425 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
from pydantic import BaseModel
from typing import Optional, Dict, Any
class AnalysisBase(BaseModel):
workout_id: int
analysis_type: str = 'workout_review'
jsonb_feedback: Optional[Dict[str, Any]] = None
suggestions: Optional[Dict[str, Any]] = None
approved: bool = False
class AnalysisCreate(AnalysisBase):
pass
class Analysis(AnalysisBase):
id: int
class Config:
orm_mode = True
class AnalysisUpdate(BaseModel):
approved: bool

View File

@@ -0,0 +1,25 @@
from pydantic import BaseModel
from typing import Optional, List
class GPXData(BaseModel):
total_distance: float
elevation_gain: float
points: List[dict]
class RouteCreate(BaseModel):
name: str
description: Optional[str] = None
total_distance: float
elevation_gain: float
gpx_file_path: str
class Route(BaseModel):
id: str
name: str
description: Optional[str] = None
total_distance: float
elevation_gain: float
gpx_file_path: str
class Config:
orm_mode = True

View File

@@ -0,0 +1,19 @@
from pydantic import BaseModel
from datetime import datetime
from typing import List, Optional
from uuid import UUID
class PlanBase(BaseModel):
user_id: UUID
start_date: datetime
end_date: datetime
goal: str
class PlanCreate(PlanBase):
rule_ids: List[UUID]
class Plan(PlanBase):
id: UUID
class Config:
orm_mode = True

View File

@@ -0,0 +1,30 @@
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
class PromptBase(BaseModel):
action_type: str
model: Optional[str] = None
prompt_text: str
version: int = 1
active: bool = True
class PromptCreate(BaseModel):
action_type: str
prompt_text: str
model: Optional[str] = None
class PromptUpdate(BaseModel):
prompt_text: Optional[str] = None
active: Optional[bool] = None
class Prompt(PromptBase):
id: int
created_at: datetime
class Config:
orm_mode = True

View File

@@ -0,0 +1,17 @@
from pydantic import BaseModel
from typing import Optional
class RuleBase(BaseModel):
name: str
description: Optional[str] = None
condition: str
priority: int = 0
class RuleCreate(RuleBase):
pass
class Rule(RuleBase):
id: str
class Config:
orm_mode = True

View File

@@ -0,0 +1,40 @@
from pydantic import BaseModel
from typing import Optional, Dict, Any
from datetime import datetime
class WorkoutBase(BaseModel):
garmin_activity_id: str
activity_type: Optional[str] = None
start_time: datetime
duration_seconds: Optional[int] = None
distance_m: Optional[float] = None
avg_hr: Optional[int] = None
max_hr: Optional[int] = None
avg_power: Optional[float] = None
max_power: Optional[float] = None
avg_cadence: Optional[float] = None
elevation_gain_m: Optional[float] = None
metrics: Optional[Dict[str, Any]] = None
class WorkoutCreate(WorkoutBase):
plan_id: Optional[int] = None
class Workout(WorkoutBase):
id: int
plan_id: Optional[int] = None
class Config:
orm_mode = True
class WorkoutSyncStatus(BaseModel):
status: str
last_sync_time: Optional[datetime] = None
activities_synced: int = 0
error_message: Optional[str] = None
class Config:
orm_mode = True