summaryrefslogtreecommitdiff
path: root/internal/handlers/handlers.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/handlers/handlers.go')
-rw-r--r--internal/handlers/handlers.go114
1 files changed, 22 insertions, 92 deletions
diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go
index f53eced..7bb84b9 100644
--- a/internal/handlers/handlers.go
+++ b/internal/handlers/handlers.go
@@ -24,14 +24,13 @@ type Handler struct {
store *store.Store
todoistClient api.TodoistAPI
trelloClient api.TrelloAPI
- obsidianClient api.ObsidianAPI
planToEatClient api.PlanToEatAPI
config *config.Config
templates *template.Template
}
// New creates a new Handler instance
-func New(s *store.Store, todoist api.TodoistAPI, trello api.TrelloAPI, obsidian api.ObsidianAPI, planToEat api.PlanToEatAPI, cfg *config.Config) *Handler {
+func New(s *store.Store, todoist api.TodoistAPI, trello api.TrelloAPI, planToEat api.PlanToEatAPI, cfg *config.Config) *Handler {
// Parse templates including partials
tmpl, err := template.ParseGlob(filepath.Join(cfg.TemplateDir, "*.html"))
if err != nil {
@@ -48,7 +47,6 @@ func New(s *store.Store, todoist api.TodoistAPI, trello api.TrelloAPI, obsidian
store: s,
todoistClient: todoist,
trelloClient: trello,
- obsidianClient: obsidian,
planToEatClient: planToEat,
config: cfg,
templates: tmpl,
@@ -122,18 +120,6 @@ func (h *Handler) HandleGetTasks(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(tasks)
}
-// HandleGetNotes returns notes as JSON
-func (h *Handler) HandleGetNotes(w http.ResponseWriter, r *http.Request) {
- notes, err := h.store.GetNotes(20)
- if err != nil {
- http.Error(w, "Failed to get notes", http.StatusInternalServerError)
- return
- }
-
- w.Header().Set("Content-Type", "application/json")
- json.NewEncoder(w).Encode(notes)
-}
-
// HandleGetMeals returns meals as JSON
func (h *Handler) HandleGetMeals(w http.ResponseWriter, r *http.Request) {
startDate := time.Now()
@@ -178,27 +164,9 @@ func (h *Handler) HandleTasksTab(w http.ResponseWriter, r *http.Request) {
}
}
-// HandleNotesTab renders the notes tab content (Obsidian)
-func (h *Handler) HandleNotesTab(w http.ResponseWriter, r *http.Request) {
- ctx := r.Context()
-
- data, err := h.aggregateData(ctx, false)
- if err != nil {
- http.Error(w, "Failed to load notes", http.StatusInternalServerError)
- log.Printf("Error loading notes tab: %v", err)
- return
- }
-
- if err := h.templates.ExecuteTemplate(w, "notes-tab", data); err != nil {
- http.Error(w, "Failed to render template", http.StatusInternalServerError)
- log.Printf("Error rendering notes tab: %v", err)
- }
-}
-
// HandleRefreshTab refreshes and re-renders the specified tab
func (h *Handler) HandleRefreshTab(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
- tab := r.URL.Query().Get("tab") // "tasks" or "notes"
// Force refresh
data, err := h.aggregateData(ctx, true)
@@ -208,13 +176,7 @@ func (h *Handler) HandleRefreshTab(w http.ResponseWriter, r *http.Request) {
return
}
- // Determine template to render
- templateName := "tasks-tab"
- if tab == "notes" {
- templateName = "notes-tab"
- }
-
- if err := h.templates.ExecuteTemplate(w, templateName, data); err != nil {
+ if err := h.templates.ExecuteTemplate(w, "tasks-tab", data); err != nil {
http.Error(w, "Failed to render template", http.StatusInternalServerError)
log.Printf("Error rendering refreshed tab: %v", err)
}
@@ -254,6 +216,26 @@ func (h *Handler) aggregateData(ctx context.Context, forceRefresh bool) (*models
if err != nil {
data.Errors = append(data.Errors, "Todoist: "+err.Error())
} else {
+ // Sort tasks: earliest due date first, nil last, then by priority (descending)
+ sort.Slice(tasks, func(i, j int) bool {
+ // Handle nil due dates (push to end)
+ if tasks[i].DueDate == nil && tasks[j].DueDate != nil {
+ return false
+ }
+ if tasks[i].DueDate != nil && tasks[j].DueDate == nil {
+ return true
+ }
+
+ // Both have due dates, sort by date
+ if tasks[i].DueDate != nil && tasks[j].DueDate != nil {
+ if !tasks[i].DueDate.Equal(*tasks[j].DueDate) {
+ return tasks[i].DueDate.Before(*tasks[j].DueDate)
+ }
+ }
+
+ // Same due date (or both nil), sort by priority (descending)
+ return tasks[i].Priority > tasks[j].Priority
+ })
data.Tasks = tasks
}
}()
@@ -272,22 +254,6 @@ func (h *Handler) aggregateData(ctx context.Context, forceRefresh bool) (*models
}
}()
- // Fetch Obsidian notes (if configured)
- if h.obsidianClient != nil {
- wg.Add(1)
- go func() {
- defer wg.Done()
- notes, err := h.fetchNotes(ctx, forceRefresh)
- mu.Lock()
- defer mu.Unlock()
- if err != nil {
- data.Errors = append(data.Errors, "Obsidian: "+err.Error())
- } else {
- data.Notes = notes
- }
- }()
- }
-
// Fetch PlanToEat meals (if configured)
if h.planToEatClient != nil {
wg.Add(1)
@@ -467,42 +433,6 @@ func (h *Handler) convertSyncItemToTask(item api.SyncItemResponse, projectMap ma
return task
}
-// fetchNotes fetches notes from cache or filesystem
-func (h *Handler) fetchNotes(ctx context.Context, forceRefresh bool) ([]models.Note, error) {
- cacheKey := store.CacheKeyObsidianNotes
-
- // Check cache validity
- if !forceRefresh {
- valid, err := h.store.IsCacheValid(cacheKey)
- if err == nil && valid {
- return h.store.GetNotes(20)
- }
- }
-
- // Fetch from filesystem
- notes, err := h.obsidianClient.GetNotes(ctx, 20)
- if err != nil {
- // Try to return cached data even if stale
- cachedNotes, cacheErr := h.store.GetNotes(20)
- if cacheErr == nil && len(cachedNotes) > 0 {
- return cachedNotes, nil
- }
- return nil, err
- }
-
- // Save to cache
- if err := h.store.SaveNotes(notes); err != nil {
- log.Printf("Failed to save notes to cache: %v", err)
- }
-
- // Update cache metadata
- if err := h.store.UpdateCacheMetadata(cacheKey, h.config.CacheTTLMinutes); err != nil {
- log.Printf("Failed to update cache metadata: %v", err)
- }
-
- return notes, nil
-}
-
// fetchMeals fetches meals from cache or API
func (h *Handler) fetchMeals(ctx context.Context, forceRefresh bool) ([]models.Meal, error) {
cacheKey := store.CacheKeyPlanToEatMeals