Alexander Belanger 5 лет назад
Родитель
Сommit
d1cbf60969
1 измененных файлов с 36 добавлено и 3 удалено
  1. 36 3
      cli/cmd/connect/docr.go

+ 36 - 3
cli/cmd/connect/docr.go

@@ -4,6 +4,7 @@ import (
 	"context"
 	"fmt"
 	"strings"
+	"time"
 
 	"github.com/porter-dev/porter/cli/cmd/api"
 	"github.com/porter-dev/porter/cli/cmd/utils"
@@ -41,7 +42,7 @@ func DOCR(
 	}
 
 	if !linkedDO {
-		doAuth, err = triggerDigitalOceanOAuth(projectID)
+		doAuth, err = triggerDigitalOceanOAuth(client, projectID)
 
 		if err != nil {
 			return 0, err
@@ -76,6 +77,38 @@ Registry URL: `))
 	return reg.ID, nil
 }
 
-func triggerDigitalOceanOAuth(projectID uint) (ints.OAuthIntegrationExternal, error) {
-	return ints.OAuthIntegrationExternal{}, nil
+func triggerDigitalOceanOAuth(client *api.Client, projectID uint) (ints.OAuthIntegrationExternal, error) {
+	var doAuth ints.OAuthIntegrationExternal
+
+	oauthURL := fmt.Sprintf("%s/oauth/projects/%d/digitalocean", client.BaseURL, projectID)
+
+	fmt.Printf("Please visit %s in your browser to connect to Digital Ocean (it should open automatically).", oauthURL)
+	utils.OpenBrowser(oauthURL)
+
+	for {
+		oauthInts, err := client.ListOAuthIntegrations(context.TODO(), projectID)
+
+		if err != nil {
+			return doAuth, err
+		}
+
+		linkedDO := false
+
+		// iterate through oauth integrations to find do
+		for _, oauthInt := range oauthInts {
+			if oauthInt.Client == ints.OAuthDigitalOcean {
+				linkedDO = true
+				doAuth = oauthInt
+				break
+			}
+		}
+
+		if linkedDO {
+			break
+		}
+
+		time.Sleep(2 * time.Second)
+	}
+
+	return doAuth, nil
 }