From febc500d4b77d294fccb1d684f846e2018f3b02d Mon Sep 17 00:00:00 2001 From: Szabolcs Horvath Date: Tue, 31 Dec 2024 13:35:06 +0100 Subject: [PATCH] Update list of meallogs as they are added --- http_server/routes/htmx/routes.go | 42 ++++++++++++++++--- repository/meallogs.go | 22 ++++++++++ repository/util.go | 2 +- sqlite/queries/meallog_queries.sql | 9 ++++ web/templates/item_search.gohtml | 6 ++- web/templates/meallogs_simple.gohtml | 30 +++++++++++++ .../{meallogs_by_meal.gohtml => meals.gohtml} | 31 +------------- web/templates/today_tab.gohtml | 2 +- 8 files changed, 106 insertions(+), 38 deletions(-) create mode 100644 web/templates/meallogs_simple.gohtml rename web/templates/{meallogs_by_meal.gohtml => meals.gohtml} (59%) diff --git a/http_server/routes/htmx/routes.go b/http_server/routes/htmx/routes.go index b70da05..6fd84f7 100644 --- a/http_server/routes/htmx/routes.go +++ b/http_server/routes/htmx/routes.go @@ -12,11 +12,12 @@ const Prefix = "/htmx" func Routes() map[string]http.HandlerFunc { return map[string]http.HandlerFunc{ - "GET /": rootHandler, - "GET /today": todayHandler, - "GET /notifications": notificationsHandler, - "GET /items": itemsHandler, - "POST /items/search": itemSearchHandler, + "GET /": rootHandler, + "GET /today": todayHandler, + "GET /notifications": notificationsHandler, + "GET /items": itemsHandler, + "POST /items/search": itemSearchHandler, + "POST /meallogs/meal/{mealId}": addMealLogForMealHandler, } } func rootHandler(w http.ResponseWriter, r *http.Request) { @@ -175,3 +176,34 @@ func itemSearchHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) } } + +func addMealLogForMealHandler(w http.ResponseWriter, r *http.Request) { + mealIdParam := r.PathValue("mealId") + mealId, err := strconv.ParseInt(mealIdParam, 10, 64) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + var requestMealLog repository.CreateMealLogRequest + if err = util.ReadJson(r, &requestMealLog); err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + _, err = repository.CreateMealLog(r.Context(), requestMealLog) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + meallogs, err := repository.FindMealLogsForMealAndCurrentDay(r.Context(), mealId) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + err = repository.Render(w, "meallogs_simple", meallogs) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} diff --git a/repository/meallogs.go b/repository/meallogs.go index b94be2b..bc1a5ac 100644 --- a/repository/meallogs.go +++ b/repository/meallogs.go @@ -106,6 +106,28 @@ func FindMealLogsForUserAndDate(ctx context.Context, ownerId int64, date time.Ti return result, nil } +func FindMealLogsForMealAndCurrentDay(ctx context.Context, mealId int64) ([]*MealLog, error) { + queries, err := GetQueries() + if err != nil { + return nil, err + } + list, err := queries.FindMealLogsForMealAndDate(ctx, sqlc.FindMealLogsForMealAndDateParams{ + MealID: mealId, + Date: time.Now(), + }) + if err != nil { + return nil, err + } + result := make([]*MealLog, len(list)) + for i, m := range list { + result[i] = convertMealLog(&m.MealLogSqlc) + result[i].Meal = convertMeal(&m.MealSqlc) + result[i].Item = convertItem(&m.ItemSqlc) + result[i].Portion = convertPortion(&m.PortionSqlc) + } + return result, nil +} + type CreateMealLogRequest struct { MealID int64 `json:"meal_id"` ItemID int64 `json:"item_id"` diff --git a/repository/util.go b/repository/util.go index 1947f87..7d31bd1 100644 --- a/repository/util.go +++ b/repository/util.go @@ -14,7 +14,7 @@ func init() { templates = template.Must(template.New("templates").Funcs(util.TemplateFuncs()).Funcs(TemplateFuncs()).ParseGlob("web/templates/*.gohtml")) } -func Render(w io.Writer, name string, data map[string]any) error { +func Render(w io.Writer, name string, data any) error { return templates.ExecuteTemplate(w, name, data) } diff --git a/sqlite/queries/meallog_queries.sql b/sqlite/queries/meallog_queries.sql index c9bf31d..8325389 100644 --- a/sqlite/queries/meallog_queries.sql +++ b/sqlite/queries/meallog_queries.sql @@ -16,6 +16,15 @@ JOIN portions ON meallogs.portion_id = portions.id WHERE meals.owner_id = ? AND date(meallogs.datetime) IS date(sqlc.arg(date)); +-- name: FindMealLogsForMealAndDate :many +SELECT sqlc.embed(meallogs), sqlc.embed(meals), sqlc.embed(items), sqlc.embed(portions) +FROM meallogs +JOIN meals ON meallogs.meal_id = meals.id +JOIN items ON meallogs.item_id = items.id +JOIN portions ON meallogs.portion_id = portions.id +WHERE meals.id = sqlc.arg(meal_id) +AND date(meallogs.datetime) IS date(sqlc.arg(date)); + -- name: CreateMealLog :one INSERT INTO meallogs(meal_id, item_id, diff --git a/web/templates/item_search.gohtml b/web/templates/item_search.gohtml index fc69882..7d9d404 100644 --- a/web/templates/item_search.gohtml +++ b/web/templates/item_search.gohtml @@ -88,8 +88,10 @@
- {{/* TODO this form should target an htmx endpoint that returns all meallogs for this meal and oob swaps the list at the top*/}} -
+