munch-ease-backend/meals/service.py

54 lines
1.5 KiB
Python

from __future__ import annotations
from typing import List, Set
from persons import Person
from meals.db import Meal
def get_duplicates(items: List[Person]) -> Set[str]:
"""Return the set of duplicate person names based on repeated ids."""
seen: set[int] = set()
duplicates: set[str] = set()
for item in items:
if item.id in seen:
duplicates.add(item.name)
seen.add(item.id)
return duplicates
def validate_meal(meal: Meal) -> str | None:
"""Validate a Meal domain model.
Returns:
None if valid, otherwise a human-readable error message.
"""
if not meal.chefs:
return "Meal must have at least one chef"
if not meal.cleanup:
return "Meal must have at least one cleanup person"
if not meal.consumers:
return "Meal must have at least one consumer"
if len(meal.recipes) == 0 and len(meal.extra_ingredients) == 0:
return "Meal must have at least one recipe or ingredient"
duplicates = get_duplicates(meal.chefs)
if duplicates:
return f"Duplicate chef: {', '.join(duplicates)}"
duplicates = get_duplicates(meal.cleanup)
if duplicates:
return f"Duplicate cleanup person: {', '.join(duplicates)}"
duplicates = get_duplicates(meal.consumers)
if duplicates:
return f"Duplicate consumer: {', '.join(duplicates)}"
zero_servings = [r for r in meal.recipes if r.servings == 0]
if zero_servings:
return "Recipe servings must be greater than 0"
return None