From 72a63ed82f5a0b7230b8c21fcec339dd2d074877 Mon Sep 17 00:00:00 2001 From: sstent Date: Sun, 28 Sep 2025 17:39:12 -0700 Subject: [PATCH] reverted to manual db table creation, nned to fix alembic --- main.py | 239 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) diff --git a/main.py b/main.py index 5ed956d..cdac293 100644 --- a/main.py +++ b/main.py @@ -1790,6 +1790,245 @@ def calculate_day_nutrition_tracked(tracked_meals, db: Session): return day_totals +# Tracker API Routes +@app.post("/tracker/add_meal") +async def tracker_add_meal(request: Request, db: Session = Depends(get_db)): + """Add a meal to the tracker""" + try: + form_data = await request.form() + person = form_data.get("person") + date_str = form_data.get("date") + meal_id = form_data.get("meal_id") + meal_time = form_data.get("meal_time") + quantity = float(form_data.get("quantity", 1.0)) + + logging.info(f"DEBUG: Adding meal to tracker - person={person}, date={date_str}, meal_id={meal_id}, meal_time={meal_time}, quantity={quantity}") + + # Parse date + from datetime import datetime + date = datetime.fromisoformat(date_str).date() + + # Get or create tracked day + tracked_day = db.query(TrackedDay).filter( + TrackedDay.person == person, + TrackedDay.date == date + ).first() + + if not tracked_day: + tracked_day = TrackedDay(person=person, date=date, is_modified=True) + db.add(tracked_day) + db.commit() + db.refresh(tracked_day) + + # Create tracked meal + tracked_meal = TrackedMeal( + tracked_day_id=tracked_day.id, + meal_id=int(meal_id), + meal_time=meal_time, + quantity=quantity + ) + db.add(tracked_meal) + + # Mark day as modified + tracked_day.is_modified = True + + db.commit() + + logging.info(f"DEBUG: Successfully added meal to tracker") + return {"status": "success"} + + except Exception as e: + db.rollback() + logging.error(f"DEBUG: Error adding meal to tracker: {e}") + return {"status": "error", "message": str(e)} + +@app.delete("/tracker/remove_meal/{tracked_meal_id}") +async def tracker_remove_meal(tracked_meal_id: int, db: Session = Depends(get_db)): + """Remove a meal from the tracker""" + try: + logging.info(f"DEBUG: Removing tracked meal with ID: {tracked_meal_id}") + + tracked_meal = db.query(TrackedMeal).filter(TrackedMeal.id == tracked_meal_id).first() + if not tracked_meal: + return {"status": "error", "message": "Tracked meal not found"} + + # Get the tracked day to mark as modified + tracked_day = tracked_meal.tracked_day + tracked_day.is_modified = True + + db.delete(tracked_meal) + db.commit() + + logging.info(f"DEBUG: Successfully removed tracked meal") + return {"status": "success"} + + except Exception as e: + db.rollback() + logging.error(f"DEBUG: Error removing tracked meal: {e}") + return {"status": "error", "message": str(e)} + +@app.post("/tracker/save_template") +async def tracker_save_template(request: Request, db: Session = Depends(get_db)): + """Save current day's meals as a template""" + try: + form_data = await request.form() + person = form_data.get("person") + date_str = form_data.get("date") + template_name = form_data.get("template_name") + + logging.info(f"DEBUG: Saving template - name={template_name}, person={person}, date={date_str}") + + # Parse date + from datetime import datetime + date = datetime.fromisoformat(date_str).date() + + # Get tracked day and meals + tracked_day = db.query(TrackedDay).filter( + TrackedDay.person == person, + TrackedDay.date == date + ).first() + + if not tracked_day: + return {"status": "error", "message": "No tracked day found"} + + tracked_meals = db.query(TrackedMeal).filter( + TrackedMeal.tracked_day_id == tracked_day.id + ).all() + + if not tracked_meals: + return {"status": "error", "message": "No meals to save as template"} + + # Create template + template = Template(name=template_name) + db.add(template) + db.flush() + + # Add template meals + for tracked_meal in tracked_meals: + template_meal = TemplateMeal( + template_id=template.id, + meal_id=tracked_meal.meal_id, + meal_time=tracked_meal.meal_time + ) + db.add(template_meal) + + db.commit() + + logging.info(f"DEBUG: Successfully saved template with {len(tracked_meals)} meals") + return {"status": "success"} + + except Exception as e: + db.rollback() + logging.error(f"DEBUG: Error saving template: {e}") + return {"status": "error", "message": str(e)} + +@app.post("/tracker/apply_template") +async def tracker_apply_template(request: Request, db: Session = Depends(get_db)): + """Apply a template to the current day""" + try: + form_data = await request.form() + person = form_data.get("person") + date_str = form_data.get("date") + template_id = form_data.get("template_id") + + logging.info(f"DEBUG: Applying template - template_id={template_id}, person={person}, date={date_str}") + + # Parse date + from datetime import datetime + date = datetime.fromisoformat(date_str).date() + + # Get template + template = db.query(Template).filter(Template.id == int(template_id)).first() + if not template: + return {"status": "error", "message": "Template not found"} + + # Get template meals + template_meals = db.query(TemplateMeal).filter( + TemplateMeal.template_id == template.id + ).all() + + if not template_meals: + return {"status": "error", "message": "Template has no meals"} + + # Get or create tracked day + tracked_day = db.query(TrackedDay).filter( + TrackedDay.person == person, + TrackedDay.date == date + ).first() + + if not tracked_day: + tracked_day = TrackedDay(person=person, date=date, is_modified=True) + db.add(tracked_day) + db.commit() + db.refresh(tracked_day) + else: + # Clear existing tracked meals + db.query(TrackedMeal).filter( + TrackedMeal.tracked_day_id == tracked_day.id + ).delete() + tracked_day.is_modified = True + + # Add template meals to tracked day + for template_meal in template_meals: + tracked_meal = TrackedMeal( + tracked_day_id=tracked_day.id, + meal_id=template_meal.meal_id, + meal_time=template_meal.meal_time, + quantity=1.0 + ) + db.add(tracked_meal) + + db.commit() + + logging.info(f"DEBUG: Successfully applied template with {len(template_meals)} meals") + return {"status": "success"} + + except Exception as e: + db.rollback() + logging.error(f"DEBUG: Error applying template: {e}") + return {"status": "error", "message": str(e)} + +@app.post("/tracker/reset_to_plan") +async def tracker_reset_to_plan(request: Request, db: Session = Depends(get_db)): + """Reset tracked day back to original plan""" + try: + form_data = await request.form() + person = form_data.get("person") + date_str = form_data.get("date") + + logging.info(f"DEBUG: Resetting to plan - person={person}, date={date_str}") + + # Parse date + from datetime import datetime + date = datetime.fromisoformat(date_str).date() + + # Get tracked day + tracked_day = db.query(TrackedDay).filter( + TrackedDay.person == person, + TrackedDay.date == date + ).first() + + if not tracked_day: + return {"status": "error", "message": "No tracked day found"} + + # Clear tracked meals + db.query(TrackedMeal).filter( + TrackedMeal.tracked_day_id == tracked_day.id + ).delete() + + # Reset modified flag + tracked_day.is_modified = False + + db.commit() + + logging.info(f"DEBUG: Successfully reset to plan") + return {"status": "success"} + + except Exception as e: + db.rollback() + logging.error(f"DEBUG: Error resetting to plan: {e}") + return {"status": "error", "message": str(e)} + # Add a simple test route to confirm routing is working @app.get("/test") async def test_route():