import sqlite3 import product, recipe, db from pydantic import BaseModel from typing import List, Annotated from fastapi import FastAPI, Depends, Query from fastapi.middleware.cors import CORSMiddleware app = FastAPI() # Add CORS middleware app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"] ) # Dependency to create SQLite connection async def get_db(): sql_db = await db.connect() try: yield sql_db finally: await sql_db.close() @app.get("/recipes/parse") async def parse_recipe_handler(url: str, conn: sqlite3.Connection = Depends(get_db)) -> recipe.Recipe: return await recipe.parse_recipe(conn, url) @app.get("/recipes/ingredients/parse") async def parse_ingredients(lines: Annotated[ List[str], Query(alias="ingredients", title="Array of ingredients to parse")], conn: sqlite3.Connection = Depends(get_db)) -> List[recipe.Ingredient]: ingredients = recipe.parse_ingredient_from_nlp(lines) recipe.match_existing_products(conn, ingredients) return ingredients class ProductUrl(BaseModel): url: str tags: List[str] = [] @app.post("/products/") async def create_product(url: ProductUrl, conn: sqlite3.Connection = Depends(get_db)) -> product.Product: return await product.get_or_create(conn, url.url, url.tags)