from datetime import date as date_type from datetime import datetime from pydantic import BaseModel, ConfigDict from app.models import MealType class UserCreate(BaseModel): username: str password: str class UserRead(BaseModel): id: int username: str calorie_goal: float protein_goal: float carbs_goal: float fat_goal: float class UserSummary(BaseModel): username: str class GoalsUpdate(BaseModel): calorie_goal: float protein_goal: float carbs_goal: float fat_goal: float class Token(BaseModel): access_token: str token_type: str = "bearer" class TokenData(BaseModel): username: str | None = None class ProductBase(BaseModel): barcode: str name: str calories: float carbs: float protein: float fat: float sugar: float = 0.0 fiber: float = 0.0 saturated_fat: float = 0.0 salt: float = 0.0 class ProductCreate(ProductBase): barcode: str | None = None class ProductRead(ProductBase): pass class ProductSearchResult(ProductRead): last_amount_g: float | None = None is_dish: bool = False class LogCreate(BaseModel): barcode: str | None = None name: str | None = None amount_g: float meal_type: MealType class LogUpdate(BaseModel): amount_g: float | None = None meal_type: MealType | None = None class LogRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: int barcode: str | None name: str meal_type: MealType amount_g: float calories: float carbs: float protein: float fat: float sugar: float fiber: float saturated_fat: float salt: float timestamp: datetime class DailyTotals(BaseModel): calories: float carbs: float protein: float fat: float sugar: float fiber: float saturated_fat: float salt: float class DailyLogResponse(BaseModel): logs: list[LogRead] totals: DailyTotals class DailyHistoryEntry(BaseModel): date: date_type totals: DailyTotals class HistoryResponse(BaseModel): days: list[DailyHistoryEntry] class DishIngredientInput(BaseModel): barcode: str amount_g: float class DishIngredientRead(BaseModel): barcode: str name: str amount_g: float calories: float carbs: float protein: float fat: float sugar: float fiber: float saturated_fat: float salt: float class DishCreate(BaseModel): name: str instructions: str | None = None ingredients: list[DishIngredientInput] class DishRead(BaseModel): id: int name: str instructions: str | None barcode: str total_weight_g: float calories: float carbs: float protein: float fat: float sugar: float fiber: float saturated_fat: float salt: float ingredients: list[DishIngredientRead] is_owner: bool owner_username: str class DishShareCreate(BaseModel): username: str class DishShareRead(BaseModel): username: str