webapi_preferences.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package state
  2. import (
  3. "context"
  4. "database/sql"
  5. "encoding/json"
  6. "errors"
  7. "time"
  8. )
  9. // WebPreferenceManager handles Web API user preferences.
  10. type WebPreferenceManager struct {
  11. store *SQLiteUserStore
  12. }
  13. // NewWebPreferenceManager creates a new WebPreferenceManager.
  14. func (s *SQLiteUserStore) NewWebPreferenceManager() *WebPreferenceManager {
  15. return &WebPreferenceManager{store: s}
  16. }
  17. // SetPreferences stores user preferences in the database.
  18. func (m *WebPreferenceManager) SetPreferences(ctx context.Context, screenName IdentScreenName, prefs map[string]interface{}) error {
  19. prefsJSON, err := json.Marshal(prefs)
  20. if err != nil {
  21. return err
  22. }
  23. now := time.Now().Unix()
  24. q := `
  25. INSERT INTO web_preferences (screen_name, preferences, created_at, updated_at)
  26. VALUES (?, ?, ?, ?)
  27. ON CONFLICT (screen_name)
  28. DO UPDATE SET preferences = excluded.preferences, updated_at = excluded.updated_at
  29. `
  30. _, err = m.store.db.ExecContext(ctx, q, screenName.String(), string(prefsJSON), now, now)
  31. return err
  32. }
  33. // GetPreferences retrieves user preferences from the database.
  34. func (m *WebPreferenceManager) GetPreferences(ctx context.Context, screenName IdentScreenName) (map[string]interface{}, error) {
  35. q := `
  36. SELECT preferences
  37. FROM web_preferences
  38. WHERE screen_name = ?
  39. `
  40. var prefsJSON string
  41. err := m.store.db.QueryRowContext(ctx, q, screenName.String()).Scan(&prefsJSON)
  42. if err != nil {
  43. if errors.Is(err, sql.ErrNoRows) {
  44. // Return empty preferences if none exist
  45. return make(map[string]interface{}), nil
  46. }
  47. return nil, err
  48. }
  49. var prefs map[string]interface{}
  50. if err := json.Unmarshal([]byte(prefsJSON), &prefs); err != nil {
  51. return nil, err
  52. }
  53. return prefs, nil
  54. }