From 5be2e33b6d867660f041376f36abc45e42ea590d Mon Sep 17 00:00:00 2001 From: Backend IM Bot Date: Thu, 27 Mar 2025 12:58:59 +0000 Subject: [PATCH] Add helper functions for FoodMenu --- helpers/foodmenu_helpers.py | 119 ++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 helpers/foodmenu_helpers.py diff --git a/helpers/foodmenu_helpers.py b/helpers/foodmenu_helpers.py new file mode 100644 index 0000000..148b49d --- /dev/null +++ b/helpers/foodmenu_helpers.py @@ -0,0 +1,119 @@ +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() \ No newline at end of file