feat: Phase 8 Feedback UI + API endpoints

- New backend/app/api/feedback.py: GET/POST for meal_plan_item feedback
- MealDetail.tsx: star rating, never-suggest checkbox, reason dropdown,
  free-text comments, displays saved feedback
- frontend/src/api/index.ts + types: feedback API + TypeScript interface
- backend/app/schemas/__init__.py: model_validator maps qty→quantity for
  RecipeIngredient (fixes Pydantic validation on recipe JSONB)
- docs/HANDOFF.md: mark Phase 8 complete, update file map and date
This commit is contained in:
2026-05-14 09:54:25 -07:00
parent e618b2bd5a
commit f7ed10651b
8 changed files with 353 additions and 26 deletions
+13 -2
View File
@@ -1,4 +1,4 @@
from pydantic import BaseModel, Field
from pydantic import BaseModel, Field, model_validator
from typing import Optional, List, Any
from uuid import UUID
from datetime import date, datetime
@@ -122,10 +122,21 @@ class FamilyProfileUpdate(BaseModel):
class RecipeIngredient(BaseModel):
ingredient_id: Optional[UUID] = None
name: str
name: Optional[str] = None
quantity: Optional[float] = None
unit: Optional[str] = None
is_optional: bool = False
notes: Optional[str] = None
@model_validator(mode="before")
@classmethod
def _normalize(cls, data):
if not isinstance(data, dict):
return data
# JSONB stores qty; schema uses quantity
if "qty" in data and "quantity" not in data:
data["quantity"] = data.pop("qty")
return data
class RecipeBase(BaseModel):