diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-01-22 15:28:06 -1000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-01-22 15:31:50 -1000 |
| commit | e97a1bc259d3aa91956ec73a522421cdb621ae57 (patch) | |
| tree | a9f424ef97673c0dd7da8cee6044413e6417b626 /cmd | |
| parent | db5deb2330448c75ba6b719e6a397832362b222a (diff) | |
Add Google Calendar integration
- Add GoogleCalendarClient for fetching upcoming events
- Add GoogleCalendarAPI interface and CalendarEvent model
- Add config for GOOGLE_CREDENTIALS_FILE and GOOGLE_CALENDAR_ID
- Display events in Planning tab with date/time formatting
- Update handlers and tests to support optional calendar client
Config env vars:
- GOOGLE_CREDENTIALS_FILE: Path to service account JSON
- GOOGLE_CALENDAR_ID: Calendar ID (defaults to "primary")
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/dashboard/main.go | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/cmd/dashboard/main.go b/cmd/dashboard/main.go index fd2c024..3d8b330 100644 --- a/cmd/dashboard/main.go +++ b/cmd/dashboard/main.go @@ -83,9 +83,18 @@ func main() { planToEatClient = api.NewPlanToEatClient(cfg.PlanToEatAPIKey) } + var googleCalendarClient api.GoogleCalendarAPI + if cfg.HasGoogleCalendar() { + var err error + googleCalendarClient, err = api.NewGoogleCalendarClient(context.Background(), cfg.GoogleCredentialsFile, cfg.GoogleCalendarID) + if err != nil { + log.Printf("Warning: failed to initialize Google Calendar client: %v", err) + } + } + // Initialize handlers - h := handlers.New(db, todoistClient, trelloClient, planToEatClient, cfg) - tabsHandler := handlers.NewTabsHandler(db, cfg.TemplateDir) + h := handlers.New(db, todoistClient, trelloClient, planToEatClient, googleCalendarClient, cfg) + tabsHandler := handlers.NewTabsHandler(db, googleCalendarClient, cfg.TemplateDir) // Set up router r := chi.NewRouter() @@ -94,7 +103,7 @@ func main() { r.Use(middleware.Logger) r.Use(middleware.Recoverer) r.Use(middleware.Timeout(60 * time.Second)) - r.Use(sessionManager.LoadAndSave) // Session middleware must be applied globally + r.Use(sessionManager.LoadAndSave) // Session middleware must be applied globally r.Use(authHandlers.Middleware().CSRFProtect) // CSRF protection // Public routes (no auth required) |
