From fa95c71494458070b78270e3d9170076028fc974 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Sun, 25 Jan 2026 20:04:03 -1000 Subject: Refactor: extract helpers and clean up hardcoded HTML - Extract parseEventTime() and deduplicateEvents() in google_calendar.go - Add scanTask() and scanTasks() SQL helpers in sqlite.go - Move completed-atom HTML to partial template - Add loadTestTemplates() test helper for template-dependent tests Co-Authored-By: Claude Opus 4.5 --- internal/store/sqlite.go | 121 +++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 72 deletions(-) (limited to 'internal/store/sqlite.go') diff --git a/internal/store/sqlite.go b/internal/store/sqlite.go index 5b95607..c5c52a4 100644 --- a/internal/store/sqlite.go +++ b/internal/store/sqlite.go @@ -98,6 +98,53 @@ func (s *Store) runMigrations() error { // Tasks operations +// scanTask scans a single task row from the database +func scanTask(rows *sql.Rows) (models.Task, error) { + var task models.Task + var labelsJSON string + var dueDate sql.NullTime + + err := rows.Scan( + &task.ID, + &task.Content, + &task.Description, + &task.ProjectID, + &task.ProjectName, + &dueDate, + &task.Priority, + &task.Completed, + &labelsJSON, + &task.URL, + &task.CreatedAt, + ) + if err != nil { + return task, err + } + + if dueDate.Valid { + task.DueDate = &dueDate.Time + } + + if err := json.Unmarshal([]byte(labelsJSON), &task.Labels); err != nil { + log.Printf("Warning: failed to unmarshal labels for task %s: %v", task.ID, err) + task.Labels = []string{} + } + return task, nil +} + +// scanTasks scans multiple task rows from the database +func scanTasks(rows *sql.Rows) ([]models.Task, error) { + var tasks []models.Task + for rows.Next() { + task, err := scanTask(rows) + if err != nil { + return nil, err + } + tasks = append(tasks, task) + } + return tasks, rows.Err() +} + // SaveTasks saves multiple tasks to the database func (s *Store) SaveTasks(tasks []models.Task) error { tx, err := s.db.Begin() @@ -155,42 +202,7 @@ func (s *Store) GetTasks() ([]models.Task, error) { return nil, err } defer rows.Close() - - var tasks []models.Task - for rows.Next() { - var task models.Task - var labelsJSON string - var dueDate sql.NullTime - - err := rows.Scan( - &task.ID, - &task.Content, - &task.Description, - &task.ProjectID, - &task.ProjectName, - &dueDate, - &task.Priority, - &task.Completed, - &labelsJSON, - &task.URL, - &task.CreatedAt, - ) - if err != nil { - return nil, err - } - - if dueDate.Valid { - task.DueDate = &dueDate.Time - } - - if err := json.Unmarshal([]byte(labelsJSON), &task.Labels); err != nil { - log.Printf("Warning: failed to unmarshal labels for task %s: %v", task.ID, err) - task.Labels = []string{} - } - tasks = append(tasks, task) - } - - return tasks, rows.Err() + return scanTasks(rows) } // DeleteTask removes a task from the cache by ID @@ -690,42 +702,7 @@ func (s *Store) GetTasksByDateRange(start, end time.Time) ([]models.Task, error) return nil, err } defer rows.Close() - - var tasks []models.Task - for rows.Next() { - var task models.Task - var labelsJSON string - var dueDate sql.NullTime - - err := rows.Scan( - &task.ID, - &task.Content, - &task.Description, - &task.ProjectID, - &task.ProjectName, - &dueDate, - &task.Priority, - &task.Completed, - &labelsJSON, - &task.URL, - &task.CreatedAt, - ) - if err != nil { - return nil, err - } - - if dueDate.Valid { - task.DueDate = &dueDate.Time - } - - if err := json.Unmarshal([]byte(labelsJSON), &task.Labels); err != nil { - log.Printf("Warning: failed to unmarshal labels for task %s: %v", task.ID, err) - task.Labels = []string{} - } - tasks = append(tasks, task) - } - - return tasks, rows.Err() + return scanTasks(rows) } // GetMealsByDateRange retrieves meals within a specific date range -- cgit v1.2.3