diff options
Diffstat (limited to 'internal/store')
| -rw-r--r-- | internal/store/sqlite.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/internal/store/sqlite.go b/internal/store/sqlite.go index b324e9f..48bcae5 100644 --- a/internal/store/sqlite.go +++ b/internal/store/sqlite.go @@ -1141,3 +1141,55 @@ func (s *Store) CheckAgentTrust(name, agentID string) (models.AgentTrustLevel, e return models.AgentTrustNew, nil } + +// Completed tasks log + +// SaveCompletedTask logs a completed task +func (s *Store) SaveCompletedTask(source, sourceID, title string, dueDate *time.Time) error { + var dueDateStr sql.NullString + if dueDate != nil { + dueDateStr = sql.NullString{String: dueDate.Format(time.RFC3339), Valid: true} + } + _, err := s.db.Exec(` + INSERT OR REPLACE INTO completed_tasks (source, source_id, title, due_date, completed_at) + VALUES (?, ?, ?, ?, datetime('now', 'localtime')) + `, source, sourceID, title, dueDateStr) + return err +} + +// GetCompletedTasks retrieves recently completed tasks +func (s *Store) GetCompletedTasks(limit int) ([]models.CompletedTask, error) { + rows, err := s.db.Query(` + SELECT id, source, source_id, title, due_date, completed_at + FROM completed_tasks + ORDER BY completed_at DESC + LIMIT ? + `, limit) + if err != nil { + return nil, err + } + defer func() { _ = rows.Close() }() + + var tasks []models.CompletedTask + for rows.Next() { + var task models.CompletedTask + var dueDate sql.NullString + var completedAt string + + if err := rows.Scan(&task.ID, &task.Source, &task.SourceID, &task.Title, &dueDate, &completedAt); err != nil { + return nil, err + } + + if dueDate.Valid { + if t, err := time.Parse(time.RFC3339, dueDate.String); err == nil { + task.DueDate = &t + } + } + if t, err := time.Parse("2006-01-02 15:04:05", completedAt); err == nil { + task.CompletedAt = t + } + + tasks = append(tasks, task) + } + return tasks, rows.Err() +} |
