77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
from datetime import datetime, timezone
|
|
from enum import Enum
|
|
from typing import Optional
|
|
|
|
from sqlmodel import Field, SQLModel
|
|
|
|
|
|
class MealType(str, Enum):
|
|
breakfast = "breakfast"
|
|
lunch = "lunch"
|
|
dinner = "dinner"
|
|
snack = "snack"
|
|
|
|
|
|
class User(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
username: str = Field(unique=True, index=True)
|
|
hashed_password: str
|
|
calorie_goal: float = 2000
|
|
protein_goal: float = 100
|
|
carbs_goal: float = 250
|
|
fat_goal: float = 70
|
|
|
|
|
|
class Product(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
barcode: str = Field(unique=True, index=True)
|
|
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 FoodLog(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
user_id: int = Field(foreign_key="user.id", index=True)
|
|
barcode: Optional[str] = Field(default=None, index=True)
|
|
name: str
|
|
meal_type: MealType = MealType.snack
|
|
amount_g: float
|
|
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
|
|
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
|
|
|
|
|
class Dish(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
user_id: int = Field(foreign_key="user.id", index=True)
|
|
product_barcode: str = Field(foreign_key="product.barcode", unique=True, index=True)
|
|
name: str
|
|
instructions: Optional[str] = None
|
|
total_weight_g: float
|
|
|
|
|
|
class DishIngredient(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
dish_id: int = Field(foreign_key="dish.id", index=True)
|
|
product_barcode: str = Field(foreign_key="product.barcode")
|
|
amount_g: float
|
|
|
|
|
|
class DishShare(SQLModel, table=True):
|
|
id: Optional[int] = Field(default=None, primary_key=True)
|
|
dish_id: int = Field(foreign_key="dish.id", index=True)
|
|
shared_with_user_id: int = Field(foreign_key="user.id", index=True)
|