munch-ease-backend/api/ingredients.py

37 lines
1.4 KiB
Python
Raw Normal View History

2025-11-01 12:36:46 +00:00
from __future__ import annotations
from fastapi import APIRouter, Depends, Query
import aiosqlite
import ingredients as ingredients_mod
from api.deps import get_db, get_household_from_slug
router = APIRouter(prefix="/households/{householdSlug}/ingredients", tags=["ingredients"])
@router.get(
"/parse",
response_model=ingredients_mod.Ingredient | list[ingredients_mod.Ingredient],
summary="Parse an ingredient line or lines from a string",
)
2025-11-01 12:36:46 +00:00
async def parse_ingredient(
line: str | None = Query(None, description="Single ingredient line to parse"),
lines: list[str] | None = Query(None, description="Multiple ingredient lines to parse"),
2025-11-01 12:36:46 +00:00
household=Depends(get_household_from_slug),
conn: aiosqlite.Connection = Depends(get_db),
):
# Batch mode takes precedence if provided
if lines is not None:
parsed = [ingredients_mod.parse_ingredient_from_nlp(item_line) for item_line in lines]
matched = await ingredients_mod.match_existing_products(conn, parsed)
return matched
# Single line mode
if line is None:
from fastapi import HTTPException
raise HTTPException(status_code=422, detail="Query parameter 'line' or 'lines' is required")
parsed_one = ingredients_mod.parse_ingredient_from_nlp(line)
matched_one = await ingredients_mod.match_existing_products(conn, [parsed_one])
return matched_one[0]