munch-ease-backend/main.py

83 lines
2.8 KiB
Python
Raw Normal View History

2024-01-08 00:45:22 +00:00
import sqlite3
2024-01-13 01:54:04 +00:00
import product, recipe, db
2024-01-08 00:45:22 +00:00
2024-01-13 01:54:04 +00:00
from pydantic import BaseModel
from typing import List, Annotated
from fastapi import FastAPI, Depends, Query
2024-01-13 05:40:10 +00:00
from fastapi.responses import JSONResponse
2024-01-08 00:38:17 +00:00
from fastapi.middleware.cors import CORSMiddleware
2024-01-07 00:33:40 +00:00
app = FastAPI()
2024-01-08 00:38:17 +00:00
# Add CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"]
)
2024-01-07 00:33:40 +00:00
2024-01-08 00:38:17 +00:00
# Dependency to create SQLite connection
async def get_db():
sql_db = await db.connect()
try:
yield sql_db
finally:
2024-01-13 01:54:04 +00:00
await sql_db.close()
2024-01-08 00:38:17 +00:00
@app.get("/recipes/parse")
2024-01-13 03:21:38 +00:00
async def parse_recipe_handler(url: str, conn: sqlite3.Connection = Depends(get_db)) -> recipe.Recipe:
2024-01-13 05:40:10 +00:00
parsed = await recipe.parse_recipe(conn, url)
if not parsed:
return JSONResponse(status_code=400, content={'message': 'Recipe not found'})
return parsed
2024-01-08 00:45:22 +00:00
@app.get("/recipes/ingredients/parse")
2024-01-13 01:54:04 +00:00
async def parse_ingredients(lines: Annotated[
List[str],
Query(alias="ingredients",
title="Array of ingredients to parse")],
2024-01-13 03:21:38 +00:00
conn: sqlite3.Connection = Depends(get_db)) -> List[recipe.Ingredient]:
2024-01-08 00:45:22 +00:00
ingredients = recipe.parse_ingredient_from_nlp(lines)
recipe.match_existing_products(conn, ingredients)
return ingredients
2024-01-08 00:38:17 +00:00
2024-01-13 01:54:04 +00:00
class ProductUrl(BaseModel):
url: str
tags: List[str] = []
@app.post("/products/")
2024-01-13 03:21:38 +00:00
async def create_product(url: ProductUrl, conn: sqlite3.Connection = Depends(get_db)) -> product.Product:
2024-01-13 05:40:10 +00:00
return await product.get_or_create(conn, url.url, url.tags)
2024-01-13 06:59:35 +00:00
@app.get("/recipes/{recipe_id}")
async def get_recipe(recipe_id: int, conn: sqlite3.Connection = Depends(get_db)) -> recipe.Recipe:
r = await recipe.find_recipe_by_id(conn, recipe_id)
if not r:
return JSONResponse(status_code=404, content={'message': 'Recipe not found'})
r.ingredients = []
async for ingredient in recipe.find_ingredients_by_recipe_id(conn, recipe_id):
ingredient.product = await product.find_product_by_id(conn, ingredient.product_id)
r.ingredients.append(ingredient)
return r
2024-01-13 05:40:10 +00:00
@app.post('/recipes/')
async def create_recipe(item: recipe.Recipe, conn: sqlite3.Connection = Depends(get_db)) -> recipe.Recipe:
if not item.ingredients:
return JSONResponse(status_code=400, content={'message': 'Recipe must have at least one ingredient'})
for ingredient in item.ingredients:
if not ingredient.product:
return JSONResponse(status_code=400, content={'message': 'Ingredient must have a product'})
await recipe.insert_recipe(conn, item)
for ingredient in item.ingredients:
ingredient.recipe_id = item.id
ingredient.product_id = ingredient.product.id
await recipe.insert_ingredient(conn, ingredient)
await conn.commit()
return item