supabase-cli/internal/postgresConfig/update/update.go

73 lines
2.4 KiB
Go

package update
import (
"bytes"
"context"
"encoding/json"
"strconv"
"strings"
"github.com/go-errors/errors"
"github.com/spf13/afero"
"github.com/supabase/cli/internal/postgresConfig/get"
"github.com/supabase/cli/internal/utils"
)
func Run(ctx context.Context, projectRef string, values []string, replaceOverrides, noRestart bool, fsys afero.Fs) error {
// 1. Prepare config overrides
newConfigOverrides := make(map[string]string)
for _, config := range values {
splits := strings.Split(config, "=")
if len(splits) != 2 {
return errors.Errorf("expected config value in key:value format, received: '%s'", config)
}
newConfigOverrides[splits[0]] = splits[1]
}
// 2. If not in replace mode, retrieve current overrides
finalOverrides := make(map[string]interface{})
{
if !replaceOverrides {
config, err := get.GetCurrentPostgresConfig(ctx, projectRef)
if err != nil {
return err
}
finalOverrides = config
}
}
// 3. Create the list of final overrides
{
for k, v := range newConfigOverrides {
// this is hacky - if we're able to convert the value to an integer, we do so
// if we start supporting config fields with e.g. floating pt overrides this'll need to be updated
if vInt, err := strconv.Atoi(v); err == nil {
finalOverrides[k] = vInt
} else if vBool, err := strconv.ParseBool(v); err == nil {
finalOverrides[k] = vBool
} else {
finalOverrides[k] = v
}
}
}
// 4. update config overrides and print out final result
{
if noRestart {
finalOverrides["restart_database"] = false
}
bts, err := json.Marshal(finalOverrides)
if err != nil {
return errors.Errorf("failed to serialize config overrides: %w", err)
}
resp, err := utils.GetSupabase().V1UpdatePostgresConfigWithBodyWithResponse(ctx, projectRef, "application/json", bytes.NewReader(bts))
if err != nil {
return errors.Errorf("failed to update config overrides: %w", err)
}
if resp.JSON200 == nil {
if resp.StatusCode() == 400 {
return errors.Errorf("failed to update config overrides: %s (%s). This usually indicates that an unsupported or invalid config override was attempted. Please refer to https://supabase.com/docs/guides/platform/custom-postgres-config", resp.Status(), string(resp.Body))
}
return errors.Errorf("failed to update config overrides: %s (%s)", resp.Status(), string(resp.Body))
}
}
return get.Run(ctx, projectRef, fsys)
}