summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-01-22 15:28:06 -1000
committerPeter Stone <thepeterstone@gmail.com>2026-01-22 15:31:50 -1000
commite97a1bc259d3aa91956ec73a522421cdb621ae57 (patch)
treea9f424ef97673c0dd7da8cee6044413e6417b626 /cmd
parentdb5deb2330448c75ba6b719e6a397832362b222a (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.go15
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)