summaryrefslogtreecommitdiff
path: root/internal/store
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-01-25 20:04:03 -1000
committerPeter Stone <thepeterstone@gmail.com>2026-01-25 20:04:03 -1000
commitfa95c71494458070b78270e3d9170076028fc974 (patch)
tree5cb06c5e6962c9d46ee0e0dad106ff6cbf097730 /internal/store
parent15ac2c98b554e43d287c136b3223d30b0af72b06 (diff)
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 <noreply@anthropic.com>
Diffstat (limited to 'internal/store')
-rw-r--r--internal/store/sqlite.go121
1 files changed, 49 insertions, 72 deletions
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