package api import ( "context" "database/sql" "log" "time" ) func StartArchiver(ctx context.Context, db *sql.DB, archiveAfter time.Duration) { ticker := time.NewTicker(15 * time.Minute) defer ticker.Stop() run := func() { cutoff := time.Now().Add(-archiveAfter).Unix() res, err := db.ExecContext(ctx, `UPDATE alerts SET archived_at = unixepoch() WHERE status = 'resolved' AND archived_at IS NULL AND COALESCE(ends_at, received_at) < ?`, cutoff) if err != nil { log.Printf("archiver: %v", err) return } if n, _ := res.RowsAffected(); n > 0 { log.Printf("archiver: archived %d resolved alert(s)", n) } } run() for { select { case <-ticker.C: run() case <-ctx.Done(): return } } }