user_setting.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package api
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strconv"
  6. "golang.org/x/exp/slices"
  7. )
  8. type UserSettingKey string
  9. const (
  10. // UserSettingLocaleKey is the key type for user locale.
  11. UserSettingLocaleKey UserSettingKey = "locale"
  12. // UserSettingAppearanceKey is the key type for user appearance.
  13. UserSettingAppearanceKey UserSettingKey = "appearance"
  14. // UserSettingMemoVisibilityKey is the key type for user preference memo default visibility.
  15. UserSettingMemoVisibilityKey UserSettingKey = "memo-visibility"
  16. // UserSettingTelegramUserID is the key type for telegram UserID of memos user.
  17. UserSettingTelegramUserIDKey UserSettingKey = "telegram-user-id"
  18. )
  19. // String returns the string format of UserSettingKey type.
  20. func (key UserSettingKey) String() string {
  21. switch key {
  22. case UserSettingLocaleKey:
  23. return "locale"
  24. case UserSettingAppearanceKey:
  25. return "appearance"
  26. case UserSettingMemoVisibilityKey:
  27. return "memo-visibility"
  28. case UserSettingTelegramUserIDKey:
  29. return "telegram-user-id"
  30. }
  31. return ""
  32. }
  33. var (
  34. UserSettingLocaleValue = []string{
  35. "de",
  36. "en",
  37. "es",
  38. "fr",
  39. "it",
  40. "ko",
  41. "nl",
  42. "pl",
  43. "pt-BR",
  44. "ru",
  45. "sl",
  46. "sv",
  47. "tr",
  48. "uk",
  49. "vi",
  50. "zh-Hans",
  51. "zh-Hant",
  52. }
  53. UserSettingAppearanceValue = []string{"system", "light", "dark"}
  54. UserSettingMemoVisibilityValue = []Visibility{Private, Protected, Public}
  55. )
  56. type UserSetting struct {
  57. UserID int
  58. Key UserSettingKey `json:"key"`
  59. // Value is a JSON string with basic value
  60. Value string `json:"value"`
  61. }
  62. type UserSettingUpsert struct {
  63. UserID int `json:"-"`
  64. Key UserSettingKey `json:"key"`
  65. Value string `json:"value"`
  66. }
  67. func (upsert UserSettingUpsert) Validate() error {
  68. if upsert.Key == UserSettingLocaleKey {
  69. localeValue := "en"
  70. err := json.Unmarshal([]byte(upsert.Value), &localeValue)
  71. if err != nil {
  72. return fmt.Errorf("failed to unmarshal user setting locale value")
  73. }
  74. if !slices.Contains(UserSettingLocaleValue, localeValue) {
  75. return fmt.Errorf("invalid user setting locale value")
  76. }
  77. } else if upsert.Key == UserSettingAppearanceKey {
  78. appearanceValue := "system"
  79. err := json.Unmarshal([]byte(upsert.Value), &appearanceValue)
  80. if err != nil {
  81. return fmt.Errorf("failed to unmarshal user setting appearance value")
  82. }
  83. if !slices.Contains(UserSettingAppearanceValue, appearanceValue) {
  84. return fmt.Errorf("invalid user setting appearance value")
  85. }
  86. } else if upsert.Key == UserSettingMemoVisibilityKey {
  87. memoVisibilityValue := Private
  88. err := json.Unmarshal([]byte(upsert.Value), &memoVisibilityValue)
  89. if err != nil {
  90. return fmt.Errorf("failed to unmarshal user setting memo visibility value")
  91. }
  92. if !slices.Contains(UserSettingMemoVisibilityValue, memoVisibilityValue) {
  93. return fmt.Errorf("invalid user setting memo visibility value")
  94. }
  95. } else if upsert.Key == UserSettingTelegramUserIDKey {
  96. var s string
  97. err := json.Unmarshal([]byte(upsert.Value), &s)
  98. if err != nil {
  99. return fmt.Errorf("invalid user setting telegram user id value")
  100. }
  101. if s == "" {
  102. return nil
  103. }
  104. if _, err := strconv.Atoi(s); err != nil {
  105. return fmt.Errorf("invalid user setting telegram user id value")
  106. }
  107. } else {
  108. return fmt.Errorf("invalid user setting key")
  109. }
  110. return nil
  111. }
  112. type UserSettingFind struct {
  113. UserID *int
  114. Key UserSettingKey `json:"key"`
  115. }
  116. type UserSettingDelete struct {
  117. UserID int
  118. }