health-assistant / services /meal_service.py
yuting111222's picture
deploy: ๆŽจ้€ๅˆฐ Hugging Face Spaces
cb8b92c
from datetime import datetime
from typing import List, Dict, Any, Optional
from sqlalchemy.orm import Session
from models.meal_log import MealLog
class MealService:
def __init__(self, db: Session):
self.db = db
def create_meal_log(
self,
food_name: str,
meal_type: str,
portion_size: str,
nutrition: Dict[str, float],
meal_date: datetime,
image_url: Optional[str] = None,
ai_analysis: Optional[Dict[str, Any]] = None
) -> MealLog:
"""ๅ‰ตๅปบๆ–ฐ็š„็”จ้ค่จ˜้Œ„"""
meal_log = MealLog(
food_name=food_name,
meal_type=meal_type,
portion_size=portion_size,
calories=float(nutrition.get('calories', 0)),
protein=float(nutrition.get('protein', 0)),
carbs=float(nutrition.get('carbs', 0)),
fat=float(nutrition.get('fat', 0)),
fiber=float(nutrition.get('fiber', 0)),
meal_date=meal_date,
image_url=image_url,
ai_analysis=ai_analysis,
created_at=datetime.utcnow()
)
self.db.add(meal_log)
self.db.commit()
self.db.refresh(meal_log)
return meal_log
def get_meal_logs(
self,
start_date: Optional[datetime] = None,
end_date: Optional[datetime] = None,
meal_type: Optional[str] = None
) -> List[MealLog]:
"""็ฒๅ–็”จ้ค่จ˜้Œ„"""
query = self.db.query(MealLog)
if start_date:
query = query.filter(MealLog.meal_date >= start_date)
if end_date:
query = query.filter(MealLog.meal_date <= end_date)
if meal_type:
query = query.filter(MealLog.meal_type == meal_type)
return query.order_by(MealLog.meal_date.desc()).all()
def get_nutrition_summary(
self,
start_date: datetime,
end_date: datetime
) -> Dict[str, float]:
"""็ฒๅ–ๆŒ‡ๅฎšๆ™‚้–“็ฏ„ๅœๅ…ง็š„็‡Ÿ้คŠๆ”ๅ…ฅ็ธฝ็ต"""
meals = self.get_meal_logs(start_date, end_date)
summary: Dict[str, float] = {
'total_calories': 0.0,
'total_protein': 0.0,
'total_carbs': 0.0,
'total_fat': 0.0,
'total_fiber': 0.0
}
for meal in meals:
portion_size = getattr(meal, 'portion_size', 'medium')
calories = getattr(meal, 'calories', 0.0)
protein = getattr(meal, 'protein', 0.0)
carbs = getattr(meal, 'carbs', 0.0)
fat = getattr(meal, 'fat', 0.0)
fiber = getattr(meal, 'fiber', 0.0)
multiplier = {
'small': 0.7,
'medium': 1.0,
'large': 1.3
}.get(portion_size, 1.0)
summary['total_calories'] += float(calories) * multiplier
summary['total_protein'] += float(protein) * multiplier
summary['total_carbs'] += float(carbs) * multiplier
summary['total_fat'] += float(fat) * multiplier
summary['total_fiber'] += float(fiber) * multiplier
return summary