github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/login/login.go (about)

     1  package login
     2  
     3  import (
     4  	"bufio"
     5  	"errors"
     6  	"fmt"
     7  	"io"
     8  	"os"
     9  	"path/filepath"
    10  	"strings"
    11  
    12  	"github.com/spf13/afero"
    13  	"github.com/Redstoneguy129/cli/internal/utils"
    14  	"github.com/Redstoneguy129/cli/internal/utils/credentials"
    15  )
    16  
    17  func Run(stdin io.Reader, fsys afero.Fs) error {
    18  	fmt.Fprintf(os.Stderr, `You can generate an access token from %s/account/tokens
    19  Enter your access token: `, utils.GetSupabaseDashboardURL())
    20  
    21  	scanner := bufio.NewScanner(stdin)
    22  	if !scanner.Scan() {
    23  		fmt.Println("Cancelled " + utils.Aqua("supabase login") + ".")
    24  		return nil
    25  	}
    26  
    27  	accessToken := strings.TrimSpace(scanner.Text())
    28  
    29  	// 1. Validate access token
    30  	if !utils.AccessTokenPattern.MatchString(accessToken) {
    31  		return errors.New("Invalid access token format. Must be like `sbp_0102...1920`.")
    32  	}
    33  
    34  	// 2. Save access token
    35  	if err := credentials.Set(utils.AccessTokenKey, accessToken); err == nil {
    36  		return nil
    37  	}
    38  	return fallbackSaveToken(accessToken, fsys)
    39  }
    40  
    41  func fallbackSaveToken(accessToken string, fsys afero.Fs) error {
    42  	home, err := os.UserHomeDir()
    43  	if err != nil {
    44  		return err
    45  	}
    46  
    47  	configPath := filepath.Join(home, ".supabase")
    48  	if err := utils.MkdirIfNotExistFS(fsys, configPath); err != nil {
    49  		return err
    50  	}
    51  
    52  	accessTokenPath := filepath.Join(configPath, utils.AccessTokenKey)
    53  	return afero.WriteFile(fsys, accessTokenPath, []byte(accessToken), 0600)
    54  }