package store import ( "encoding/json" "gorm.io/datatypes" "gorm.io/gorm" "spider/internal/model" ) // GetSetting reads a setting by key. Returns nil if not found. func (s *Store) GetSetting(key string) (*model.Setting, error) { var setting model.Setting err := s.DB.Where("`key` = ?", key).First(&setting).Error if err == gorm.ErrRecordNotFound { return nil, nil } return &setting, err } // SetSetting creates or updates a setting. func (s *Store) SetSetting(key string, value any) error { data, err := json.Marshal(value) if err != nil { return err } var existing model.Setting err = s.DB.Where("`key` = ?", key).First(&existing).Error if err == gorm.ErrRecordNotFound { return s.DB.Create(&model.Setting{ Key: key, Value: datatypes.JSON(data), }).Error } if err != nil { return err } return s.DB.Model(&existing).Update("value", datatypes.JSON(data)).Error } // GetAPIKeysConfig reads the API keys config from settings. func (s *Store) GetAPIKeysConfig() (*model.APIKeysConfig, error) { setting, err := s.GetSetting("api_keys") if err != nil { return nil, err } if setting == nil { return &model.APIKeysConfig{}, nil } var cfg model.APIKeysConfig if err := json.Unmarshal(setting.Value, &cfg); err != nil { return &model.APIKeysConfig{}, nil } return &cfg, nil } // GetGradingConfig reads the grading config from settings, or returns default. func (s *Store) GetGradingConfig() (*model.GradingConfig, error) { setting, err := s.GetSetting("grading") if err != nil { return nil, err } if setting == nil { cfg := model.DefaultGradingConfig() return &cfg, nil } var cfg model.GradingConfig if err := json.Unmarshal(setting.Value, &cfg); err != nil { cfg = model.DefaultGradingConfig() return &cfg, nil } return &cfg, nil }