diff options
Diffstat (limited to 'internal/handlers/handlers.go')
| -rw-r--r-- | internal/handlers/handlers.go | 114 |
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 |
