system_setting.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package store
  2. import (
  3. "context"
  4. "strings"
  5. )
  6. type SystemSetting struct {
  7. Name string
  8. Value string
  9. Description string
  10. }
  11. type FindSystemSetting struct {
  12. Name string
  13. }
  14. func (s *Store) UpsertSystemSetting(ctx context.Context, upsert *SystemSetting) (*SystemSetting, error) {
  15. stmt := `
  16. INSERT INTO system_setting (
  17. name, value, description
  18. )
  19. VALUES (?, ?, ?)
  20. ON CONFLICT(name) DO UPDATE
  21. SET
  22. value = EXCLUDED.value,
  23. description = EXCLUDED.description
  24. `
  25. if _, err := s.db.ExecContext(ctx, stmt, upsert.Name, upsert.Value, upsert.Description); err != nil {
  26. return nil, err
  27. }
  28. systemSetting := upsert
  29. return systemSetting, nil
  30. }
  31. func (s *Store) ListSystemSettings(ctx context.Context, find *FindSystemSetting) ([]*SystemSetting, error) {
  32. where, args := []string{"1 = 1"}, []any{}
  33. if find.Name != "" {
  34. where, args = append(where, "name = ?"), append(args, find.Name)
  35. }
  36. query := `
  37. SELECT
  38. name,
  39. value,
  40. description
  41. FROM system_setting
  42. WHERE ` + strings.Join(where, " AND ")
  43. rows, err := s.db.QueryContext(ctx, query, args...)
  44. if err != nil {
  45. return nil, err
  46. }
  47. defer rows.Close()
  48. list := []*SystemSetting{}
  49. for rows.Next() {
  50. systemSettingMessage := &SystemSetting{}
  51. if err := rows.Scan(
  52. &systemSettingMessage.Name,
  53. &systemSettingMessage.Value,
  54. &systemSettingMessage.Description,
  55. ); err != nil {
  56. return nil, err
  57. }
  58. list = append(list, systemSettingMessage)
  59. }
  60. if err := rows.Err(); err != nil {
  61. return nil, err
  62. }
  63. for _, systemSettingMessage := range list {
  64. s.systemSettingCache.Store(systemSettingMessage.Name, systemSettingMessage)
  65. }
  66. return list, nil
  67. }
  68. func (s *Store) GetSystemSetting(ctx context.Context, find *FindSystemSetting) (*SystemSetting, error) {
  69. if find.Name != "" {
  70. if cache, ok := s.systemSettingCache.Load(find.Name); ok {
  71. return cache.(*SystemSetting), nil
  72. }
  73. }
  74. list, err := s.ListSystemSettings(ctx, find)
  75. if err != nil {
  76. return nil, err
  77. }
  78. if len(list) == 0 {
  79. return nil, nil
  80. }
  81. systemSettingMessage := list[0]
  82. s.systemSettingCache.Store(systemSettingMessage.Name, systemSettingMessage)
  83. return systemSettingMessage, nil
  84. }
  85. func (s *Store) GetSystemSettingValueWithDefault(ctx *context.Context, settingName string, defaultValue string) string {
  86. if setting, err := s.GetSystemSetting(*ctx, &FindSystemSetting{
  87. Name: settingName,
  88. }); err == nil && setting != nil {
  89. return setting.Value
  90. }
  91. return defaultValue
  92. }