package store import ( "database/sql" "fmt" "strconv" "github.com/local-mcp/local-mcp-go/internal/config" "github.com/local-mcp/local-mcp-go/internal/models" ) // SettingsStore reads and writes the settings table. type SettingsStore struct { db *sql.DB } // NewSettingsStore creates a SettingsStore backed by db. func NewSettingsStore(db *sql.DB) *SettingsStore { return &SettingsStore{db: db} } // Get returns the current settings. func (s *SettingsStore) Get() (models.Settings, error) { rows, err := s.db.Query(`SELECT key, value FROM settings`) if err != nil { return models.Settings{}, fmt.Errorf("get settings: %w", err) } defer rows.Close() cfg := models.Settings{ DefaultWaitSeconds: 10, DefaultEmptyResponse: config.DefaultEmptyResponse, } for rows.Next() { var key, value string if err := rows.Scan(&key, &value); err != nil { return cfg, err } switch key { case "default_wait_seconds": if n, err := strconv.Atoi(value); err == nil { cfg.DefaultWaitSeconds = n } } } return cfg, rows.Err() } // Update saves settings. Only non-nil fields are updated; pass a partial // struct pointer using the Patch helper below. func (s *SettingsStore) Update(patch models.Settings) error { _, err := s.db.Exec(` INSERT OR REPLACE INTO settings (key, value) VALUES ('default_wait_seconds', ?)` , strconv.Itoa(patch.DefaultWaitSeconds), ) return err }