diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-07-15 09:41:03 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-07-16 02:50:42 +0000 |
| commit | 7d59a3020c9a98bb8af7240f584ac4c7813a46f6 (patch) | |
| tree | b73648ff848593e4e1ddd017e50471478bee9966 /internal/store/meals.go | |
| parent | ce1aa62b4b5a3a9af9933e73e416d7ae80142660 (diff) | |
refactor(store): extract meal methods from sqlite.go into meals.go
Pure move: SaveMeals/GetMeals/GetMealsByDateRange and their test
(plus its setupTestStoreWithMeals helper, used only by that test) out
of the 1400+ line sqlite.go into their own file. No behavior change.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VTUSAEKfsPc6WGDq45yPHD
Diffstat (limited to 'internal/store/meals.go')
| -rw-r--r-- | internal/store/meals.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/internal/store/meals.go b/internal/store/meals.go new file mode 100644 index 0000000..5f4024b --- /dev/null +++ b/internal/store/meals.go @@ -0,0 +1,82 @@ +package store + +import ( + "time" + + "task-dashboard/internal/models" +) + +func (s *Store) SaveMeals(meals []models.Meal) error { + tx, err := s.db.Begin() + if err != nil { + return err + } + defer func() { _ = tx.Rollback() }() + + stmt, err := tx.Prepare(` + INSERT OR REPLACE INTO meals + (id, recipe_name, date, meal_type, recipe_url, updated_at) + VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP) + `) + if err != nil { + return err + } + defer func() { _ = stmt.Close() }() + + for _, meal := range meals { + _, err := stmt.Exec( + meal.ID, + meal.RecipeName, + meal.Date, + meal.MealType, + meal.RecipeURL, + ) + if err != nil { + return err + } + } + + return tx.Commit() +} + +// GetMeals retrieves meals from the database +func (s *Store) GetMeals(startDate, endDate time.Time) ([]models.Meal, error) { + rows, err := s.db.Query(` + SELECT id, recipe_name, date, meal_type, recipe_url + FROM meals + WHERE date BETWEEN ? AND ? + ORDER BY date ASC, + CASE meal_type + WHEN 'breakfast' THEN 1 + WHEN 'lunch' THEN 2 + WHEN 'dinner' THEN 3 + ELSE 4 + END + `, startDate, endDate) + if err != nil { + return nil, err + } + defer func() { _ = rows.Close() }() + + var meals []models.Meal + for rows.Next() { + var meal models.Meal + err := rows.Scan( + &meal.ID, + &meal.RecipeName, + &meal.Date, + &meal.MealType, + &meal.RecipeURL, + ) + if err != nil { + return nil, err + } + meals = append(meals, meal) + } + + return meals, rows.Err() +} + +func (s *Store) GetMealsByDateRange(start, end time.Time) ([]models.Meal, error) { + return s.GetMeals(start, end) +} |
