setting_repo.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. // GetGradingConfig reads the grading config from settings, or returns default.
  37. func (s *Store) GetGradingConfig() (*model.GradingConfig, error) {
  38. setting, err := s.GetSetting("grading")
  39. if err != nil {
  40. return nil, err
  41. }
  42. if setting == nil {
  43. cfg := model.DefaultGradingConfig()
  44. return &cfg, nil
  45. }
  46. var cfg model.GradingConfig
  47. if err := json.Unmarshal(setting.Value, &cfg); err != nil {
  48. cfg = model.DefaultGradingConfig()
  49. return &cfg, nil
  50. }
  51. return &cfg, nil
  52. }