""" Food service for managing food operations """ from typing import Optional, List, Dict, Any, Union from sqlalchemy.orm import Session from app import models, schemas def get(db: Session, food_id: int) -> Optional[models.Food]: """ Get a food item by ID """ return db.query(models.Food).filter(models.Food.id == food_id).first() def get_multi( db: Session, *, skip: int = 0, limit: int = 100, name_filter: Optional[str] = None ) -> List[models.Food]: """ Get multiple food items, with optional name filter """ query = db.query(models.Food) if name_filter: query = query.filter(models.Food.name.ilike(f"%{name_filter}%")) return query.order_by(models.Food.name).offset(skip).limit(limit).all() def get_multi_by_user( db: Session, *, user_id: int, skip: int = 0, limit: int = 100 ) -> List[models.Food]: """ Get multiple food items created by a specific user """ return ( db.query(models.Food) .filter(models.Food.created_by_id == user_id) .order_by(models.Food.name) .offset(skip) .limit(limit) .all() ) def create( db: Session, *, obj_in: schemas.FoodCreate, created_by_id: Optional[int] = None ) -> models.Food: """ Create a new food item """ db_obj = models.Food( name=obj_in.name, description=obj_in.description, calories_per_100g=obj_in.calories_per_100g, protein_g=obj_in.protein_g, carbs_g=obj_in.carbs_g, fat_g=obj_in.fat_g, fiber_g=obj_in.fiber_g, is_verified=obj_in.is_verified, created_by_id=created_by_id, ) db.add(db_obj) db.commit() db.refresh(db_obj) return db_obj def update( db: Session, *, db_obj: models.Food, obj_in: Union[schemas.FoodUpdate, Dict[str, Any]] ) -> models.Food: """ Update a food item """ if isinstance(obj_in, dict): update_data = obj_in else: update_data = obj_in.model_dump(exclude_unset=True) for field in update_data: if hasattr(db_obj, field): setattr(db_obj, field, update_data[field]) db.add(db_obj) db.commit() db.refresh(db_obj) return db_obj def delete(db: Session, *, food_id: int) -> models.Food: """ Delete a food item """ food = db.query(models.Food).filter(models.Food.id == food_id).first() db.delete(food) db.commit() return food