Add helper functions for Food
This commit is contained in:
parent
9e907a1c79
commit
290f4f9b47
123
helpers/food_helpers.py
Normal file
123
helpers/food_helpers.py
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
from typing import List, Dict, Optional, Union, Any
|
||||||
|
from datetime import datetime
|
||||||
|
from sqlalchemy.orm import Session
|
||||||
|
from sqlalchemy import and_, or_
|
||||||
|
from models.food import Food
|
||||||
|
from schemas.food import FoodCreate, FoodUpdate
|
||||||
|
|
||||||
|
def get_menu_items(db: Session, active_only: bool = True) -> List[Food]:
|
||||||
|
"""
|
||||||
|
Get list of food items in the menu.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
db: Database session
|
||||||
|
active_only: If True, returns only active menu items
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of Food objects from the menu
|
||||||
|
"""
|
||||||
|
query = db.query(Food)
|
||||||
|
if active_only:
|
||||||
|
query = query.filter(Food.is_active == True)
|
||||||
|
return query.all()
|
||||||
|
|
||||||
|
def filter_menu_by_category(
|
||||||
|
db: Session,
|
||||||
|
category: str,
|
||||||
|
active_only: bool = True
|
||||||
|
) -> List[Food]:
|
||||||
|
"""
|
||||||
|
Filter menu items by category.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
db: Database session
|
||||||
|
category: Food category to filter by
|
||||||
|
active_only: If True, returns only active menu items
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of Food objects filtered by category
|
||||||
|
"""
|
||||||
|
query = db.query(Food).filter(Food.category == category)
|
||||||
|
if active_only:
|
||||||
|
query = query.filter(Food.is_active == True)
|
||||||
|
return query.all()
|
||||||
|
|
||||||
|
def search_menu_items(
|
||||||
|
db: Session,
|
||||||
|
search_term: str,
|
||||||
|
active_only: bool = True
|
||||||
|
) -> List[Food]:
|
||||||
|
"""
|
||||||
|
Search menu items by name or description.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
db: Database session
|
||||||
|
search_term: Term to search for in name/description
|
||||||
|
active_only: If True, returns only active menu items
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of matching Food objects
|
||||||
|
"""
|
||||||
|
search = f"%{search_term}%"
|
||||||
|
query = db.query(Food).filter(
|
||||||
|
or_(
|
||||||
|
Food.name.ilike(search),
|
||||||
|
Food.description.ilike(search)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if active_only:
|
||||||
|
query = query.filter(Food.is_active == True)
|
||||||
|
return query.all()
|
||||||
|
|
||||||
|
def get_food_by_price_range(
|
||||||
|
db: Session,
|
||||||
|
min_price: float,
|
||||||
|
max_price: float,
|
||||||
|
active_only: bool = True
|
||||||
|
) -> List[Food]:
|
||||||
|
"""
|
||||||
|
Get menu items within a price range.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
db: Database session
|
||||||
|
min_price: Minimum price
|
||||||
|
max_price: Maximum price
|
||||||
|
active_only: If True, returns only active menu items
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of Food objects within price range
|
||||||
|
"""
|
||||||
|
query = db.query(Food).filter(
|
||||||
|
and_(
|
||||||
|
Food.price >= min_price,
|
||||||
|
Food.price <= max_price
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if active_only:
|
||||||
|
query = query.filter(Food.is_active == True)
|
||||||
|
return query.order_by(Food.price.asc()).all()
|
||||||
|
|
||||||
|
def format_menu_response(foods: List[Food]) -> List[Dict[str, Any]]:
|
||||||
|
"""
|
||||||
|
Format menu items for API response.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
foods: List of Food objects
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
List of formatted food dictionaries
|
||||||
|
"""
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"id": food.id,
|
||||||
|
"name": food.name,
|
||||||
|
"description": food.description,
|
||||||
|
"price": float(food.price),
|
||||||
|
"category": food.category,
|
||||||
|
"is_available": food.is_active,
|
||||||
|
"image_url": food.image_url,
|
||||||
|
"allergens": food.allergens,
|
||||||
|
"nutritional_info": food.nutritional_info
|
||||||
|
}
|
||||||
|
for food in foods
|
||||||
|
]
|
Loading…
x
Reference in New Issue
Block a user