Ver código fonte

TG-41: Structured Food Detail API for expanded nutrition info

FerRo988 2 semanas atrás
pai
commit
ee4d87d83f
2 arquivos alterados com 55 adições e 1 exclusões
  1. 15 0
      database.py
  2. 40 1
      main.py

+ 15 - 0
database.py

@@ -290,3 +290,18 @@ def get_user_profile(user_id: int) -> Optional[Dict[str, Any]]:
         return None
     finally:
         if conn: conn.close()
+
+def get_food_by_id(food_id: int) -> Optional[Dict[str, Any]]:
+    """Retrieve a single food item by its unique ID"""
+    conn = None
+    try:
+        conn = get_db_connection()
+        cursor = conn.cursor()
+        cursor.execute("SELECT * FROM foods WHERE id = ?", (food_id,))
+        row = cursor.fetchone()
+        return dict(row) if row else None
+    except Exception as e:
+        logger.error(f"Error fetching food by ID {food_id}: {e}")
+        return None
+    finally:
+        if conn: conn.close()

+ 40 - 1
main.py

@@ -4,7 +4,7 @@ import httpx
 import bcrypt
 from contextlib import asynccontextmanager
 from fastapi import FastAPI, HTTPException, Depends, Header
-from database import create_tables, create_user, get_user_by_username, create_session, get_user_from_token, delete_session, search_foods_by_name, save_chat_message, get_user_chat_history, get_user_profile
+from database import create_tables, create_user, get_user_by_username, create_session, get_user_from_token, delete_session, search_foods_by_name, save_chat_message, get_user_chat_history, get_user_profile, get_food_by_id
 from fastapi.responses import HTMLResponse, StreamingResponse
 from fastapi.staticfiles import StaticFiles
 from pydantic import BaseModel
@@ -273,6 +273,45 @@ async def search_food(q: str, current_user: dict = Depends(get_current_user)):
     results = search_foods_by_name(q.strip(), limit=15)
     return {"results": results}
 
+@app.get("/api/food/{food_id}")
+async def get_food_detail(food_id: int, current_user: dict = Depends(get_current_user)):
+    """API endpoint to fetch structured nutritional details for a specific food item"""
+    food = get_food_by_id(food_id)
+    if not food:
+        raise HTTPException(status_code=404, detail="Food item not found")
+    
+    # Structure the data as proposed in the implementation plan
+    structured_data = {
+        "id": food["id"],
+        "name": food["name"],
+        "category": food["category"],
+        "base_weight_g": food["base_weight_g"],
+        "macros": {
+            "calories": food["calories"],
+            "protein_g": food["protein_g"],
+            "fat_g": food["fat_g"],
+            "carbs_g": food["carbs_g"]
+        },
+        "extended": {
+            "fiber_g": food["fiber_g"],
+            "sugar_g": food["sugar_g"],
+            "cholesterol_mg": food["cholesterol_mg"]
+        },
+        "vitamins": {
+            "vitamin_a_iu": food["vitamin_a_iu"],
+            "vitamin_c_mg": food["vitamin_c_mg"]
+        },
+        "minerals": {
+            "calcium_mg": food["calcium_mg"],
+            "iron_mg": food["iron_mg"],
+            "potassium_mg": food["potassium_mg"],
+            "sodium_mg": food["sodium_mg"]
+        },
+        "source": food["source"]
+    }
+    
+    return structured_data
+
 if __name__ == "__main__":
     import uvicorn
     uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)