user_setting.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package store
  2. import (
  3. "context"
  4. "database/sql"
  5. "strings"
  6. )
  7. type UserSetting struct {
  8. UserID int
  9. Key string
  10. Value string
  11. }
  12. type FindUserSetting struct {
  13. UserID *int
  14. Key string
  15. }
  16. func (s *Store) UpsertUserSetting(ctx context.Context, upsert *UserSetting) (*UserSetting, error) {
  17. stmt := `
  18. INSERT INTO user_setting (
  19. user_id, key, value
  20. )
  21. VALUES (?, ?, ?)
  22. ON CONFLICT(user_id, key) DO UPDATE
  23. SET value = EXCLUDED.value
  24. `
  25. if _, err := s.db.ExecContext(ctx, stmt, upsert.UserID, upsert.Key, upsert.Value); err != nil {
  26. return nil, err
  27. }
  28. userSetting := upsert
  29. s.userSettingCache.Store(getUserSettingCacheKey(userSetting.UserID, userSetting.Key), userSetting)
  30. return userSetting, nil
  31. }
  32. func (s *Store) ListUserSettings(ctx context.Context, find *FindUserSetting) ([]*UserSetting, error) {
  33. where, args := []string{"1 = 1"}, []any{}
  34. if v := find.Key; v != "" {
  35. where, args = append(where, "key = ?"), append(args, v)
  36. }
  37. if v := find.UserID; v != nil {
  38. where, args = append(where, "user_id = ?"), append(args, *find.UserID)
  39. }
  40. query := `
  41. SELECT
  42. user_id,
  43. key,
  44. value
  45. FROM user_setting
  46. WHERE ` + strings.Join(where, " AND ")
  47. rows, err := s.db.QueryContext(ctx, query, args...)
  48. if err != nil {
  49. return nil, err
  50. }
  51. defer rows.Close()
  52. userSettingList := make([]*UserSetting, 0)
  53. for rows.Next() {
  54. var userSetting UserSetting
  55. if err := rows.Scan(
  56. &userSetting.UserID,
  57. &userSetting.Key,
  58. &userSetting.Value,
  59. ); err != nil {
  60. return nil, err
  61. }
  62. userSettingList = append(userSettingList, &userSetting)
  63. }
  64. if err := rows.Err(); err != nil {
  65. return nil, err
  66. }
  67. for _, userSetting := range userSettingList {
  68. s.userSettingCache.Store(getUserSettingCacheKey(userSetting.UserID, userSetting.Key), userSetting)
  69. }
  70. return userSettingList, nil
  71. }
  72. func (s *Store) GetUserSetting(ctx context.Context, find *FindUserSetting) (*UserSetting, error) {
  73. if find.UserID != nil {
  74. if cache, ok := s.userSettingCache.Load(getUserSettingCacheKey(*find.UserID, find.Key)); ok {
  75. return cache.(*UserSetting), nil
  76. }
  77. }
  78. list, err := s.ListUserSettings(ctx, find)
  79. if err != nil {
  80. return nil, err
  81. }
  82. if len(list) == 0 {
  83. return nil, nil
  84. }
  85. userSetting := list[0]
  86. s.userSettingCache.Store(getUserSettingCacheKey(userSetting.UserID, userSetting.Key), userSetting)
  87. return userSetting, nil
  88. }
  89. func vacuumUserSetting(ctx context.Context, tx *sql.Tx) error {
  90. stmt := `
  91. DELETE FROM
  92. user_setting
  93. WHERE
  94. user_id NOT IN (
  95. SELECT
  96. id
  97. FROM
  98. user
  99. )`
  100. _, err := tx.ExecContext(ctx, stmt)
  101. if err != nil {
  102. return err
  103. }
  104. return nil
  105. }