File size: 3,168 Bytes
89b8989
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List, Dict, Any, Optional
from datetime import datetime
from ..services.meal_service import MealService
from ..database import get_db
from pydantic import BaseModel

router = APIRouter(prefix="/api/meals", tags=["Meals"])

class MealCreate(BaseModel):
    food_name: str
    meal_type: str
    portion_size: str
    meal_date: datetime
    nutrition: Dict[str, float]
    image_url: Optional[str] = None
    ai_analysis: Optional[Dict[str, Any]] = None

class DateRange(BaseModel):
    start_date: datetime
    end_date: datetime
    meal_type: Optional[str] = None

@router.post("/log")
async def create_meal_log(
    meal: MealCreate,
    db: Session = Depends(get_db)
) -> Dict[str, Any]:
    """創建新的用餐記錄"""
    meal_service = MealService(db)
    try:
        meal_log = meal_service.create_meal_log(
            food_name=meal.food_name,
            meal_type=meal.meal_type,
            portion_size=meal.portion_size,
            nutrition=meal.nutrition,
            meal_date=meal.meal_date,
            image_url=meal.image_url,
            ai_analysis=meal.ai_analysis
        )
        return {
            "success": True,
            "message": "用餐記錄已創建",
            "data": {
                "id": meal_log.id,
                "food_name": meal_log.food_name,
                "meal_type": meal_log.meal_type,
                "meal_date": meal_log.meal_date
            }
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/list")
async def get_meal_logs(
    date_range: DateRange,
    db: Session = Depends(get_db)
) -> Dict[str, Any]:
    """獲取用餐記錄列表"""
    meal_service = MealService(db)
    try:
        logs = meal_service.get_meal_logs(
            start_date=date_range.start_date,
            end_date=date_range.end_date,
            meal_type=date_range.meal_type
        )
        return {
            "success": True,
            "data": [{
                "id": log.id,
                "food_name": log.food_name,
                "meal_type": log.meal_type,
                "portion_size": log.portion_size,
                "calories": log.calories,
                "protein": log.protein,
                "carbs": log.carbs,
                "fat": log.fat,
                "meal_date": log.meal_date,
                "image_url": log.image_url
            } for log in logs]
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@router.post("/nutrition-summary")
async def get_nutrition_summary(
    date_range: DateRange,
    db: Session = Depends(get_db)
) -> Dict[str, Any]:
    """獲取營養攝入總結"""
    meal_service = MealService(db)
    try:
        summary = meal_service.get_nutrition_summary(
            start_date=date_range.start_date,
            end_date=date_range.end_date
        )
        return {
            "success": True,
            "data": summary
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))