summaryrefslogtreecommitdiff
path: root/internal/models
diff options
context:
space:
mode:
Diffstat (limited to 'internal/models')
-rw-r--r--internal/models/types.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/internal/models/types.go b/internal/models/types.go
new file mode 100644
index 0000000..d39a1d6
--- /dev/null
+++ b/internal/models/types.go
@@ -0,0 +1,77 @@
+package models
+
+import "time"
+
+// Task represents a task from Todoist
+type Task struct {
+ ID string `json:"id"`
+ Content string `json:"content"`
+ Description string `json:"description"`
+ ProjectID string `json:"project_id"`
+ ProjectName string `json:"project_name"`
+ DueDate *time.Time `json:"due_date,omitempty"`
+ Priority int `json:"priority"`
+ Completed bool `json:"completed"`
+ Labels []string `json:"labels"`
+ URL string `json:"url"`
+ CreatedAt time.Time `json:"created_at"`
+}
+
+// Note represents a note from Obsidian
+type Note struct {
+ Filename string `json:"filename"`
+ Title string `json:"title"`
+ Content string `json:"content"` // First 200 chars or full content
+ Modified time.Time `json:"modified"`
+ Path string `json:"path"`
+ Tags []string `json:"tags"`
+}
+
+// Meal represents a meal from PlanToEat
+type Meal struct {
+ ID string `json:"id"`
+ RecipeName string `json:"recipe_name"`
+ Date time.Time `json:"date"`
+ MealType string `json:"meal_type"` // breakfast, lunch, dinner
+ RecipeURL string `json:"recipe_url"`
+}
+
+// Board represents a Trello board
+type Board struct {
+ ID string `json:"id"`
+ Name string `json:"name"`
+ Cards []Card `json:"cards"`
+}
+
+// Card represents a Trello card
+type Card struct {
+ ID string `json:"id"`
+ Name string `json:"name"`
+ ListID string `json:"list_id"`
+ ListName string `json:"list_name"`
+ DueDate *time.Time `json:"due_date,omitempty"`
+ URL string `json:"url"`
+}
+
+// CacheMetadata tracks when data was last fetched
+type CacheMetadata struct {
+ Key string `json:"key"`
+ LastFetch time.Time `json:"last_fetch"`
+ TTLMinutes int `json:"ttl_minutes"`
+}
+
+// IsCacheValid checks if the cache is still valid based on TTL
+func (cm *CacheMetadata) IsCacheValid() bool {
+ expiryTime := cm.LastFetch.Add(time.Duration(cm.TTLMinutes) * time.Minute)
+ return time.Now().Before(expiryTime)
+}
+
+// DashboardData aggregates all data for the main view
+type DashboardData struct {
+ Tasks []Task `json:"tasks"`
+ Notes []Note `json:"notes"`
+ Meals []Meal `json:"meals"`
+ Boards []Board `json:"boards,omitempty"`
+ LastUpdated time.Time `json:"last_updated"`
+ Errors []string `json:"errors,omitempty"`
+}