bridge/core: load token value in ensureInit

amine created

bridge/core: add more token functionalities

Change summary

bridge/core/bridge.go | 15 +++++++-
bridge/core/token.go  | 76 +++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 87 insertions(+), 4 deletions(-)

Detailed changes

bridge/core/bridge.go 🔗

@@ -13,6 +13,7 @@ import (
 	"github.com/pkg/errors"
 
 	"github.com/MichaelMure/git-bug/cache"
+	"github.com/MichaelMure/git-bug/entity"
 	"github.com/MichaelMure/git-bug/repository"
 )
 
@@ -20,8 +21,10 @@ var ErrImportNotSupported = errors.New("import is not supported")
 var ErrExportNotSupported = errors.New("export is not supported")
 
 const (
-	ConfigKeyTarget = "target"
-	MetaKeyOrigin   = "origin"
+	ConfigKeyTarget  = "target"
+	ConfigKeyToken   = "token"
+	ConfigKeyTokenId = "token-id"
+	MetaKeyOrigin    = "origin"
 
 	bridgeConfigKeyPrefix = "git-bug.bridge"
 )
@@ -35,6 +38,7 @@ type BridgeParams struct {
 	Project    string
 	URL        string
 	Token      string
+	TokenId    string
 	TokenStdin bool
 }
 
@@ -276,6 +280,13 @@ func (b *Bridge) ensureInit() error {
 		return nil
 	}
 
+	token, err := LoadToken(b.repo, entity.Id(b.conf[ConfigKeyTokenId]))
+	if err != nil {
+		return err
+	}
+
+	b.conf[ConfigKeyToken] = token.Value
+
 	importer := b.getImporter()
 	if importer != nil {
 		err := importer.Init(b.conf)

bridge/core/token.go 🔗

@@ -122,8 +122,7 @@ func LoadTokenPrefix(repo repository.RepoCommon, prefix string) (*Token, error)
 	return LoadToken(repo, matching[0])
 }
 
-// ListTokens return a map representing the stored tokens in the repo config and global config
-// along with their type (global: true, local:false)
+// ListTokens list all existing token ids
 func ListTokens(repo repository.RepoCommon) ([]entity.Id, error) {
 	configs, err := repo.GlobalConfig().ReadAll(tokenConfigKeyPrefix + ".")
 	if err != nil {
@@ -157,6 +156,79 @@ func ListTokens(repo repository.RepoCommon) ([]entity.Id, error) {
 	return result, nil
 }
 
+// ListTokensWithTarget list all token ids associated with the target
+func ListTokensWithTarget(repo repository.RepoCommon, target string) ([]entity.Id, error) {
+	var ids []entity.Id
+	tokensIds, err := ListTokens(repo)
+	if err != nil {
+		return nil, err
+	}
+
+	for _, tokenId := range tokensIds {
+		token, err := LoadToken(repo, tokenId)
+		if err != nil {
+			return nil, err
+		}
+
+		if token.Target == target {
+			ids = append(ids, tokenId)
+		}
+	}
+	return ids, nil
+}
+
+// LoadTokens load all existing tokens
+func LoadTokens(repo repository.RepoCommon) ([]*Token, error) {
+	tokensIds, err := ListTokens(repo)
+	if err != nil {
+		return nil, err
+	}
+
+	var tokens []*Token
+	for _, id := range tokensIds {
+		token, err := LoadToken(repo, id)
+		if err != nil {
+			return nil, err
+		}
+		tokens = append(tokens, token)
+	}
+	return tokens, nil
+}
+
+// TokenIdExist return wether token id exist or not
+func TokenIdExist(repo repository.RepoCommon, id entity.Id) bool {
+	_, err := LoadToken(repo, id)
+	return err == nil
+}
+
+// TokenExist return wether there is a token with a certain value or not
+func TokenExist(repo repository.RepoCommon, value string) bool {
+	tokens, err := LoadTokens(repo)
+	if err != nil {
+		return false
+	}
+	for _, token := range tokens {
+		if token.Value == value {
+			return true
+		}
+	}
+	return false
+}
+
+// TokenExistWithTarget same as TokenExist but restrict search for a given target
+func TokenExistWithTarget(repo repository.RepoCommon, value string, target string) bool {
+	tokens, err := LoadTokens(repo)
+	if err != nil {
+		return false
+	}
+	for _, token := range tokens {
+		if token.Value == value && token.Target == target {
+			return true
+		}
+	}
+	return false
+}
+
 // StoreToken stores a token in the repo config
 func StoreToken(repo repository.RepoCommon, token *Token) error {
 	storeValueKey := fmt.Sprintf("git-bug.token.%s.%s", token.ID().String(), tokenValueKey)