* Extended functionalities

* Added different UIs
This commit is contained in:
2026-06-24 21:43:40 +02:00
parent 282f4864c4
commit f15bb7a916
348 changed files with 59057 additions and 498 deletions

173
database/scripts/README.md Normal file
View File

@@ -0,0 +1,173 @@
# Database scripts
SQL in this folder is applied **manually** on PostgreSQL. The API is database-first and does not run migrations.
## Diet tracking module
Run on your DailyMeals database:
```bash
psql "$DATABASE_URL" -f database/scripts/001_diet_tracking.sql
```
### Tables created
| Table | Purpose |
|-------|---------|
| `UserDailyGoals` | Daily calorie, macro, and water targets (per user) |
| `DrinkCatalog` | Preset drinks (water, tea, coffee, …) with default volumes |
| `MealConsumptions` | Meals the user ate (optional link to `Recipes`, macros snapshotted) |
| `DrinkConsumptions` | Hydration / beverage log |
| `DietReminders` | Reminder schedules (water, meal, custom) |
### API (after script + API deploy)
| Method | Endpoint |
|--------|----------|
| GET | `/api/diet/summary?date=YYYY-MM-DD` |
| GET/PUT | `/api/diet/goals` |
| GET/POST/DELETE | `/api/diet/meals` |
| GET | `/api/diet/drinks/catalog` |
| GET/POST/DELETE | `/api/diet/drinks` |
| GET/POST/PUT/DELETE | `/api/diet/reminders` |
| GET | `/api/diet/reminders/due?date=&time=` |
Web UI: **My Diet** at `/diet` in the React frontend.
## Ingredient nutrition catalog
```bash
psql "$DATABASE_URL" -f database/scripts/002_ingredient_nutrition_catalog.sql
```
### Tables created
| Table | Purpose |
|-------|---------|
| `IngredientCategories` | Food groups (meat, vegetables, dairy, …) |
| `IngredientNutritionCatalog` | Per-100 g calories, protein, fat, carbs, fiber |
### API (after script + API deploy)
| Method | Endpoint |
|--------|----------|
| GET | `/api/ingredient-catalog/categories` |
| GET | `/api/ingredient-catalog?category=&search=` |
| GET | `/api/ingredient-catalog/{id}` |
| POST | `/api/ingredient-catalog` |
| PUT | `/api/ingredient-catalog/{id}` |
| DELETE | `/api/ingredient-catalog/{id}` |
Web UI: **Ingredient catalog** at `/ingredients` in all frontends.
### Polish ingredient names
```bash
psql "$DATABASE_URL" -f database/scripts/003_ingredient_catalog_polish_names.sql
```
Adds `NamePl` column and Polish display names for all seeded catalog items. Search matches both English and Polish names.
## Extended features (meal planner, auth persistence, catalog linking)
```bash
psql "$DATABASE_URL" -f database/scripts/004_extended_features.sql
```
### Changes
| Object | Purpose |
|--------|---------|
| `RefreshTokens` | Persist web login sessions across API restarts |
| `MealPlanEntries` | Weekly meal planner (one recipe per meal slot per day) |
| `UserFavoriteRecipes` | Quick-log favorites |
| `Ingredients.CatalogItemId` | FK to nutrition catalog for auto macro calculation |
Run **after** scripts 001003.
## Catalog expansion + bulk ingredient linking
One-time migration for existing recipe data (based on your `Ingredients.csv` export):
```bash
psql "$DATABASE_URL" -f database/scripts/005_catalog_expansion_and_ingredient_linking.sql
```
### What it does
1. **Adds ~70 catalog items** missing from the seed (Polish staples: rye bread, dry pasta/rice, feta, tahini, passata, herbs/spices, …).
2. **Links `Ingredients.CatalogItemId`** via a name→catalog mapping (~218 ingredient name variants).
3. **Recalculates `Recipes` macros** as `SUM(catalog × AmountGrams / 100)` for all recipes with linked ingredients.
Reference mapping: `database/scripts/005_ingredient_name_mapping.csv` (ingredient name → catalog name → status).
After the script, check PostgreSQL notices for unlinked rows and recipes still missing macros. Spice rows (`do smaku`, `szczypta`) and rows without grams are intentionally skipped.
### API alternative (after linking)
If ingredients already have `CatalogItemId` set, you can recalculate without re-running SQL:
| Method | Endpoint |
|--------|----------|
| POST | `/api/recipes/recalculate-macros` |
Returns `{ recipesProcessed, recipesUpdated, unlinkedIngredientRows }`. Requires auth. Overwrites recipe macros when at least one linked ingredient has grams.
## AI generators (diet plan + recipes)
```bash
psql "$DATABASE_URL" -f database/scripts/006_diet_and_recipe_generators.sql
```
Configure OpenAI in `MealPlan.Api/appsettings.Local.json`:
```json
"OpenAI": {
"ApiKey": "sk-...",
"Model": "gpt-4.1-mini",
"MacrosModel": "gpt-4.1-mini",
"PlanModel": "gpt-4.1-mini",
"RecipeModel": "gpt-4.1",
"MaxTokens": 4096
}
```
| Setting | Used for |
|---------|----------|
| `MacrosModel` | Diet generator — refine daily kcal/macros |
| `PlanModel` | Diet generator — pick recipes for the week |
| `RecipeModel` | Recipe generator — ingredients + steps |
| `Model` | Fallback when a task model is omitted |
Without an API key, macro targets still use TDEE math and meal plans use a local greedy picker; recipe generation uses a simple fallback template.
### Diet generator API
| Method | Endpoint |
|--------|----------|
| GET/PUT | `/api/diet-generator/profile` |
| POST | `/api/diet-generator/sessions` |
| GET | `/api/diet-generator/sessions/{id}` |
| POST | `/api/diet-generator/sessions/{id}/propose-macros` |
| POST | `/api/diet-generator/sessions/{id}/accept-macros` |
| POST | `/api/diet-generator/sessions/{id}/generate-plan` |
| POST | `/api/diet-generator/sessions/{id}/regenerate-meal` |
| PATCH | `/api/diet-generator/sessions/{id}/meals/{mealId}` |
| POST | `/api/diet-generator/sessions/{id}/commit` |
Commit writes `UserDailyGoals` + `MealPlanEntries`. Daily calorie tolerance defaults to **10 kcal**.
### Recipe generator API
| Method | Endpoint |
|--------|----------|
| POST | `/api/recipe-generator/sessions` |
| GET | `/api/recipe-generator/sessions/{id}` |
| POST | `/api/recipe-generator/sessions/{id}/generate` |
| POST | `/api/recipe-generator/sessions/{id}/regenerate` |
| PUT | `/api/recipe-generator/sessions/{id}/draft` |
| POST | `/api/recipe-generator/sessions/{id}/commit` |
Saved recipes get `Source = ai_generated` and macros from the nutrition catalog.
Web UI: `/diet-generator` and `/recipe-generator` in the React frontend.