summaryrefslogtreecommitdiff
path: root/internal/handlers/shopping.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/handlers/shopping.go')
-rw-r--r--internal/handlers/shopping.go89
1 files changed, 21 insertions, 68 deletions
diff --git a/internal/handlers/shopping.go b/internal/handlers/shopping.go
index 1c58126..e06cad6 100644
--- a/internal/handlers/shopping.go
+++ b/internal/handlers/shopping.go
@@ -16,7 +16,7 @@ import (
"task-dashboard/internal/models"
)
-// HandleTabShopping renders the Shopping tab (Trello Shopping board + PlanToEat + User items)
+// HandleTabShopping renders the Shopping tab (PlanToEat + user-added items)
func (h *Handler) HandleTabShopping(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
stores := h.aggregateShoppingLists(ctx)
@@ -125,7 +125,7 @@ func (h *Handler) HandleShoppingModeComplete(w http.ResponseWriter, r *http.Requ
JSONError(w, http.StatusInternalServerError, "Failed to delete item", err)
return
}
- case "trello", "plantoeat":
+ case "plantoeat":
// Mark as checked (will be filtered out of view)
if err := h.store.SetShoppingItemChecked(source, id, true); err != nil {
JSONError(w, http.StatusInternalServerError, "Failed to complete item", err)
@@ -160,81 +160,34 @@ func (h *Handler) HandleShoppingModeComplete(w http.ResponseWriter, r *http.Requ
}{storeName, items})
}
-// HandleGetShoppingLists returns the lists from the Shopping board for quick-add
-func (h *Handler) HandleGetShoppingLists(w http.ResponseWriter, r *http.Request) {
- boards, err := h.store.GetBoards()
- if err != nil {
- JSONError(w, http.StatusInternalServerError, "Failed to get boards", err)
- return
- }
-
- var shoppingBoardID string
- for _, b := range boards {
- if strings.EqualFold(b.Name, "Shopping") {
- shoppingBoardID = b.ID
- break
- }
- }
-
- if shoppingBoardID == "" {
- JSONError(w, http.StatusNotFound, "Shopping board not found", nil)
- return
- }
-
- lists, err := h.trelloClient.GetLists(r.Context(), shoppingBoardID)
- if err != nil {
- JSONError(w, http.StatusInternalServerError, "Failed to get lists", err)
- return
- }
+// HandleGetShoppingStores returns the current store names as <option> elements
+// for the quick-action modal's store picker.
+//
+// This replaces the Trello-lists endpoint the modal used to call. Note the
+// store names come from the items themselves — there is no separate store
+// registry yet, so a store with nothing in it does not appear here.
+func (h *Handler) HandleGetShoppingStores(w http.ResponseWriter, r *http.Request) {
+ stores := h.aggregateShoppingLists(r.Context())
w.Header().Set("Content-Type", "text/html")
- for _, list := range lists {
+ for _, s := range stores {
_, _ = fmt.Fprintf(w, `<option value="%s">%s</option>`,
- template.HTMLEscapeString(list.ID),
- template.HTMLEscapeString(list.Name))
+ template.HTMLEscapeString(s.Name),
+ template.HTMLEscapeString(s.Name))
}
}
-// aggregateShoppingLists combines Trello, PlanToEat, and user shopping items by store
+// aggregateShoppingLists combines PlanToEat and user shopping items by store
func (h *Handler) aggregateShoppingLists(ctx context.Context) []models.ShoppingStore {
storeMap := make(map[string]map[string][]models.UnifiedShoppingItem)
- // Fetch locally stored checked states for external sources
- trelloChecks, _ := h.store.GetShoppingItemChecks("trello")
+ // Fetch locally stored checked states for the remaining external source.
+ // Trello is no longer a shopping source: its items were read-only here and
+ // its list names were doubling as an accidental store registry. See
+ // migration 032 for the one-time import that preceded removing it.
plantoeatChecks, _ := h.store.GetShoppingItemChecks("plantoeat")
- // 1. Fetch Trello "Shopping" board cards
- boards, err := h.store.GetBoards()
- if err != nil {
- log.Printf("ERROR [Shopping/Trello]: %v", err)
- } else {
- for _, board := range boards {
- if strings.EqualFold(board.Name, "Shopping") {
- log.Printf("DEBUG [Shopping]: Found Shopping board with %d cards", len(board.Cards))
- for _, card := range board.Cards {
- storeName := card.ListName
- if storeName == "" {
- storeName = "Uncategorized"
- }
-
- if storeMap[storeName] == nil {
- storeMap[storeName] = make(map[string][]models.UnifiedShoppingItem)
- }
-
- item := models.UnifiedShoppingItem{
- ID: card.ID,
- Name: card.Name,
- Store: storeName,
- Source: "trello",
- Checked: trelloChecks[card.ID],
- }
- storeMap[storeName][""] = append(storeMap[storeName][""], item)
- }
- }
- }
- }
-
- // 2. Fetch PlanToEat shopping list
+ // 1. Fetch PlanToEat shopping list
if h.planToEatClient != nil {
items, err := h.planToEatClient.GetShoppingList(ctx)
if err != nil {
@@ -272,7 +225,7 @@ func (h *Handler) aggregateShoppingLists(ctx context.Context) []models.ShoppingS
log.Printf("DEBUG [Shopping/PlanToEat]: Client not configured")
}
- // 3. Fetch user-added shopping items
+ // 2. Fetch user-added shopping items
userItems, err := h.store.GetUserShoppingItems()
if err != nil {
log.Printf("ERROR [Shopping/User]: %v", err)
@@ -298,7 +251,7 @@ func (h *Handler) aggregateShoppingLists(ctx context.Context) []models.ShoppingS
}
}
- // 4. Convert map to sorted slice
+ // 3. Convert map to sorted slice
var stores []models.ShoppingStore
for storeName, categories := range storeMap {
store := models.ShoppingStore{Name: storeName}