From b9efc824d05771f366d2e4c51497801bceadc8a6 Mon Sep 17 00:00:00 2001 From: "Molecule AI Dev Engineer A (Kimi)" Date: Sat, 23 May 2026 06:39:33 +0000 Subject: [PATCH] fix(handlers): check rows.Err() after iteration in 4 list handlers Four HTTP handlers iterated sql.Rows without calling rows.Err() after the loop, silently swallowing mid-stream Postgres/network errors: - ListEvents / ListByWorkspace (events.go) - ListChannels (channels.go) - HandleTelegramWebhook (channels.go) - List (memory.go) Added rows.Err() checks after each loop so iteration errors are logged rather than silently truncating results returned to callers. Co-Authored-By: Claude Opus 4.7 --- workspace-server/internal/handlers/channels.go | 6 ++++++ workspace-server/internal/handlers/events.go | 6 ++++++ workspace-server/internal/handlers/memory.go | 3 +++ 3 files changed, 15 insertions(+) diff --git a/workspace-server/internal/handlers/channels.go b/workspace-server/internal/handlers/channels.go index b14690740..8ff5927f3 100644 --- a/workspace-server/internal/handlers/channels.go +++ b/workspace-server/internal/handlers/channels.go @@ -104,6 +104,9 @@ func (h *ChannelHandler) List(c *gin.Context) { } result = append(result, entry) } + if err := rows.Err(); err != nil { + log.Printf("Channels list rows error: %v", err) + } c.JSON(http.StatusOK, result) } @@ -514,6 +517,9 @@ func (h *ChannelHandler) Webhook(c *gin.Context) { candidates = append(candidates, row) } } + if err := rows.Err(); err != nil { + log.Printf("Channels: telegram webhook rows error: %v", err) + } if targetSlug != "" { // [slug] routing — match against config username (lowercased) diff --git a/workspace-server/internal/handlers/events.go b/workspace-server/internal/handlers/events.go index d297026b3..16ef4887c 100644 --- a/workspace-server/internal/handlers/events.go +++ b/workspace-server/internal/handlers/events.go @@ -49,6 +49,9 @@ func (h *EventsHandler) List(c *gin.Context) { "created_at": createdAt, }) } + if err := rows.Err(); err != nil { + log.Printf("Events rows error: %v", err) + } c.JSON(http.StatusOK, events) } @@ -87,5 +90,8 @@ func (h *EventsHandler) ListByWorkspace(c *gin.Context) { "created_at": createdAt, }) } + if err := rows.Err(); err != nil { + log.Printf("Events rows error (workspace %s): %v", workspaceID, err) + } c.JSON(http.StatusOK, events) } diff --git a/workspace-server/internal/handlers/memory.go b/workspace-server/internal/handlers/memory.go index 8f945a262..791e5692a 100644 --- a/workspace-server/internal/handlers/memory.go +++ b/workspace-server/internal/handlers/memory.go @@ -54,6 +54,9 @@ func (h *MemoryHandler) List(c *gin.Context) { entry.Value = json.RawMessage(value) entries = append(entries, entry) } + if err := rows.Err(); err != nil { + log.Printf("Memory list rows error: %v", err) + } c.JSON(http.StatusOK, entries) } -- 2.52.0