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  }