Files
DailyMeals/database/scripts/README.md
Piotr Kus f15bb7a916 * Extended functionalities
* Added different UIs
2026-06-24 21:43:40 +02:00

174 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.