github.com/taubyte/tau-cli@v0.1.13-0.20240326000942-487f0d57edfc/prompts/website/repository.go (about)

     1  package websitePrompts
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/pterm/pterm"
     8  	structureSpec "github.com/taubyte/go-specs/structure"
     9  	"github.com/taubyte/tau-cli/common"
    10  	"github.com/taubyte/tau-cli/flags"
    11  	projectLib "github.com/taubyte/tau-cli/lib/project"
    12  	repositoryLib "github.com/taubyte/tau-cli/lib/repository"
    13  	"github.com/taubyte/tau-cli/prompts"
    14  	authClient "github.com/taubyte/tau-cli/singletons/auth_client"
    15  	"github.com/taubyte/tau-cli/singletons/templates"
    16  	httpClient "github.com/taubyte/tau/clients/http/auth"
    17  	"github.com/urfave/cli/v2"
    18  )
    19  
    20  func RepositoryInfo(ctx *cli.Context, website *structureSpec.Website, new bool) (interface{}, error) {
    21  	if new && prompts.GetGenerateRepository(ctx) {
    22  		return repositoryInfoGenerate(ctx, website)
    23  	}
    24  
    25  	selectedRepository, err := prompts.SelectARepository(ctx, &repositoryLib.Info{
    26  		Type:     repositoryLib.WebsiteRepositoryType,
    27  		FullName: website.RepoName,
    28  		ID:       website.RepoID,
    29  	})
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  
    34  	website.RepoID = selectedRepository.ID
    35  	website.RepoName = selectedRepository.FullName
    36  
    37  	projectConfig, err := projectLib.SelectedProjectConfig()
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  
    42  	if !selectedRepository.HasBeenCloned(projectConfig, website.Provider) {
    43  		selectedRepository.DoClone = prompts.GetClone(ctx)
    44  	}
    45  
    46  	return selectedRepository, nil
    47  
    48  }
    49  
    50  func isRepositoryNameTaken(client *httpClient.Client, name string) (bool, error) {
    51  	var fullName string
    52  	if len(strings.Split(name, "/")) == 2 {
    53  		fullName = name
    54  	} else {
    55  		userInfo, err := client.User().Get()
    56  		if err != nil {
    57  			return false, err
    58  		}
    59  
    60  		fullName = fmt.Sprintf("%s/%s", userInfo.Login, name)
    61  	}
    62  
    63  	// Considering name to be taken if err is nil
    64  	_, err := client.GetRepositoryByName(fullName)
    65  	if err == nil {
    66  		return true, nil
    67  	}
    68  
    69  	return false, nil
    70  }
    71  
    72  // Only called by new
    73  func repositoryInfoGenerate(ctx *cli.Context, website *structureSpec.Website) (*repositoryLib.InfoTemplate, error) {
    74  	var repositoryName string
    75  	if ctx.IsSet(flags.RepositoryName.Name) {
    76  		repositoryName = ctx.String(flags.RepositoryName.Name)
    77  	} else {
    78  		repositoryName = fmt.Sprintf(common.WebsiteRepoPrefix, website.Name)
    79  	}
    80  
    81  	// Confirm name is valid
    82  	client, err := authClient.Load()
    83  	if err != nil {
    84  		return nil, err
    85  	}
    86  
    87  	// Skipping prompt for repository name unless set, or generated name is already taken
    88  	for taken, err := isRepositoryNameTaken(client, repositoryName); taken; {
    89  		if err != nil {
    90  			return nil, err
    91  		}
    92  
    93  		pterm.Warning.Printfln("Repository name %s is already taken", repositoryName)
    94  		repositoryName = prompts.GetOrRequireARepositoryName(ctx)
    95  
    96  		taken, err = isRepositoryNameTaken(client, repositoryName)
    97  	}
    98  
    99  	private := prompts.GetPrivate(ctx)
   100  
   101  	templateMap, err := templates.Get().Websites()
   102  	if err != nil {
   103  		// TODO verbose
   104  		return nil, err
   105  	}
   106  
   107  	templateUrl, err := prompts.SelectATemplate(ctx, templateMap)
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  
   112  	return &repositoryLib.InfoTemplate{
   113  		RepositoryName: repositoryName,
   114  		Info: templates.TemplateInfo{
   115  			URL: templateUrl,
   116  			// TODO Update website template description style
   117  			// Description: website.Description,
   118  		},
   119  		Private: private,
   120  	}, nil
   121  }