This is an automated email from the ASF dual-hosted git repository.

warren pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new a242c24b feat: revert to check multi token in github plugin
a242c24b is described below

commit a242c24bfc963572a40852e9fae11024344d3c02
Author: linyh <[email protected]>
AuthorDate: Mon Jul 18 20:33:40 2022 +0800

    feat: revert to check multi token in github plugin
---
 plugins/github/api/connection.go | 87 ++++++++++++++++++++++++++++------------
 1 file changed, 62 insertions(+), 25 deletions(-)

diff --git a/plugins/github/api/connection.go b/plugins/github/api/connection.go
index 5890175d..549e3269 100644
--- a/plugins/github/api/connection.go
+++ b/plugins/github/api/connection.go
@@ -22,6 +22,7 @@ import (
        "fmt"
        "github.com/apache/incubator-devlake/api/shared"
        "net/http"
+       "strings"
        "time"
 
        "github.com/apache/incubator-devlake/plugins/github/models"
@@ -61,39 +62,75 @@ func TestConnection(input *core.ApiResourceInput) 
(*core.ApiResourceOutput, erro
        if err != nil {
                return nil, err
        }
-       apiClient, err := helper.NewApiClient(
-               context.TODO(),
-               params.Endpoint,
-               map[string]string{
-                       "Authorization": fmt.Sprintf("Bearer %s", params.Token),
-               },
-               3*time.Second,
-               params.Proxy,
-               basicRes,
-       )
-       if err != nil {
-               return nil, err
+       tokens := strings.Split(params.Token, ",")
+
+       // verify multiple token in parallel
+       type VerifyResult struct {
+               err   error
+               login string
        }
-       res, err := apiClient.Get("user", nil, nil)
-       if err != nil {
-               return nil, err
+       results := make(chan VerifyResult)
+       for i := 0; i < len(tokens); i++ {
+               token := tokens[i]
+               j := i + 1
+               go func() {
+                       apiClient, err := helper.NewApiClient(
+                               context.TODO(),
+                               params.Endpoint,
+                               map[string]string{
+                                       "Authorization": fmt.Sprintf("Bearer 
%s", token),
+                               },
+                               3*time.Second,
+                               params.Proxy,
+                               basicRes,
+                       )
+                       if err != nil {
+                               results <- VerifyResult{err: fmt.Errorf("verify 
token failed for #%v %s %w", j, token, err)}
+                               return
+                       }
+                       res, err := apiClient.Get("user", nil, nil)
+                       if err != nil {
+                               results <- VerifyResult{err: fmt.Errorf("verify 
token failed for #%v %s %w", j, token, err)}
+                               return
+                       }
+                       githubUserOfToken := &models.GithubUserOfToken{}
+                       err = helper.UnmarshalResponse(res, githubUserOfToken)
+                       if err != nil {
+                               results <- VerifyResult{err: fmt.Errorf("verify 
token failed for #%v %s %w", j, token, err)}
+                               return
+                       } else if githubUserOfToken.Login == "" {
+                               results <- VerifyResult{err: 
fmt.Errorf("invalid token for #%v %s", j, token)}
+                               return
+                       }
+                       results <- VerifyResult{login: githubUserOfToken.Login}
+               }()
+       }
+
+       // collect verification results
+       logins := make([]string, 0)
+       msgs := make([]string, 0)
+       i := 0
+       for result := range results {
+               if result.err != nil {
+                       msgs = append(msgs, result.err.Error())
+               }
+               logins = append(logins, result.login)
+               i++
+               if i == len(tokens) {
+                       close(results)
+               }
        }
+       if len(msgs) > 0 {
+               return nil, fmt.Errorf(strings.Join(msgs, "\n"))
+       }
+
        var githubApiResponse struct {
                shared.ApiBody
                Login string `json:"login"`
        }
-       githubUserOfToken := &models.GithubUserOfToken{}
-       err = helper.UnmarshalResponse(res, githubUserOfToken)
-       if err != nil {
-               return nil, err
-       } else if githubUserOfToken.Login == "" {
-               return nil, fmt.Errorf("invalid token")
-       }
        githubApiResponse.Success = true
        githubApiResponse.Message = "success"
-       githubApiResponse.Login = githubUserOfToken.Login
-
-       // output
+       githubApiResponse.Login = strings.Join(logins, `,`)
        return &core.ApiResourceOutput{Body: githubApiResponse, Status: 
http.StatusOK}, nil
 }
 

Reply via email to