github.com/supabase/cli@v1.168.1/internal/secrets/set/set.go (about) 1 package set 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "os" 8 "strings" 9 10 "github.com/go-errors/errors" 11 "github.com/joho/godotenv" 12 "github.com/spf13/afero" 13 "github.com/supabase/cli/internal/utils" 14 "github.com/supabase/cli/pkg/api" 15 ) 16 17 func Run(ctx context.Context, projectRef, envFilePath string, args []string, fsys afero.Fs) error { 18 // 1. Sanity checks. 19 // 2. Set secret(s). 20 { 21 var secrets api.CreateSecretsJSONBody 22 if envFilePath != "" { 23 envMap, err := ParseEnvFile(envFilePath, fsys) 24 if err != nil { 25 return err 26 } 27 for name, value := range envMap { 28 if strings.HasPrefix(name, "SUPABASE_") { 29 fmt.Fprintln(os.Stderr, "Env name cannot start with SUPABASE_, skipping: "+name) 30 continue 31 } 32 secret := api.CreateSecretBody{ 33 Name: name, 34 Value: value, 35 } 36 secrets = append(secrets, secret) 37 } 38 } else if len(args) == 0 { 39 return errors.New("No arguments found. Use --env-file to read from a .env file.") 40 } else { 41 for _, pair := range args { 42 name, value, found := strings.Cut(pair, "=") 43 if !found { 44 return errors.New("Invalid secret pair: " + utils.Aqua(pair) + ". Must be NAME=VALUE.") 45 } 46 47 secret := api.CreateSecretBody{ 48 Name: name, 49 Value: value, 50 } 51 secrets = append(secrets, secret) 52 } 53 } 54 55 resp, err := utils.GetSupabase().CreateSecretsWithResponse(ctx, projectRef, secrets) 56 if err != nil { 57 return errors.Errorf("failed to set secrets: %w", err) 58 } 59 60 // TODO: remove the StatusOK case after 2022-08-20 61 if resp.StatusCode() != http.StatusCreated && resp.StatusCode() != http.StatusOK { 62 return errors.New("Unexpected error setting project secrets: " + string(resp.Body)) 63 } 64 } 65 66 fmt.Println("Finished " + utils.Aqua("supabase secrets set") + ".") 67 return nil 68 } 69 70 func ParseEnvFile(envFilePath string, fsys afero.Fs) (map[string]string, error) { 71 f, err := fsys.Open(envFilePath) 72 if err != nil { 73 return nil, errors.Errorf("failed to open env file: %w", err) 74 } 75 defer f.Close() 76 envMap, err := godotenv.Parse(f) 77 if err != nil { 78 return nil, errors.Errorf("failed to parse env file: %w", err) 79 } 80 return envMap, nil 81 }