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 <[email protected]>
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 ""
+}

Reply via email to