github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/cli/commands/resources/project/import.go (about)

     1  package project
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/google/go-github/v53/github"
     8  	"github.com/taubyte/tau-cli/cli/common"
     9  	"github.com/taubyte/tau-cli/env"
    10  	"github.com/taubyte/tau-cli/flags"
    11  	"github.com/taubyte/tau-cli/i18n"
    12  	projectI18n "github.com/taubyte/tau-cli/i18n/project"
    13  	repositoryI18n "github.com/taubyte/tau-cli/i18n/repository"
    14  	singletonsI18n "github.com/taubyte/tau-cli/i18n/singletons"
    15  	loginLib "github.com/taubyte/tau-cli/lib/login"
    16  	"github.com/taubyte/tau-cli/prompts"
    17  	authClient "github.com/taubyte/tau-cli/singletons/auth_client"
    18  	"github.com/taubyte/tau-cli/singletons/session"
    19  	httpClient "github.com/taubyte/tau/clients/http/auth"
    20  	slices "github.com/taubyte/utils/slices/string"
    21  	"github.com/urfave/cli/v2"
    22  )
    23  
    24  func (link) Import() common.Command {
    25  	return common.Create(
    26  		&cli.Command{
    27  			Action: _import,
    28  			Flags: []cli.Flag{
    29  				&cli.StringFlag{
    30  					Name: "config",
    31  				},
    32  				&cli.StringFlag{
    33  					Name: "code",
    34  				},
    35  				flags.Yes,
    36  			},
    37  		},
    38  	)
    39  }
    40  
    41  func _import(ctx *cli.Context) error {
    42  	if network, _ := env.GetSelectedNetwork(); len(network) < 1 {
    43  		return singletonsI18n.NoNetworkSelected()
    44  	}
    45  
    46  	profile, err := loginLib.GetSelectedProfile()
    47  	if err != nil {
    48  		return err
    49  	}
    50  
    51  	repos, err := ListRepos(ctx.Context, profile.Token, profile.GitUsername)
    52  	if err != nil {
    53  		return err
    54  	}
    55  
    56  	repoMap := make(map[string]*github.Repository, len(repos))
    57  	configRepos := make([]string, 0, len(repos))
    58  	codeRepos := make([]string, 0, len(repos))
    59  	for _, repo := range repos {
    60  		splitName := strings.SplitN(repo.GetName(), "_", 3)
    61  		if len(splitName) < 2 || splitName[0] != "tb" || splitName[1] == "library" || splitName[1] == "website" {
    62  			continue
    63  		}
    64  
    65  		fullName := repo.GetFullName()
    66  		switch splitName[1] {
    67  		case "code":
    68  			codeRepos = append(codeRepos, fullName)
    69  		default:
    70  			configRepos = append(configRepos, fullName)
    71  		}
    72  		repoMap[fullName] = repo
    73  	}
    74  
    75  	configRepoName := prompts.GetOrAskForSelection(ctx, "config", "Config:", configRepos)
    76  	configSplit := strings.SplitN(configRepoName, "_", 2)
    77  	codeSplit := []string{configSplit[0], "code", configSplit[1]}
    78  	codeRepoName := strings.Join(codeSplit, "_")
    79  
    80  	var prev []string
    81  	if slices.Contains(codeRepos, codeRepoName) {
    82  		prev = append(prev, codeRepoName)
    83  	}
    84  
    85  	codeRepoName = prompts.GetOrAskForSelection(ctx, "code", "Code:", codeRepos, prev...)
    86  	codeRepo, ok := repoMap[codeRepoName]
    87  	if !ok {
    88  		return i18n.ErrorDoesNotExist("code repo", codeRepoName)
    89  	}
    90  
    91  	configRepo, ok := repoMap[configRepoName]
    92  	if !ok {
    93  		return i18n.ErrorDoesNotExist("config repo", configRepoName)
    94  	}
    95  
    96  	clientProject := &httpClient.Project{
    97  		Name: configSplit[1],
    98  	}
    99  
   100  	auth, err := authClient.Load()
   101  	if err != nil {
   102  		return err
   103  	}
   104  
   105  	codeId := fmt.Sprintf("%d", codeRepo.GetID())
   106  	configId := fmt.Sprintf("%d", configRepo.GetID())
   107  
   108  	if err = auth.RegisterRepository(codeId); err != nil {
   109  		return repositoryI18n.RegisteringRepositoryFailed(codeRepoName, err)
   110  	}
   111  
   112  	if err = auth.RegisterRepository(configId); err != nil {
   113  		return repositoryI18n.RegisteringRepositoryFailed(configRepoName, err)
   114  	}
   115  
   116  	if err = clientProject.Create(auth, configId, codeId); err != nil {
   117  		return projectI18n.CreatingProjectFailed(err)
   118  	}
   119  
   120  	projectI18n.ImportedProject(clientProject.Name, profile.Network)
   121  
   122  	if prompts.ConfirmPrompt(ctx, fmt.Sprintf("select `%s` as current project?", clientProject.Name)) {
   123  		if err = session.Set().SelectedProject(clientProject.Name); err != nil {
   124  			return projectI18n.SelectingAProjectPromptFailed(err)
   125  		}
   126  
   127  		projectI18n.SelectedProject(clientProject.Name)
   128  		checkProjectClonedHelp(clientProject.Name)
   129  	}
   130  
   131  	return nil
   132  }