Files
DailyMeals/database/scripts

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 001003.

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

  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)

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.