|
@@ -4,7 +4,7 @@ import httpx
|
|
|
import bcrypt
|
|
import bcrypt
|
|
|
from contextlib import asynccontextmanager
|
|
from contextlib import asynccontextmanager
|
|
|
from fastapi import FastAPI, HTTPException, Depends, Header
|
|
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.responses import HTMLResponse, StreamingResponse
|
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.staticfiles import StaticFiles
|
|
|
from pydantic import BaseModel
|
|
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)
|
|
results = search_foods_by_name(q.strip(), limit=15)
|
|
|
return {"results": results}
|
|
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__":
|
|
if __name__ == "__main__":
|
|
|
import uvicorn
|
|
import uvicorn
|
|
|
uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)
|
|
uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)
|