summaryrefslogtreecommitdiff
path: root/internal/handlers/timeline_logic.go
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-02-17 14:43:42 -1000
committerPeter Stone <thepeterstone@gmail.com>2026-02-17 14:43:42 -1000
commitec7d895c00c571b37ad9255b99b2e1756776c9e1 (patch)
tree31f8a925375fd5b00ee5febfe5d83f35487b1dd3 /internal/handlers/timeline_logic.go
parent44fa97ce901bbfc5957e6d9ba90a53086bb5950b (diff)
Add calendar cache layer, incremental sync tests, completion assertions
- Google Calendar events now cached via CacheFetcher pattern with stale-cache fallback on API errors (new migration 015, store methods, fetchCalendarEvents handler, BuildTimeline reads from store) - Todoist incremental sync path covered by 5 new tests - Task completion tests assert response body, headers, and template data Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/handlers/timeline_logic.go')
-rw-r--r--internal/handlers/timeline_logic.go44
1 files changed, 21 insertions, 23 deletions
diff --git a/internal/handlers/timeline_logic.go b/internal/handlers/timeline_logic.go
index 7a85393..4334f6d 100644
--- a/internal/handlers/timeline_logic.go
+++ b/internal/handlers/timeline_logic.go
@@ -14,7 +14,7 @@ import (
)
// BuildTimeline aggregates and normalizes data into a timeline structure
-func BuildTimeline(ctx context.Context, s *store.Store, calendarClient api.GoogleCalendarAPI, tasksClient api.GoogleTasksAPI, start, end time.Time) ([]models.TimelineItem, error) {
+func BuildTimeline(ctx context.Context, s *store.Store, tasksClient api.GoogleTasksAPI, start, end time.Time) ([]models.TimelineItem, error) {
var items []models.TimelineItem
now := config.Now()
@@ -128,29 +128,27 @@ func BuildTimeline(ctx context.Context, s *store.Store, calendarClient api.Googl
items = append(items, item)
}
- // 4. Fetch Events
- if calendarClient != nil {
- events, err := calendarClient.GetEventsByDateRange(ctx, start, end)
- if err != nil {
- log.Printf("Warning: failed to fetch calendar events: %v", err)
- } else {
- for _, event := range events {
- endTime := event.End
- item := models.TimelineItem{
- ID: event.ID,
- Type: models.TimelineItemTypeEvent,
- Title: event.Summary,
- Time: event.Start,
- EndTime: &endTime,
- Description: event.Description,
- URL: event.HTMLLink,
- OriginalItem: event,
- IsCompleted: false,
- Source: "calendar",
- }
- item.ComputeDaySection(now)
- items = append(items, item)
+ // 4. Fetch Events from store cache (populated by fetchCalendarEvents)
+ events, err := s.GetCalendarEventsByDateRange(start, end)
+ if err != nil {
+ log.Printf("Warning: failed to read cached calendar events: %v", err)
+ } else {
+ for _, event := range events {
+ endTime := event.End
+ item := models.TimelineItem{
+ ID: event.ID,
+ Type: models.TimelineItemTypeEvent,
+ Title: event.Summary,
+ Time: event.Start,
+ EndTime: &endTime,
+ Description: event.Description,
+ URL: event.HTMLLink,
+ OriginalItem: event,
+ IsCompleted: false,
+ Source: "calendar",
}
+ item.ComputeDaySection(now)
+ items = append(items, item)
}
}