From 80c233287b65927a012ff46a27d4eac9a796fce0 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Mon, 12 Jan 2026 13:23:55 -1000 Subject: Parallelize Trello card fetching for improved performance Replaced sequential card fetching in GetBoardsWithCards with concurrent goroutines limited by a semaphore (max 5 concurrent requests). This significantly reduces load times for users with multiple boards. Co-Authored-By: Claude Sonnet 4.5 --- internal/api/trello.go | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'internal/api') diff --git a/internal/api/trello.go b/internal/api/trello.go index 899f6df..cecf0dc 100644 --- a/internal/api/trello.go +++ b/internal/api/trello.go @@ -6,6 +6,7 @@ import ( "fmt" "io" "net/http" + "sync" "time" "task-dashboard/internal/models" @@ -193,16 +194,28 @@ func (c *TrelloClient) GetBoardsWithCards(ctx context.Context) ([]models.Board, return nil, err } - // Fetch cards for each board + var wg sync.WaitGroup + sem := make(chan struct{}, 5) // Limit to 5 concurrent requests + for i := range boards { - cards, err := c.GetCards(ctx, boards[i].ID) - if err != nil { - // Log error but continue with other boards - continue - } - boards[i].Cards = cards + wg.Add(1) + go func(i int) { + defer wg.Done() + + // Acquire semaphore + sem <- struct{}{} + defer func() { <-sem }() + + cards, err := c.GetCards(ctx, boards[i].ID) + if err == nil { + // It is safe to write to specific indices of the slice concurrently + boards[i].Cards = cards + } + }(i) } + wg.Wait() + return boards, nil } -- cgit v1.2.3