From 54f091e1b920943967c6aebc9c1f3122ce52e267 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Fri, 23 Jan 2026 15:55:48 -1000 Subject: Fix critical resilience issues from code review - DB connection pool: Allow 5 connections instead of 1 for better concurrency - JSON unmarshal: Add error handling to prevent nil slice issues - Context cancellation: Check ctx.Done() in aggregateData goroutines - Migration path: Make configurable via MIGRATION_DIR env var Co-Authored-By: Claude Opus 4.5 --- internal/handlers/handlers.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'internal/handlers/handlers.go') diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index c44e771..b8fc574 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -207,6 +207,11 @@ func (h *Handler) aggregateData(ctx context.Context, forceRefresh bool) (*models wg.Add(1) go func() { defer wg.Done() + select { + case <-ctx.Done(): + return + default: + } boards, err := h.fetchBoards(ctx, forceRefresh) mu.Lock() defer mu.Unlock() @@ -221,6 +226,11 @@ func (h *Handler) aggregateData(ctx context.Context, forceRefresh bool) (*models wg.Add(1) go func() { defer wg.Done() + select { + case <-ctx.Done(): + return + default: + } tasks, err := h.fetchTasks(ctx, forceRefresh) mu.Lock() defer mu.Unlock() @@ -255,6 +265,11 @@ func (h *Handler) aggregateData(ctx context.Context, forceRefresh bool) (*models wg.Add(1) go func() { defer wg.Done() + select { + case <-ctx.Done(): + return + default: + } projects, err := h.todoistClient.GetProjects(ctx) mu.Lock() defer mu.Unlock() @@ -270,6 +285,11 @@ func (h *Handler) aggregateData(ctx context.Context, forceRefresh bool) (*models wg.Add(1) go func() { defer wg.Done() + select { + case <-ctx.Done(): + return + default: + } meals, err := h.fetchMeals(ctx, forceRefresh) mu.Lock() defer mu.Unlock() @@ -286,6 +306,11 @@ func (h *Handler) aggregateData(ctx context.Context, forceRefresh bool) (*models wg.Add(1) go func() { defer wg.Done() + select { + case <-ctx.Done(): + return + default: + } events, err := h.googleCalendarClient.GetUpcomingEvents(ctx, 10) mu.Lock() defer mu.Unlock() -- cgit v1.2.3