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 ""
+}