summaryrefslogtreecommitdiff
path: root/internal/handlers/handlers.go
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-01-23 15:55:48 -1000
committerPeter Stone <thepeterstone@gmail.com>2026-01-23 15:55:48 -1000
commit54f091e1b920943967c6aebc9c1f3122ce52e267 (patch)
treeea60ba6e86aa9247e73a30094a1be6f39bff0b56 /internal/handlers/handlers.go
parentbc4149d7c9fe7a698cf07895b504ab8f2b26f649 (diff)
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 <noreply@anthropic.com>
Diffstat (limited to 'internal/handlers/handlers.go')
-rw-r--r--internal/handlers/handlers.go25
1 files changed, 25 insertions, 0 deletions
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()