596 lines
16 KiB
Markdown
596 lines
16 KiB
Markdown
# 特殊任務系統 API
|
||
|
||
## 📋 概述
|
||
Drama Ling 的每日任務系統,提供4種任務類型,透過遊戲化機制增加用戶黏性和學習動機。
|
||
|
||
## 🎯 任務系統特色
|
||
|
||
### 4種任務類型
|
||
1. **詞彙認識挑戰** - 詞彙認識關卡三星通關
|
||
2. **詞彙熟悉挑戰** - 詞彙熟悉關卡三星通關
|
||
3. **對話訓練挑戰** - 對話訓練關卡完成通關
|
||
4. **完美對話挑戰** - 對話訓練關卡滿星評價
|
||
|
||
### 任務機制
|
||
- **每日重置** - 每日 00:00 (GMT+8) 重新生成任務
|
||
- **完成獎勵** - 經驗值、鑽石、成就等獎勵
|
||
- **進度追蹤** - 即時更新任務完成進度
|
||
- **限時完成** - 當日 23:59:59 前完成
|
||
|
||
## 📌 API 端點
|
||
|
||
### 1. 獲取今日任務
|
||
```http
|
||
GET /api/v1/missions/daily
|
||
Authorization: Bearer <access_token>
|
||
```
|
||
|
||
#### 查詢參數
|
||
- `include_history`: 是否包含歷史完成記錄 (`true`/`false`)
|
||
- `timezone`: 用戶時區 (預設 `Asia/Taipei`)
|
||
|
||
#### 回應範例
|
||
```http
|
||
Response 200 OK
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"mission_date": "2024-09-07",
|
||
"timezone": "Asia/Taipei",
|
||
"reset_time": "2024-09-08T00:00:00+08:00",
|
||
"time_remaining": {
|
||
"hours": 14,
|
||
"minutes": 25,
|
||
"seconds": 30
|
||
},
|
||
"daily_missions": [
|
||
{
|
||
"mission_id": "MISSION_VOCAB_RECOGNITION_20240907",
|
||
"type": "vocabulary_recognition",
|
||
"priority": 1,
|
||
"title": "詞彙認識挑戰",
|
||
"description": "在詞彙認識關卡獲得三星評價1次",
|
||
"icon": "🎯",
|
||
"category": "vocabulary",
|
||
"difficulty": "normal",
|
||
"estimated_time": 5, // minutes
|
||
"objectives": [
|
||
{
|
||
"objective_id": "OBJ_VOCAB_RECOGNITION_3STAR",
|
||
"description": "詞彙認識關卡三星通關",
|
||
"target_value": 1,
|
||
"current_value": 0,
|
||
"unit": "次",
|
||
"completion_criteria": "three_star_completion",
|
||
"progress_percentage": 0
|
||
}
|
||
],
|
||
"rewards": {
|
||
"primary_reward": {
|
||
"type": "experience_points",
|
||
"amount": 50,
|
||
"description": "獲得50經驗值"
|
||
},
|
||
"bonus_rewards": [
|
||
{
|
||
"type": "diamonds",
|
||
"amount": 5,
|
||
"description": "獲得5鑽石"
|
||
}
|
||
]
|
||
},
|
||
"status": "available", // available, in_progress, completed, expired
|
||
"deadline": "2024-09-07T23:59:59+08:00",
|
||
"completion_tracking": {
|
||
"started_at": null,
|
||
"completed_at": null,
|
||
"attempts": 0,
|
||
"last_attempt_at": null
|
||
}
|
||
},
|
||
{
|
||
"mission_id": "MISSION_VOCAB_FLUENCY_20240907",
|
||
"type": "vocabulary_fluency",
|
||
"priority": 2,
|
||
"title": "詞彙熟悉挑戰",
|
||
"description": "在詞彙熟悉關卡獲得三星評價1次",
|
||
"icon": "💪",
|
||
"category": "vocabulary",
|
||
"difficulty": "normal",
|
||
"estimated_time": 8,
|
||
"objectives": [
|
||
{
|
||
"objective_id": "OBJ_VOCAB_FLUENCY_3STAR",
|
||
"description": "詞彙熟悉關卡三星通關",
|
||
"target_value": 1,
|
||
"current_value": 0,
|
||
"unit": "次",
|
||
"completion_criteria": "three_star_completion",
|
||
"progress_percentage": 0
|
||
}
|
||
],
|
||
"rewards": {
|
||
"primary_reward": {
|
||
"type": "experience_points",
|
||
"amount": 50,
|
||
"description": "獲得50經驗值"
|
||
},
|
||
"bonus_rewards": [
|
||
{
|
||
"type": "diamonds",
|
||
"amount": 5,
|
||
"description": "獲得5鑽石"
|
||
}
|
||
]
|
||
},
|
||
"status": "available",
|
||
"deadline": "2024-09-07T23:59:59+08:00"
|
||
},
|
||
{
|
||
"mission_id": "MISSION_DIALOGUE_TRAINING_20240907",
|
||
"type": "dialogue_training",
|
||
"priority": 3,
|
||
"title": "對話訓練挑戰",
|
||
"description": "完成對話訓練關卡1次",
|
||
"icon": "💬",
|
||
"category": "dialogue",
|
||
"difficulty": "normal",
|
||
"estimated_time": 15,
|
||
"requires_subscription": true,
|
||
"objectives": [
|
||
{
|
||
"objective_id": "OBJ_DIALOGUE_COMPLETION",
|
||
"description": "完成對話訓練關卡",
|
||
"target_value": 1,
|
||
"current_value": 1,
|
||
"unit": "次",
|
||
"completion_criteria": "completion_only",
|
||
"progress_percentage": 100
|
||
}
|
||
],
|
||
"rewards": {
|
||
"primary_reward": {
|
||
"type": "experience_points",
|
||
"amount": 75,
|
||
"description": "獲得75經驗值"
|
||
},
|
||
"bonus_rewards": [
|
||
{
|
||
"type": "diamonds",
|
||
"amount": 10,
|
||
"description": "獲得10鑽石"
|
||
}
|
||
]
|
||
},
|
||
"status": "completed",
|
||
"deadline": "2024-09-07T23:59:59+08:00",
|
||
"completed_at": "2024-09-07T14:30:00+08:00",
|
||
"reward_claimed": false
|
||
},
|
||
{
|
||
"mission_id": "MISSION_PERFECT_DIALOGUE_20240907",
|
||
"type": "perfect_dialogue",
|
||
"priority": 4,
|
||
"title": "完美對話挑戰",
|
||
"description": "在對話訓練關卡獲得滿星評價1次",
|
||
"icon": "⭐",
|
||
"category": "dialogue",
|
||
"difficulty": "hard",
|
||
"estimated_time": 20,
|
||
"requires_subscription": true,
|
||
"objectives": [
|
||
{
|
||
"objective_id": "OBJ_PERFECT_DIALOGUE",
|
||
"description": "對話訓練關卡獲得滿星評價",
|
||
"target_value": 1,
|
||
"current_value": 0,
|
||
"unit": "次",
|
||
"completion_criteria": "perfect_score", // score >= 90
|
||
"progress_percentage": 0
|
||
}
|
||
],
|
||
"rewards": {
|
||
"primary_reward": {
|
||
"type": "experience_points",
|
||
"amount": 100,
|
||
"description": "獲得100經驗值"
|
||
},
|
||
"bonus_rewards": [
|
||
{
|
||
"type": "diamonds",
|
||
"amount": 20,
|
||
"description": "獲得20鑽石"
|
||
},
|
||
{
|
||
"type": "achievement",
|
||
"achievement_id": "daily_perfectionist",
|
||
"description": "解鎖「每日完美主義者」成就"
|
||
}
|
||
]
|
||
},
|
||
"status": "available",
|
||
"deadline": "2024-09-07T23:59:59+08:00"
|
||
}
|
||
],
|
||
"daily_summary": {
|
||
"total_missions": 4,
|
||
"completed_missions": 1,
|
||
"available_missions": 3,
|
||
"completion_percentage": 25,
|
||
"total_rewards_earned": {
|
||
"experience_points": 0, // 未領取的獎勵
|
||
"diamonds": 0
|
||
},
|
||
"total_rewards_available": {
|
||
"experience_points": 275,
|
||
"diamonds": 40
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. 任務進度更新 (系統內部調用)
|
||
```http
|
||
POST /api/v1/missions/progress-update
|
||
Authorization: Bearer <access_token>
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"trigger_event": "dialogue_completed", // vocabulary_completed, dialogue_completed, perfect_score_achieved
|
||
"event_context": {
|
||
"activity_type": "dialogue_training",
|
||
"scenario_id": "SC_Restaurant_01",
|
||
"completion_score": 85,
|
||
"is_three_star": false,
|
||
"is_perfect_score": false,
|
||
"completed_at": "2024-09-07T15:30:00+08:00"
|
||
},
|
||
"user_context": {
|
||
"subscription_status": "active",
|
||
"current_level": "B1"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 回應範例
|
||
```http
|
||
Response 200 OK
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"progress_updates": [
|
||
{
|
||
"mission_id": "MISSION_DIALOGUE_TRAINING_20240907",
|
||
"previous_progress": {
|
||
"current_value": 0,
|
||
"progress_percentage": 0
|
||
},
|
||
"updated_progress": {
|
||
"current_value": 1,
|
||
"progress_percentage": 100
|
||
},
|
||
"mission_completed": true,
|
||
"completion_time": "2024-09-07T15:30:00+08:00"
|
||
}
|
||
],
|
||
"missions_completed_count": 1,
|
||
"rewards_unlocked": [
|
||
{
|
||
"mission_id": "MISSION_DIALOGUE_TRAINING_20240907",
|
||
"rewards": [
|
||
{
|
||
"type": "experience_points",
|
||
"amount": 75
|
||
},
|
||
{
|
||
"type": "diamonds",
|
||
"amount": 10
|
||
}
|
||
]
|
||
}
|
||
]
|
||
},
|
||
"message": "Mission progress updated successfully"
|
||
}
|
||
```
|
||
|
||
### 3. 領取任務獎勵
|
||
```http
|
||
POST /api/v1/missions/{mission_id}/claim-reward
|
||
Authorization: Bearer <access_token>
|
||
```
|
||
|
||
#### 回應範例
|
||
```http
|
||
Response 200 OK
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"mission_id": "MISSION_DIALOGUE_TRAINING_20240907",
|
||
"rewards_claimed": [
|
||
{
|
||
"type": "experience_points",
|
||
"amount": 75,
|
||
"previous_total": 1250,
|
||
"new_total": 1325
|
||
},
|
||
{
|
||
"type": "diamonds",
|
||
"amount": 10,
|
||
"previous_total": 45,
|
||
"new_total": 55
|
||
}
|
||
],
|
||
"achievements_unlocked": [
|
||
{
|
||
"achievement_id": "daily_dialogue_master",
|
||
"name": "每日對話大師",
|
||
"description": "完成對話訓練每日任務10次"
|
||
}
|
||
],
|
||
"mission_status": "reward_claimed",
|
||
"claimed_at": "2024-09-07T15:45:00+08:00"
|
||
},
|
||
"message": "Rewards claimed successfully"
|
||
}
|
||
```
|
||
|
||
### 4. 獲取任務歷史
|
||
```http
|
||
GET /api/v1/missions/history
|
||
Authorization: Bearer <access_token>
|
||
```
|
||
|
||
#### 查詢參數
|
||
- `date_from`: 開始日期 (`YYYY-MM-DD`)
|
||
- `date_to`: 結束日期 (`YYYY-MM-DD`)
|
||
- `mission_type`: 任務類型篩選
|
||
- `status`: 完成狀態篩選 (`completed`, `expired`, `all`)
|
||
- `page`: 頁碼 (預設 1)
|
||
- `limit`: 每頁筆數 (預設 7, 最大 30)
|
||
|
||
#### 回應範例
|
||
```http
|
||
Response 200 OK
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"mission_history": [
|
||
{
|
||
"date": "2024-09-07",
|
||
"missions_summary": {
|
||
"total_missions": 4,
|
||
"completed_missions": 2,
|
||
"completion_rate": 0.5
|
||
},
|
||
"missions": [
|
||
{
|
||
"mission_id": "MISSION_VOCAB_RECOGNITION_20240907",
|
||
"title": "詞彙認識挑戰",
|
||
"status": "completed",
|
||
"completed_at": "2024-09-07T10:15:00+08:00",
|
||
"rewards_claimed": true
|
||
},
|
||
{
|
||
"mission_id": "MISSION_DIALOGUE_TRAINING_20240907",
|
||
"title": "對話訓練挑戰",
|
||
"status": "completed",
|
||
"completed_at": "2024-09-07T15:30:00+08:00",
|
||
"rewards_claimed": true
|
||
}
|
||
],
|
||
"total_rewards_earned": {
|
||
"experience_points": 125,
|
||
"diamonds": 15
|
||
}
|
||
},
|
||
{
|
||
"date": "2024-09-06",
|
||
"missions_summary": {
|
||
"total_missions": 4,
|
||
"completed_missions": 4,
|
||
"completion_rate": 1.0
|
||
},
|
||
"total_rewards_earned": {
|
||
"experience_points": 275,
|
||
"diamonds": 40
|
||
},
|
||
"perfect_day_bonus": {
|
||
"type": "diamonds",
|
||
"amount": 10,
|
||
"description": "完美一天獎勵"
|
||
}
|
||
}
|
||
],
|
||
"statistics": {
|
||
"total_days": 7,
|
||
"perfect_days": 1,
|
||
"average_completion_rate": 0.75,
|
||
"total_rewards": {
|
||
"experience_points": 1850,
|
||
"diamonds": 275
|
||
},
|
||
"streak_info": {
|
||
"current_streak": 3,
|
||
"longest_streak": 5,
|
||
"streak_type": "daily_completion"
|
||
}
|
||
},
|
||
"pagination": {
|
||
"current_page": 1,
|
||
"total_pages": 1,
|
||
"total_items": 7
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 5. 每日任務重置 (系統內部調用)
|
||
```http
|
||
POST /api/v1/missions/daily-reset
|
||
Authorization: Bearer <system_token>
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"reset_date": "2024-09-08",
|
||
"timezone": "Asia/Taipei",
|
||
"user_filters": {
|
||
"active_users_only": true,
|
||
"subscription_status": "all" // all, active, inactive
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 回應範例
|
||
```http
|
||
Response 200 OK
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"reset_summary": {
|
||
"reset_date": "2024-09-08",
|
||
"users_processed": 15430,
|
||
"missions_generated": 61720,
|
||
"processing_time_ms": 2500
|
||
},
|
||
"mission_generation": {
|
||
"vocabulary_recognition": 15430,
|
||
"vocabulary_fluency": 15430,
|
||
"dialogue_training": 15430,
|
||
"perfect_dialogue": 15430
|
||
},
|
||
"previous_day_stats": {
|
||
"total_completed_missions": 42890,
|
||
"completion_rate": 0.69,
|
||
"perfect_completion_users": 1820
|
||
}
|
||
},
|
||
"message": "Daily missions reset successfully"
|
||
}
|
||
```
|
||
|
||
### 6. 獲取任務統計
|
||
```http
|
||
GET /api/v1/missions/statistics
|
||
Authorization: Bearer <access_token>
|
||
```
|
||
|
||
#### 查詢參數
|
||
- `period`: 統計週期 (`week`, `month`, `quarter`, `year`)
|
||
- `mission_type`: 特定任務類型 (可選)
|
||
|
||
#### 回應範例
|
||
```http
|
||
Response 200 OK
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"period": "month",
|
||
"date_range": {
|
||
"start_date": "2024-08-01",
|
||
"end_date": "2024-08-31"
|
||
},
|
||
"mission_completion_stats": {
|
||
"total_missions_available": 124, // 31 days × 4 missions
|
||
"total_missions_completed": 89,
|
||
"overall_completion_rate": 0.72,
|
||
"by_mission_type": {
|
||
"vocabulary_recognition": {
|
||
"available": 31,
|
||
"completed": 28,
|
||
"completion_rate": 0.90
|
||
},
|
||
"vocabulary_fluency": {
|
||
"available": 31,
|
||
"completed": 25,
|
||
"completion_rate": 0.81
|
||
},
|
||
"dialogue_training": {
|
||
"available": 31,
|
||
"completed": 22,
|
||
"completion_rate": 0.71
|
||
},
|
||
"perfect_dialogue": {
|
||
"available": 31,
|
||
"completed": 14,
|
||
"completion_rate": 0.45
|
||
}
|
||
}
|
||
},
|
||
"streak_performance": {
|
||
"longest_streak": 12,
|
||
"current_streak": 5,
|
||
"perfect_days": 3, // 完成所有任務的天數
|
||
"streak_breaks": 2
|
||
},
|
||
"rewards_earned": {
|
||
"total_experience_points": 6725,
|
||
"total_diamonds": 890,
|
||
"achievements_unlocked": 5,
|
||
"perfect_day_bonuses": 3
|
||
},
|
||
"performance_trends": {
|
||
"best_performing_day": "Monday",
|
||
"completion_rate_trend": "improving", // improving, stable, declining
|
||
"average_completion_time": 25.4 // minutes per day
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🎯 任務完成條件
|
||
|
||
### 任務觸發檢查
|
||
| 任務類型 | 觸發事件 | 完成條件 | 檢查時機 |
|
||
|----------|----------|----------|----------|
|
||
| 詞彙認識挑戰 | 詞彙練習完成 | 三星評價 (≥90分) | 關卡結算時 |
|
||
| 詞彙熟悉挑戰 | 詞彙練習完成 | 三星評價 (≥90分) | 關卡結算時 |
|
||
| 對話訓練挑戰 | 對話練習完成 | 完成對話 (任意分數) | 對話結束時 |
|
||
| 完美對話挑戰 | 對話練習完成 | 滿星評價 (≥90分) | 對話結束時 |
|
||
|
||
### 系統檢查流程
|
||
1. 用戶完成學習活動
|
||
2. 系統調用 `progress-update` API
|
||
3. 檢查是否滿足任務完成條件
|
||
4. 更新任務進度
|
||
5. 自動解鎖獎勵 (待用戶領取)
|
||
|
||
## 🔧 錯誤處理
|
||
|
||
### 特殊任務相關錯誤
|
||
| 錯誤碼 | HTTP狀態 | 描述 | 處理建議 |
|
||
|--------|----------|------|----------|
|
||
| `MISSION_NOT_FOUND` | 404 | 任務不存在 | 檢查任務ID或刷新任務列表 |
|
||
| `MISSION_EXPIRED` | 410 | 任務已過期 | 等待新任務重置 |
|
||
| `MISSION_ALREADY_COMPLETED` | 409 | 任務已完成 | 檢查任務狀態 |
|
||
| `REWARD_ALREADY_CLAIMED` | 409 | 獎勵已領取 | 檢查獎勵狀態 |
|
||
| `MISSION_PROGRESS_UPDATE_FAILED` | 500 | 任務進度更新失敗 | 稍後重試 |
|
||
| `DAILY_RESET_FAILED` | 500 | 每日重置失敗 | 聯繫系統管理員 |
|
||
| `SUBSCRIPTION_REQUIRED_FOR_MISSION` | 403 | 任務需要訂閱權限 | 引導用戶訂閱 |
|
||
|
||
## 🧪 測試範例
|
||
|
||
### 獲取今日任務
|
||
```bash
|
||
curl -X GET "https://api.dramaling.com/api/v1/missions/daily" \
|
||
-H "Authorization: Bearer <access_token>"
|
||
```
|
||
|
||
### 領取任務獎勵
|
||
```bash
|
||
curl -X POST "https://api.dramaling.com/api/v1/missions/MISSION_DIALOGUE_TRAINING_20240907/claim-reward" \
|
||
-H "Authorization: Bearer <access_token>"
|
||
```
|
||
|
||
### 獲取任務歷史
|
||
```bash
|
||
curl -X GET "https://api.dramaling.com/api/v1/missions/history?date_from=2024-09-01&date_to=2024-09-07" \
|
||
-H "Authorization: Bearer <access_token>"
|
||
```
|
||
|
||
---
|
||
|
||
**模組負責人**: 遊戲化團隊 + 後端團隊
|
||
**最後更新**: 2024年9月7日
|
||
**相關文檔**: [用戶管理API](./user-management.md), [遊戲化系統API](./gamification.md) |