setting_repo.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package store
  2. import (
  3. "encoding/json"
  4. "gorm.io/datatypes"
  5. "gorm.io/gorm"
  6. "spider/internal/model"
  7. )
  8. // GetSetting reads a setting by key. Returns nil if not found.
  9. func (s *Store) GetSetting(key string) (*model.Setting, error) {
  10. var setting model.Setting
  11. err := s.DB.Where("`key` = ?", key).First(&setting).Error
  12. if err == gorm.ErrRecordNotFound {
  13. return nil, nil
  14. }
  15. return &setting, err
  16. }
  17. // SetSetting creates or updates a setting.
  18. func (s *Store) SetSetting(key string, value any) error {
  19. data, err := json.Marshal(value)
  20. if err != nil {
  21. return err
  22. }
  23. var existing model.Setting
  24. err = s.DB.Where("`key` = ?", key).First(&existing).Error
  25. if err == gorm.ErrRecordNotFound {
  26. return s.DB.Create(&model.Setting{
  27. Key: key,
  28. Value: datatypes.JSON(data),
  29. }).Error
  30. }
  31. if err != nil {
  32. return err
  33. }
  34. return s.DB.Model(&existing).Update("value", datatypes.JSON(data)).Error
  35. }
  36. // GetAPIKeysConfig reads the API keys config from settings.
  37. func (s *Store) GetAPIKeysConfig() (*model.APIKeysConfig, error) {
  38. setting, err := s.GetSetting("api_keys")
  39. if err != nil {
  40. return nil, err
  41. }
  42. if setting == nil {
  43. return &model.APIKeysConfig{}, nil
  44. }
  45. var cfg model.APIKeysConfig
  46. if err := json.Unmarshal(setting.Value, &cfg); err != nil {
  47. return &model.APIKeysConfig{}, nil
  48. }
  49. return &cfg, nil
  50. }
  51. // GetGradingConfig reads the grading config from settings, or returns default.
  52. func (s *Store) GetGradingConfig() (*model.GradingConfig, error) {
  53. setting, err := s.GetSetting("grading")
  54. if err != nil {
  55. return nil, err
  56. }
  57. if setting == nil {
  58. cfg := model.DefaultGradingConfig()
  59. return &cfg, nil
  60. }
  61. var cfg model.GradingConfig
  62. if err := json.Unmarshal(setting.Value, &cfg); err != nil {
  63. cfg = model.DefaultGradingConfig()
  64. return &cfg, nil
  65. }
  66. return &cfg, nil
  67. }