@@ -81,8 +81,29 @@ func (s *SettingService) get(ctx context.Context, key string) (string, error) {
|
||||
|
||||
// set 写入键值(key 为主键,Save 即 upsert)。
|
||||
func (s *SettingService) set(ctx context.Context, key, value string) error {
|
||||
if err := saveSettingTx(s.db.WithContext(ctx), key, value); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// settingValueTx / saveSettingTx 是事务内变体:供跨表不变量(如「至少保留一种
|
||||
// 登录方式」)在同一事务与用户行锁下读写开关,与 get/set 同表同形。
|
||||
func settingValueTx(tx *gorm.DB, key string) (string, error) {
|
||||
var st model.Setting
|
||||
err := tx.First(&st, "key = ?", key).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return "", nil
|
||||
}
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("get setting %s: %w", key, err)
|
||||
}
|
||||
return st.Value, nil
|
||||
}
|
||||
|
||||
func saveSettingTx(tx *gorm.DB, key, value string) error {
|
||||
st := model.Setting{Key: key, Value: value, UpdatedAt: time.Now()}
|
||||
if err := s.db.WithContext(ctx).Save(&st).Error; err != nil {
|
||||
if err := tx.Save(&st).Error; err != nil {
|
||||
return fmt.Errorf("set setting %s: %w", key, err)
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user