119 lines
3.2 KiB
Python
119 lines
3.2 KiB
Python
from typing import List, Dict, Optional, Union, Any
|
|
from decimal import Decimal
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy import or_
|
|
from models.food_menu import FoodMenu
|
|
from schemas.food_menu import FoodMenuCreate, FoodMenuUpdate
|
|
|
|
def validate_price(price: Decimal) -> bool:
|
|
"""
|
|
Validate if price is within acceptable range and format.
|
|
|
|
Args:
|
|
price: Price to validate
|
|
|
|
Returns:
|
|
bool: True if price is valid, False otherwise
|
|
"""
|
|
try:
|
|
if price <= 0 or price > 99999.99:
|
|
return False
|
|
return True
|
|
except (TypeError, ValueError):
|
|
return False
|
|
|
|
def get_available_menu_items(
|
|
db: Session,
|
|
category: Optional[str] = None,
|
|
price_range: Optional[tuple[Decimal, Decimal]] = None
|
|
) -> List[FoodMenu]:
|
|
"""
|
|
Get available menu items with optional filtering.
|
|
|
|
Args:
|
|
db: Database session
|
|
category: Optional category filter
|
|
price_range: Optional tuple of (min_price, max_price)
|
|
|
|
Returns:
|
|
List of available menu items matching criteria
|
|
"""
|
|
query = db.query(FoodMenu).filter(FoodMenu.is_available == True)
|
|
|
|
if category:
|
|
query = query.filter(FoodMenu.category == category)
|
|
|
|
if price_range:
|
|
min_price, max_price = price_range
|
|
query = query.filter(FoodMenu.price.between(min_price, max_price))
|
|
|
|
return query.all()
|
|
|
|
def search_menu_items(
|
|
db: Session,
|
|
search_term: str,
|
|
include_unavailable: bool = False
|
|
) -> List[FoodMenu]:
|
|
"""
|
|
Search menu items by name, description or ingredients.
|
|
|
|
Args:
|
|
db: Database session
|
|
search_term: Term to search for
|
|
include_unavailable: Whether to include unavailable items
|
|
|
|
Returns:
|
|
List of menu items matching search criteria
|
|
"""
|
|
query = db.query(FoodMenu)
|
|
|
|
if not include_unavailable:
|
|
query = query.filter(FoodMenu.is_available == True)
|
|
|
|
return query.filter(
|
|
or_(
|
|
FoodMenu.name.ilike(f"%{search_term}%"),
|
|
FoodMenu.description.ilike(f"%{search_term}%"),
|
|
FoodMenu.ingredients.ilike(f"%{search_term}%")
|
|
)
|
|
).all()
|
|
|
|
def get_menu_items_by_allergens(
|
|
db: Session,
|
|
exclude_allergens: List[str]
|
|
) -> List[FoodMenu]:
|
|
"""
|
|
Get menu items excluding specific allergens.
|
|
|
|
Args:
|
|
db: Database session
|
|
exclude_allergens: List of allergens to exclude
|
|
|
|
Returns:
|
|
List of menu items without specified allergens
|
|
"""
|
|
query = db.query(FoodMenu).filter(FoodMenu.is_available == True)
|
|
|
|
for allergen in exclude_allergens:
|
|
query = query.filter(~FoodMenu.allergens.ilike(f"%{allergen}%"))
|
|
|
|
return query.all()
|
|
|
|
def get_quick_meals(
|
|
db: Session,
|
|
max_prep_time: int = 15
|
|
) -> List[FoodMenu]:
|
|
"""
|
|
Get available meals with preparation time under specified minutes.
|
|
|
|
Args:
|
|
db: Database session
|
|
max_prep_time: Maximum preparation time in minutes
|
|
|
|
Returns:
|
|
List of quick-to-prepare menu items
|
|
"""
|
|
return db.query(FoodMenu).filter(
|
|
FoodMenu.is_available == True,
|
|
FoodMenu.preparation_time <= max_prep_time
|
|
).all() |