system_setting.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. package store
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "strings"
  7. "github.com/usememos/memos/api"
  8. "github.com/usememos/memos/common"
  9. )
  10. type SystemSetting struct {
  11. Name string
  12. Value string
  13. Description string
  14. }
  15. type FindSystemSetting struct {
  16. Name string
  17. }
  18. func (s *Store) ListSystemSettings(ctx context.Context, find *FindSystemSetting) ([]*SystemSetting, error) {
  19. tx, err := s.db.BeginTx(ctx, nil)
  20. if err != nil {
  21. return nil, FormatError(err)
  22. }
  23. defer tx.Rollback()
  24. list, err := listSystemSettings(ctx, tx, find)
  25. if err != nil {
  26. return nil, err
  27. }
  28. for _, systemSettingMessage := range list {
  29. s.systemSettingCache.Store(systemSettingMessage.Name, systemSettingMessage)
  30. }
  31. return list, nil
  32. }
  33. func (s *Store) GetSystemSetting(ctx context.Context, find *FindSystemSetting) (*SystemSetting, error) {
  34. if find.Name != "" {
  35. if cache, ok := s.systemSettingCache.Load(find.Name); ok {
  36. return cache.(*SystemSetting), nil
  37. }
  38. }
  39. tx, err := s.db.BeginTx(ctx, nil)
  40. if err != nil {
  41. return nil, FormatError(err)
  42. }
  43. defer tx.Rollback()
  44. list, err := listSystemSettings(ctx, tx, find)
  45. if err != nil {
  46. return nil, err
  47. }
  48. if len(list) == 0 {
  49. return nil, nil
  50. }
  51. systemSettingMessage := list[0]
  52. s.systemSettingCache.Store(systemSettingMessage.Name, systemSettingMessage)
  53. return systemSettingMessage, nil
  54. }
  55. func listSystemSettings(ctx context.Context, tx *sql.Tx, find *FindSystemSetting) ([]*SystemSetting, error) {
  56. where, args := []string{"1 = 1"}, []any{}
  57. if find.Name != "" {
  58. where, args = append(where, "name = ?"), append(args, find.Name)
  59. }
  60. query := `
  61. SELECT
  62. name,
  63. value,
  64. description
  65. FROM system_setting
  66. WHERE ` + strings.Join(where, " AND ")
  67. rows, err := tx.QueryContext(ctx, query, args...)
  68. if err != nil {
  69. return nil, FormatError(err)
  70. }
  71. defer rows.Close()
  72. list := []*SystemSetting{}
  73. for rows.Next() {
  74. systemSettingMessage := &SystemSetting{}
  75. if err := rows.Scan(
  76. &systemSettingMessage.Name,
  77. &systemSettingMessage.Value,
  78. &systemSettingMessage.Description,
  79. ); err != nil {
  80. return nil, FormatError(err)
  81. }
  82. list = append(list, systemSettingMessage)
  83. }
  84. if err := rows.Err(); err != nil {
  85. return nil, err
  86. }
  87. return list, nil
  88. }
  89. type systemSettingRaw struct {
  90. Name api.SystemSettingName
  91. Value string
  92. Description string
  93. }
  94. func (raw *systemSettingRaw) toSystemSetting() *api.SystemSetting {
  95. return &api.SystemSetting{
  96. Name: raw.Name,
  97. Value: raw.Value,
  98. Description: raw.Description,
  99. }
  100. }
  101. func (s *Store) UpsertSystemSetting(ctx context.Context, upsert *api.SystemSettingUpsert) (*api.SystemSetting, error) {
  102. tx, err := s.db.BeginTx(ctx, nil)
  103. if err != nil {
  104. return nil, FormatError(err)
  105. }
  106. defer tx.Rollback()
  107. systemSettingRaw, err := upsertSystemSetting(ctx, tx, upsert)
  108. if err != nil {
  109. return nil, err
  110. }
  111. if err := tx.Commit(); err != nil {
  112. return nil, err
  113. }
  114. systemSetting := systemSettingRaw.toSystemSetting()
  115. s.systemSettingCache.Store(systemSettingRaw.Name, systemSettingRaw)
  116. return systemSetting, nil
  117. }
  118. func (s *Store) FindSystemSettingList(ctx context.Context, find *api.SystemSettingFind) ([]*api.SystemSetting, error) {
  119. tx, err := s.db.BeginTx(ctx, nil)
  120. if err != nil {
  121. return nil, FormatError(err)
  122. }
  123. defer tx.Rollback()
  124. systemSettingRawList, err := findSystemSettingList(ctx, tx, find)
  125. if err != nil {
  126. return nil, err
  127. }
  128. if err := tx.Commit(); err != nil {
  129. return nil, err
  130. }
  131. list := []*api.SystemSetting{}
  132. for _, raw := range systemSettingRawList {
  133. s.systemSettingCache.Store(raw.Name, raw)
  134. list = append(list, raw.toSystemSetting())
  135. }
  136. return list, nil
  137. }
  138. func (s *Store) FindSystemSetting(ctx context.Context, find *api.SystemSettingFind) (*api.SystemSetting, error) {
  139. if systemSetting, ok := s.systemSettingCache.Load(find.Name); ok {
  140. systemSettingRaw := systemSetting.(*systemSettingRaw)
  141. return systemSettingRaw.toSystemSetting(), nil
  142. }
  143. tx, err := s.db.BeginTx(ctx, nil)
  144. if err != nil {
  145. return nil, FormatError(err)
  146. }
  147. defer tx.Rollback()
  148. systemSettingRawList, err := findSystemSettingList(ctx, tx, find)
  149. if err != nil {
  150. return nil, err
  151. }
  152. if len(systemSettingRawList) == 0 {
  153. return nil, &common.Error{Code: common.NotFound, Err: fmt.Errorf("not found")}
  154. }
  155. systemSettingRaw := systemSettingRawList[0]
  156. s.systemSettingCache.Store(systemSettingRaw.Name, systemSettingRaw)
  157. return systemSettingRaw.toSystemSetting(), nil
  158. }
  159. func (s *Store) GetSystemSettingValueOrDefault(ctx *context.Context, find api.SystemSettingName, defaultValue string) string {
  160. if setting, err := s.FindSystemSetting(*ctx, &api.SystemSettingFind{
  161. Name: find,
  162. }); err == nil {
  163. return setting.Value
  164. }
  165. return defaultValue
  166. }
  167. func upsertSystemSetting(ctx context.Context, tx *sql.Tx, upsert *api.SystemSettingUpsert) (*systemSettingRaw, error) {
  168. query := `
  169. INSERT INTO system_setting (
  170. name, value, description
  171. )
  172. VALUES (?, ?, ?)
  173. ON CONFLICT(name) DO UPDATE
  174. SET
  175. value = EXCLUDED.value,
  176. description = EXCLUDED.description
  177. RETURNING name, value, description
  178. `
  179. var systemSettingRaw systemSettingRaw
  180. if err := tx.QueryRowContext(ctx, query, upsert.Name, upsert.Value, upsert.Description).Scan(
  181. &systemSettingRaw.Name,
  182. &systemSettingRaw.Value,
  183. &systemSettingRaw.Description,
  184. ); err != nil {
  185. return nil, FormatError(err)
  186. }
  187. return &systemSettingRaw, nil
  188. }
  189. func findSystemSettingList(ctx context.Context, tx *sql.Tx, find *api.SystemSettingFind) ([]*systemSettingRaw, error) {
  190. where, args := []string{"1 = 1"}, []any{}
  191. if find.Name.String() != "" {
  192. where, args = append(where, "name = ?"), append(args, find.Name.String())
  193. }
  194. query := `
  195. SELECT
  196. name,
  197. value,
  198. description
  199. FROM system_setting
  200. WHERE ` + strings.Join(where, " AND ")
  201. rows, err := tx.QueryContext(ctx, query, args...)
  202. if err != nil {
  203. return nil, FormatError(err)
  204. }
  205. defer rows.Close()
  206. systemSettingRawList := make([]*systemSettingRaw, 0)
  207. for rows.Next() {
  208. var systemSettingRaw systemSettingRaw
  209. if err := rows.Scan(
  210. &systemSettingRaw.Name,
  211. &systemSettingRaw.Value,
  212. &systemSettingRaw.Description,
  213. ); err != nil {
  214. return nil, FormatError(err)
  215. }
  216. systemSettingRawList = append(systemSettingRawList, &systemSettingRaw)
  217. }
  218. if err := rows.Err(); err != nil {
  219. return nil, FormatError(err)
  220. }
  221. return systemSettingRawList, nil
  222. }