| package sql |
|
|
| import ( |
| "context" |
| "database/sql" |
| "fmt" |
| "time" |
|
|
| "ccLoad/internal/model" |
| ) |
|
|
| |
| func (s *SQLStore) GetSetting(ctx context.Context, key string) (*model.SystemSetting, error) { |
| row := s.db.QueryRowContext(ctx, ` |
| SELECT `+"`key`"+`, `+"`value`"+`, value_type, description, default_value, updated_at |
| FROM system_settings |
| WHERE `+"`key`"+` = ? |
| `, key) |
|
|
| var setting model.SystemSetting |
| if err := row.Scan(&setting.Key, &setting.Value, &setting.ValueType, &setting.Description, &setting.DefaultValue, &setting.UpdatedAt); err != nil { |
| if err == sql.ErrNoRows { |
| return nil, model.ErrSettingNotFound |
| } |
| return nil, fmt.Errorf("query setting: %w", err) |
| } |
|
|
| return &setting, nil |
| } |
|
|
| |
| func (s *SQLStore) ListAllSettings(ctx context.Context) ([]*model.SystemSetting, error) { |
| rows, err := s.db.QueryContext(ctx, ` |
| SELECT `+"`key`"+`, `+"`value`"+`, value_type, description, default_value, updated_at |
| FROM system_settings |
| ORDER BY `+"`key`"+` ASC |
| `) |
| if err != nil { |
| return nil, fmt.Errorf("query all settings: %w", err) |
| } |
| defer func() { _ = rows.Close() }() |
|
|
| var settings []*model.SystemSetting |
| for rows.Next() { |
| var setting model.SystemSetting |
| if err := rows.Scan(&setting.Key, &setting.Value, &setting.ValueType, &setting.Description, &setting.DefaultValue, &setting.UpdatedAt); err != nil { |
| return nil, fmt.Errorf("scan setting: %w", err) |
| } |
| settings = append(settings, &setting) |
| } |
|
|
| return settings, rows.Err() |
| } |
|
|
| |
| func (s *SQLStore) UpdateSetting(ctx context.Context, key, value string) error { |
| now := timeToUnix(time.Now()) |
|
|
| result, err := s.db.ExecContext(ctx, ` |
| UPDATE system_settings |
| SET `+"`value`"+` = ?, updated_at = ? |
| WHERE `+"`key`"+` = ? |
| `, value, now, key) |
| if err != nil { |
| return fmt.Errorf("update setting: %w", err) |
| } |
|
|
| rows, err := result.RowsAffected() |
| if err != nil { |
| return fmt.Errorf("check rows affected: %w", err) |
| } |
| if rows == 0 { |
| return model.ErrSettingNotFound |
| } |
|
|
| return nil |
| } |
|
|
| |
| func (s *SQLStore) BatchUpdateSettings(ctx context.Context, updates map[string]string) error { |
| return s.WithTransaction(ctx, func(tx *sql.Tx) error { |
| now := timeToUnix(time.Now()) |
|
|
| stmt, err := tx.PrepareContext(ctx, ` |
| UPDATE system_settings |
| SET `+"`value`"+` = ?, updated_at = ? |
| WHERE `+"`key`"+` = ? |
| `) |
| if err != nil { |
| return fmt.Errorf("prepare statement: %w", err) |
| } |
| defer func() { _ = stmt.Close() }() |
|
|
| for key, value := range updates { |
| result, err := stmt.ExecContext(ctx, value, now, key) |
| if err != nil { |
| return fmt.Errorf("update setting %s: %w", key, err) |
| } |
|
|
| rows, err := result.RowsAffected() |
| if err != nil { |
| return fmt.Errorf("check rows affected for %s: %w", key, err) |
| } |
| if rows == 0 { |
| return model.ErrSettingNotFound |
| } |
| } |
|
|
| return nil |
| }) |
| } |
|
|