summaryrefslogtreecommitdiff
path: root/internal/models
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-01-26 20:55:50 -1000
committerPeter Stone <thepeterstone@gmail.com>2026-01-26 20:55:50 -1000
commita3156a2f399ea03c645ee23b0099d9d722ce7e1e (patch)
tree03c813717e77ae27d8aee9e676f1b75a6a01648c /internal/models
parent70e6e51b6781a3986c51e3496b81c88665286872 (diff)
Add Google Tasks integration (#43)
- New GoogleTasksClient for fetching and managing Google Tasks - Tasks appear in Timeline view with yellow indicator dot - Tap checkbox to complete/uncomplete tasks via Google API - Shares credentials file with Google Calendar (GOOGLE_CREDENTIALS_FILE) - Configure task list via GOOGLE_TASKS_LIST_ID env var (default: @default) - Supports comma-separated list IDs for multiple lists New files: - internal/api/google_tasks.go - Google Tasks API client Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'internal/models')
-rw-r--r--internal/models/timeline.go14
-rw-r--r--internal/models/types.go13
2 files changed, 22 insertions, 5 deletions
diff --git a/internal/models/timeline.go b/internal/models/timeline.go
index 3475696..0968d41 100644
--- a/internal/models/timeline.go
+++ b/internal/models/timeline.go
@@ -9,10 +9,11 @@ import (
type TimelineItemType string
const (
- TimelineItemTypeTask TimelineItemType = "task"
- TimelineItemTypeMeal TimelineItemType = "meal"
- TimelineItemTypeCard TimelineItemType = "card"
- TimelineItemTypeEvent TimelineItemType = "event"
+ TimelineItemTypeTask TimelineItemType = "task"
+ TimelineItemTypeMeal TimelineItemType = "meal"
+ TimelineItemTypeCard TimelineItemType = "card"
+ TimelineItemTypeEvent TimelineItemType = "event"
+ TimelineItemTypeGTask TimelineItemType = "gtask" // Google Tasks
)
type DaySection string
@@ -36,7 +37,10 @@ type TimelineItem struct {
// UI enhancement fields
IsCompleted bool `json:"is_completed"`
DaySection DaySection `json:"day_section"`
- Source string `json:"source"` // "todoist", "trello", "plantoeat", "calendar"
+ Source string `json:"source"` // "todoist", "trello", "plantoeat", "calendar", "gtasks"
+
+ // Source-specific metadata
+ ListID string `json:"list_id,omitempty"` // For Google Tasks
}
// ComputeDaySection sets the DaySection based on the item's time
diff --git a/internal/models/types.go b/internal/models/types.go
index 6dc8716..4bf8462 100644
--- a/internal/models/types.go
+++ b/internal/models/types.go
@@ -101,6 +101,19 @@ type CalendarEvent struct {
HTMLLink string `json:"html_link"`
}
+// GoogleTask represents a task from Google Tasks
+type GoogleTask struct {
+ ID string `json:"id"`
+ Title string `json:"title"`
+ Notes string `json:"notes,omitempty"`
+ DueDate *time.Time `json:"due_date,omitempty"`
+ Status string `json:"status"` // "needsAction" or "completed"
+ Completed bool `json:"completed"`
+ ListID string `json:"list_id"`
+ URL string `json:"url"`
+ UpdatedAt time.Time `json:"updated_at"`
+}
+
// Bug represents a bug report
type Bug struct {
ID int64 `json:"id"`