GET /training/training_plans
取得訓練計畫列表。
Headers
| Header | 值 | 必填 |
|---|
| `x-api-key` | API Key | ✅ |
Query Parameters
| 參數 | 類型 | 說明 |
|---|
| `org_id` | string | 組織 ID(取得組織專屬計畫) |
| `distance` | string | 距離篩選(`start`, `5k`, `half`, `full`) |
| `goal` | string | 目標篩選(`finish`, `time_target`, `base_building`, `maintenance`) |
| `page` | int | 頁碼(預設 1) |
| `page_size` | int | 每頁數量(預設 20) |
| `level` | string | 難度(`beginner`, `intermediate`, `advanced`) |
Response (200)
| 欄位 | 類型 | 說明 |
|---|
| `training_plans` | array | 計畫列表 |
| `count` | number | 總數 |
| `page` | number | 目前頁碼 |
Training Plan 物件
| 欄位 | 類型 | 說明 |
|---|
| `training_plan_id` | string | 計畫 ID |
| `name` | string | 計畫名稱 |
| `description` | string | 描述 |
| `weeks` | number | 總週數 |
| `days_per_week` | number | 每週訓練天數 |
| `level` | string | 難度等級 |
| `distance` | string | 目標距離分類 |
| `goal` | string | 目標類型 |
| `cover_image_url` | string | 封面圖 URL |
| `visibility` | string | 可見度(`public`, `private`, `organization`) |
| `org_id` | string | 所屬組織 |
| `created_by` | string | 建立者 ID |
| `content` | array | 每日課表內容 |
| `created_at` | number | 建立時間(epoch ms) |
GET /training/training_plans/{training_plan_id}
取得單一訓練計畫完整資料(含所有 content)。
POST /training/training_plans
建立新訓練計畫。
Request Body
| 參數 | 類型 | 必填 | 說明 |
|---|
| `name` | string | ✅ | 計畫名稱 |
| `description` | string | ❌ | 描述 |
| `weeks` | number | ✅ | 總週數 |
| `days_per_week` | number | ✅ | 每週訓練天數 |
| `level` | string | ❌ | 難度(`beginner`, `intermediate`, `advanced`) |
| `distance` | string | ❌ | 距離分類(`start`, `5k`, `half`, `full`) |
| `goal` | string | ❌ | 目標(`finish`, `time_target`, `base_building`, `maintenance`) |
| `visibility` | string | ❌ | 可見度(預設 `organization`) |
| `org_id` | string | ❌ | 組織 ID |
| `content` | array | ✅ | 每日課表(見下方) |
Content 陣列項目
每個 content item 代表一天的課表:
| 欄位 | 類型 | 必填 | 說明 |
|---|
| `week` | number | ✅ | 第幾週(從 1 開始) |
| `day` | string | ✅ | 星期幾(`monday` - `sunday`) |
| `workout_name` | string | ✅ | 課表名稱(例如「輕鬆跑」) |
| `workout_type` | string | ✅ | 類型 |
| `workout_sub_type` | string | ❌ | 子類型 |
| `workout_description` | string | ❌ | 文字描述 |
| `workout_description_cards` | array | ❌ | 結構化說明卡片 |
| `content_blocks` | array | ❌ | 結構化課表步驟 |
| `target_distance_in_meters` | number | ❌ | 目標距離(公尺) |
| `target_duration_in_seconds` | number | ❌ | 目標時間(秒) |
Content Block 結構(課表步驟)
| 欄位 | 類型 | 說明 |
|---|
| `block_name` | string | 步驟名稱(`warmup`, `main`, `cooldown`, `repeat`) |
| `type` | string | 區塊類型 |
| `block_distance_in_meters` | number | 距離 |
| `block_pace` | string | 目標配速描述 |
| `block_duration_in_seconds` | number | 時間 |
| `repeat_count` | number | 重複次數(間歇用) |
Workout Description Cards 結構
| 欄位 | 類型 | 說明 |
|---|
| `id` | string | 卡片 ID |
| `title` | string | 卡片標題 |
| `content` | string | 內容(HTML) |
PUT /training/training_plans/{training_plan_id}
更新訓練計畫。Request body 同 POST,所有欄位選填。
DELETE /training/training_plans/{training_plan_id}
刪除訓練計畫。
POST /training/vdot/calculate
計算 VDOT 值和建議區間。
Request Body
| 參數 | 類型 | 必填 | 說明 |
|---|
| `distance` | string | ✅ | 距離(`5k`, `10k`, `half`, `full`) |
| `time` | string | ✅ | 完賽時間(HH:MM:SS) |
Response (200)
| 欄位 | 類型 | 說明 |
|---|
| `vdot` | number | VDOT 值 |
| `paces` | object | 各區間建議配速 |