You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by li...@apache.org on 2023/03/16 08:09:28 UTC

[incubator-devlake] branch main updated: refactor(bamboo): refactor remote (#4684)

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

likyh 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 e821eb7db refactor(bamboo): refactor remote (#4684)
e821eb7db is described below

commit e821eb7dbdf936ba8975990da2e8921b481082b5
Author: Warren Chen <yi...@merico.dev>
AuthorDate: Thu Mar 16 16:09:24 2023 +0800

    refactor(bamboo): refactor remote (#4684)
---
 backend/plugins/bamboo/api/init.go          |   7 ++
 backend/plugins/bamboo/api/remote.go        | 117 +---------------------------
 backend/plugins/bamboo/impl/impl.go         |   2 +-
 backend/plugins/bamboo/models/connection.go |  27 +++++++
 backend/plugins/bamboo/models/project.go    |  38 +++++++--
 5 files changed, 69 insertions(+), 122 deletions(-)

diff --git a/backend/plugins/bamboo/api/init.go b/backend/plugins/bamboo/api/init.go
index 91d9b0cbf..7705fd797 100644
--- a/backend/plugins/bamboo/api/init.go
+++ b/backend/plugins/bamboo/api/init.go
@@ -27,6 +27,8 @@ import (
 var vld *validator.Validate
 var connectionHelper *api.ConnectionApiHelper
 var scopeHelper *api.ScopeApiHelper[models.BambooConnection, models.BambooProject, models.BambooTransformationRule]
+var remoteHelper *api.RemoteApiHelper[models.BambooConnection, models.BambooProject, models.ApiBambooProject, models.GroupResponse]
+
 var basicRes context.BasicRes
 
 func Init(br context.BasicRes) {
@@ -41,4 +43,9 @@ func Init(br context.BasicRes) {
 		vld,
 		connectionHelper,
 	)
+	remoteHelper = api.NewRemoteHelper[models.BambooConnection, models.BambooProject, models.ApiBambooProject, models.GroupResponse](
+		basicRes,
+		vld,
+		connectionHelper,
+	)
 }
diff --git a/backend/plugins/bamboo/api/remote.go b/backend/plugins/bamboo/api/remote.go
index 91551001c..395b560f9 100644
--- a/backend/plugins/bamboo/api/remote.go
+++ b/backend/plugins/bamboo/api/remote.go
@@ -19,8 +19,6 @@ package api
 
 import (
 	"context"
-	"encoding/base64"
-	"encoding/json"
 	"fmt"
 	"net/http"
 	"net/url"
@@ -73,84 +71,7 @@ const TypeGroup string = "group"
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bamboo/connections/{connectionId}/remote-scopes [GET]
 func RemoteScopes(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, errors.Error) {
-	connectionId, _ := extractParam(input.Params)
-	if connectionId == 0 {
-		return nil, errors.BadInput.New("invalid connectionId")
-	}
-
-	connection := &models.BambooConnection{}
-	err := connectionHelper.First(connection, input.Params)
-	if err != nil {
-		return nil, err
-	}
-
-	pageToken, ok := input.Query["pageToken"]
-	if !ok || len(pageToken) == 0 {
-		pageToken = []string{""}
-	}
-
-	// get pageData
-	pageData, err := GetPageDataFromPageToken(pageToken[0])
-	if err != nil {
-		return nil, errors.BadInput.New("failed to get paget token")
-	}
-
-	// create api client
-	apiClient, err := api.NewApiClientFromConnection(context.TODO(), basicRes, connection)
-	if err != nil {
-		return nil, err
-	}
-
-	var res *http.Response
-	outputBody := &RemoteScopesOutput{}
-
-	query := GetQueryFromPageData(pageData)
-
-	res, err = apiClient.Get("/project.json", query, nil)
-
-	if err != nil {
-		return nil, err
-	}
-
-	resBody := models.ApiBambooProjectResponse{}
-	err = api.UnmarshalResponse(res, &resBody)
-	if err != nil {
-		return nil, err
-	}
-
-	// append project to output
-	for _, apiProject := range resBody.Projects.Projects {
-		project := &models.BambooProject{}
-		project.Convert(&apiProject)
-		child := RemoteScopesChild{
-			Type:     TypeProject,
-			ParentId: nil,
-			Id:       project.ProjectKey,
-			Name:     project.Name,
-			Data:     project,
-		}
-
-		outputBody.Children = append(outputBody.Children, child)
-	}
-
-	// check project count
-	if len(resBody.Projects.Projects) < pageData.PageSize {
-		pageData = nil
-	}
-
-	// get the next page token
-	outputBody.NextPageToken = ""
-	if pageData != nil {
-		pageData.Page += 1
-		pageData.PageSize = BambooRemoteScopesPerPage
-
-		outputBody.NextPageToken, err = GetPageTokenFromPageData(pageData)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	return &plugin.ApiResourceOutput{Body: outputBody, Status: http.StatusOK}, nil
+	return remoteHelper.GetScopesFromRemote(input)
 }
 
 // SearchRemoteScopes use the Search API and only return project
@@ -234,7 +155,7 @@ func SearchRemoteScopes(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutp
 			return nil, err
 		}
 
-		project.Convert(apiProject)
+		project = apiProject.ConvertApiScope().(models.BambooProject)
 		child := RemoteScopesChild{
 			Type:     TypeProject,
 			Id:       project.ProjectKey,
@@ -252,40 +173,6 @@ func SearchRemoteScopes(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutp
 	return &plugin.ApiResourceOutput{Body: outputBody, Status: http.StatusOK}, nil
 }
 
-func GetPageTokenFromPageData(pageData *PageData) (string, errors.Error) {
-	// Marshal json
-	pageTokenDecode, err := json.Marshal(pageData)
-	if err != nil {
-		return "", errors.Default.Wrap(err, fmt.Sprintf("Marshal pageToken failed %+v", pageData))
-	}
-
-	// Encode pageToken Base64
-	return base64.StdEncoding.EncodeToString(pageTokenDecode), nil
-}
-
-func GetPageDataFromPageToken(pageToken string) (*PageData, errors.Error) {
-	if pageToken == "" {
-		return &PageData{
-			Page:     1,
-			PageSize: BambooRemoteScopesPerPage,
-		}, nil
-	}
-
-	// Decode pageToken Base64
-	pageTokenDecode, err := base64.StdEncoding.DecodeString(pageToken)
-	if err != nil {
-		return nil, errors.Default.Wrap(err, fmt.Sprintf("decode pageToken failed %s", pageToken))
-	}
-	// Unmarshal json
-	pt := &PageData{}
-	err = json.Unmarshal(pageTokenDecode, pt)
-	if err != nil {
-		return nil, errors.Default.Wrap(err, fmt.Sprintf("json Unmarshal pageTokenDecode failed %s", pageTokenDecode))
-	}
-
-	return pt, nil
-}
-
 func GetQueryFromPageData(pageData *PageData) url.Values {
 	query := url.Values{}
 	query.Set("showEmpty", fmt.Sprintf("%v", true))
diff --git a/backend/plugins/bamboo/impl/impl.go b/backend/plugins/bamboo/impl/impl.go
index f5612f6cd..115d7432e 100644
--- a/backend/plugins/bamboo/impl/impl.go
+++ b/backend/plugins/bamboo/impl/impl.go
@@ -138,7 +138,7 @@ func (p Bamboo) PrepareTaskData(taskCtx plugin.TaskContext, options map[string]i
 				return nil, err
 			}
 			logger.Debug(fmt.Sprintf("Current project: %s", apiProject.Key))
-			scope.Convert(apiProject)
+			scope = apiProject.ConvertApiScope().(*models.BambooProject)
 			scope.ConnectionId = op.ConnectionId
 			err = taskCtx.GetDal().CreateIfNotExist(&scope)
 			if err != nil {
diff --git a/backend/plugins/bamboo/models/connection.go b/backend/plugins/bamboo/models/connection.go
index c5bdb48ad..0e1e4fc5b 100644
--- a/backend/plugins/bamboo/models/connection.go
+++ b/backend/plugins/bamboo/models/connection.go
@@ -18,8 +18,11 @@ limitations under the License.
 package models
 
 import (
+	"context"
 	"fmt"
+	context2 "github.com/apache/incubator-devlake/core/context"
 	"net/http"
+	"net/url"
 	"time"
 
 	"github.com/apache/incubator-devlake/core/errors"
@@ -89,3 +92,27 @@ type ApiRepository struct {
 func (BambooConnection) TableName() string {
 	return "_tool_bamboo_connections"
 }
+
+func (g BambooConnection) GetGroup(basicRes context2.BasicRes, gid string, query url.Values) ([]GroupResponse, errors.Error) {
+	return []GroupResponse{}, nil
+}
+
+func (g BambooConnection) GetScope(basicRes context2.BasicRes, gid string, query url.Values) ([]ApiBambooProject, errors.Error) {
+	// create api client
+	apiClient, err := api.NewApiClientFromConnection(context.TODO(), basicRes, &g)
+	if err != nil {
+		return nil, err
+	}
+	res, err := apiClient.Get("/project.json", query, nil)
+
+	if err != nil {
+		return nil, err
+	}
+
+	resBody := ApiBambooProjectResponse{}
+	err = api.UnmarshalResponse(res, &resBody)
+	if err != nil {
+		return nil, err
+	}
+	return resBody.Projects.Projects, err
+}
diff --git a/backend/plugins/bamboo/models/project.go b/backend/plugins/bamboo/models/project.go
index 279b996e3..beeb2be56 100644
--- a/backend/plugins/bamboo/models/project.go
+++ b/backend/plugins/bamboo/models/project.go
@@ -19,10 +19,15 @@ package models
 
 import (
 	"encoding/json"
+	"github.com/apache/incubator-devlake/core/plugin"
 
 	"github.com/apache/incubator-devlake/core/models/common"
 )
 
+var _ plugin.ToolLayerScope = (*BambooProject)(nil)
+var _ plugin.ApiGroup = (*GroupResponse)(nil)
+var _ plugin.ApiScope = (*ApiBambooProject)(nil)
+
 type BambooProject struct {
 	ConnectionId         uint64 `json:"connectionId" mapstructure:"connectionId" validate:"required" gorm:"primaryKey"`
 	ProjectKey           string `json:"projectKey" gorm:"primaryKey;type:varchar(256)" validate:"required"`
@@ -34,14 +39,15 @@ type BambooProject struct {
 	common.NoPKModel     `json:"-" mapstructure:"-"`
 }
 
-func (b *BambooProject) Convert(apiProject *ApiBambooProject) {
-	b.ProjectKey = apiProject.Key
-	b.Name = apiProject.Name
-	b.Description = apiProject.Description
-	b.Href = apiProject.Link.Href
+func (p BambooProject) ScopeId() string {
+	return p.ProjectKey
 }
 
-func (b *BambooProject) TableName() string {
+func (p BambooProject) ScopeName() string {
+	return p.Name
+}
+
+func (BambooProject) TableName() string {
 	return "_tool_bamboo_projects"
 }
 
@@ -89,3 +95,23 @@ type ApiBambooSearchProjectResponse struct {
 	ApiBambooSizeData `json:"squash"`
 	SearchResults     []ApiSearchResultProjects `json:"searchResults"`
 }
+
+func (apiProject ApiBambooProject) ConvertApiScope() plugin.ToolLayerScope {
+	b := &BambooProject{}
+	b.ProjectKey = apiProject.Key
+	b.Name = apiProject.Name
+	b.Description = apiProject.Description
+	b.Href = apiProject.Link.Href
+	return b
+}
+
+type GroupResponse struct {
+}
+
+func (p GroupResponse) GroupId() string {
+	return ""
+}
+
+func (p GroupResponse) GroupName() string {
+	return ""
+}