summaryrefslogtreecommitdiff
path: root/internal/store
diff options
context:
space:
mode:
Diffstat (limited to 'internal/store')
-rw-r--r--internal/store/sqlite.go52
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()
+}