UpsertSetting upserts the setting by name.
(ctx context.Context, update *SettingMessage)
| 320 | |
| 321 | // UpsertSetting upserts the setting by name. |
| 322 | func (s *Store) UpsertSetting(ctx context.Context, update *SettingMessage) (*SettingMessage, error) { |
| 323 | valueBytes, err := protojson.Marshal(update.Value) |
| 324 | if err != nil { |
| 325 | return nil, errors.Wrap(err, "failed to marshal setting value") |
| 326 | } |
| 327 | |
| 328 | q := qb.Q().Space(` |
| 329 | INSERT INTO setting (name, workspace, value) |
| 330 | VALUES (?, ?, ?) |
| 331 | ON CONFLICT (name, workspace) DO UPDATE SET value = EXCLUDED.value |
| 332 | RETURNING name, workspace, value |
| 333 | `, update.Name.String(), update.Workspace, string(valueBytes)) |
| 334 | |
| 335 | query, args, err := q.ToSQL() |
| 336 | if err != nil { |
| 337 | return nil, errors.Wrapf(err, "failed to build sql") |
| 338 | } |
| 339 | |
| 340 | var setting SettingMessage |
| 341 | var nameString string |
| 342 | var valueString string |
| 343 | if err := s.GetDB().QueryRowContext(ctx, query, args...).Scan( |
| 344 | &nameString, |
| 345 | &setting.Workspace, |
| 346 | &valueString, |
| 347 | ); err != nil { |
| 348 | if err == sql.ErrNoRows { |
| 349 | return nil, &common.Error{Code: common.NotFound, Err: errors.Errorf("setting not found: %s", update.Name)} |
| 350 | } |
| 351 | return nil, err |
| 352 | } |
| 353 | value, ok := storepb.SettingName_value[nameString] |
| 354 | if !ok { |
| 355 | return nil, errors.Errorf("invalid setting name string: %s", nameString) |
| 356 | } |
| 357 | setting.Name = storepb.SettingName(value) |
| 358 | |
| 359 | msg, err := getSettingMessage(setting.Name) |
| 360 | if err != nil { |
| 361 | return nil, err |
| 362 | } |
| 363 | if err := common.ProtojsonUnmarshaler.Unmarshal([]byte(valueString), msg); err != nil { |
| 364 | return nil, err |
| 365 | } |
| 366 | setting.Value = msg |
| 367 | |
| 368 | s.settingCache.Add(getSettingCacheKey(setting.Workspace, setting.Name), &setting) |
| 369 | return &setting, nil |
| 370 | } |
| 371 | |
| 372 | // DeleteSetting deletes a setting by the name. |
| 373 | func (s *Store) DeleteSetting(ctx context.Context, workspace string, name storepb.SettingName) error { |
no test coverage detected