73 lines
2.4 KiB
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)
|
|
}
|