5.8 KiB
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:
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
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
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)
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 001–003.
Catalog expansion + bulk ingredient linking
One-time migration for existing recipe data (based on your Ingredients.csv export):
psql "$DATABASE_URL" -f database/scripts/005_catalog_expansion_and_ingredient_linking.sql
What it does
- Adds ~70 catalog items missing from the seed (Polish staples: rye bread, dry pasta/rice, feta, tahini, passata, herbs/spices, …).
- Links
Ingredients.CatalogItemIdvia a name→catalog mapping (~218 ingredient name variants). - Recalculates
Recipesmacros asSUM(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)
psql "$DATABASE_URL" -f database/scripts/006_diet_and_recipe_generators.sql
Configure OpenAI in MealPlan.Api/appsettings.Local.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.