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 36ee73360 refactor(bitbucket): refactor remote scopes (#4683)
36ee73360 is described below

commit 36ee73360200d656354ca847accafdaf6b3b3533
Author: Warren Chen <[email protected]>
AuthorDate: Thu Mar 16 16:01:00 2023 +0800

    refactor(bitbucket): refactor remote scopes (#4683)
---
 backend/helpers/pluginhelper/api/api_client.go    |   2 +-
 backend/plugins/bitbucket/api/init.go             |   6 +
 backend/plugins/bitbucket/api/remote.go           | 196 +---------------------
 backend/plugins/bitbucket/api/scope.go            |   3 +
 backend/plugins/bitbucket/e2e/repo_test.go        |   5 +-
 backend/plugins/bitbucket/impl/impl.go            |   5 +-
 backend/plugins/bitbucket/models/connection.go    |  68 +++++++-
 backend/plugins/bitbucket/models/repo.go          |  97 +++++++++++
 backend/plugins/bitbucket/tasks/pr_extractor.go   |   4 +-
 backend/plugins/bitbucket/tasks/repo_convertor.go |  55 +-----
 backend/plugins/gitlab/api/remote.go              |  54 ------
 11 files changed, 184 insertions(+), 311 deletions(-)

diff --git a/backend/helpers/pluginhelper/api/api_client.go 
b/backend/helpers/pluginhelper/api/api_client.go
index cc5bc08b8..40ff63f4a 100644
--- a/backend/helpers/pluginhelper/api/api_client.go
+++ b/backend/helpers/pluginhelper/api/api_client.go
@@ -375,7 +375,7 @@ func UnmarshalResponse(res *http.Response, v interface{}) 
errors.Error {
        }
        err = errors.Convert(json.Unmarshal(resBody, &v))
        if err != nil {
-               return errors.Default.Wrap(err, fmt.Sprintf("error decoding 
response from %s: raw response: %s", res.Request.URL.String(), string(resBody)))
+               return errors.Default.New(fmt.Sprintf("error decoding response 
from %s: raw response: %s", res.Request.URL.String(), string(resBody)))
        }
        return nil
 }
diff --git a/backend/plugins/bitbucket/api/init.go 
b/backend/plugins/bitbucket/api/init.go
index a91525bd4..700593919 100644
--- a/backend/plugins/bitbucket/api/init.go
+++ b/backend/plugins/bitbucket/api/init.go
@@ -27,6 +27,7 @@ import (
 var vld *validator.Validate
 var connectionHelper *api.ConnectionApiHelper
 var scopeHelper *api.ScopeApiHelper[models.BitbucketConnection, 
models.BitbucketRepo, models.BitbucketTransformationRule]
+var remoteHelper *api.RemoteApiHelper[models.BitbucketConnection, 
models.BitbucketRepo, models.BitbucketApiRepo, models.GroupResponse]
 var basicRes context.BasicRes
 
 func Init(br context.BasicRes) {
@@ -41,4 +42,9 @@ func Init(br context.BasicRes) {
                vld,
                connectionHelper,
        )
+       remoteHelper = api.NewRemoteHelper[models.BitbucketConnection, 
models.BitbucketRepo, models.BitbucketApiRepo, models.GroupResponse](
+               basicRes,
+               vld,
+               connectionHelper,
+       )
 }
diff --git a/backend/plugins/bitbucket/api/remote.go 
b/backend/plugins/bitbucket/api/remote.go
index c94cb1c18..46c343b8a 100644
--- a/backend/plugins/bitbucket/api/remote.go
+++ b/backend/plugins/bitbucket/api/remote.go
@@ -19,14 +19,11 @@ package api
 
 import (
        "context"
-       "encoding/base64"
-       "encoding/json"
        "fmt"
        "github.com/apache/incubator-devlake/core/errors"
        "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        "github.com/apache/incubator-devlake/plugins/bitbucket/models"
-       "github.com/apache/incubator-devlake/plugins/bitbucket/tasks"
        "net/http"
        "net/url"
        "strconv"
@@ -57,43 +54,6 @@ type PageData struct {
        PerPage int `json:"per_page"`
 }
 
-type WorkspaceResponse struct {
-       Pagelen int             `json:"pagelen"`
-       Page    int             `json:"page"`
-       Size    int             `json:"size"`
-       Values  []GroupResponse `json:"values"`
-}
-
-type GroupResponse struct {
-       //Type       string `json:"type"`
-       //Permission string `json:"permission"`
-       //LastAccessed time.Time `json:"last_accessed"`
-       //AddedOn      time.Time `json:"added_on"`
-       Workspace WorkspaceItem `json:"workspace"`
-}
-
-func (p GroupResponse) ScopeId() string {
-       return p.Workspace.Slug
-}
-
-func (p GroupResponse) ScopeName() string {
-       return p.Workspace.Name
-}
-
-type WorkspaceItem struct {
-       //Type string `json:"type"`
-       //Uuid string `json:"uuid"`
-       Slug string `json:"slug" group:"id"`
-       Name string `json:"name" group:"name"`
-}
-
-type ReposResponse struct {
-       Pagelen int                      `json:"pagelen"`
-       Page    int                      `json:"page"`
-       Size    int                      `json:"size"`
-       Values  []tasks.BitbucketApiRepo `json:"values"`
-}
-
 const RemoteScopesPerPage int = 100
 const TypeScope string = "scope"
 const TypeGroup string = "group"
@@ -111,123 +71,7 @@ const TypeGroup string = "group"
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bitbucket/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.BitbucketConnection{}
-       err := connectionHelper.First(connection, input.Params)
-       if err != nil {
-               return nil, err
-       }
-
-       groupId, ok := input.Query["groupId"]
-       if !ok || len(groupId) == 0 {
-               groupId = []string{""}
-       }
-
-       pageToken, ok := input.Query["pageToken"]
-       if !ok || len(pageToken) == 0 {
-               pageToken = []string{""}
-       }
-
-       // get gid and pageData
-       gid := groupId[0]
-       pageData, err := GetPageDataFromPageToken(pageToken[0])
-       if err != nil {
-               return nil, errors.BadInput.New("failed to get page token")
-       }
-
-       // create api client
-       apiClient, err := api.NewApiClientFromConnection(context.TODO(), 
basicRes, connection)
-       if err != nil {
-               return nil, err
-       }
-
-       query, err := GetQueryFromPageData(pageData)
-       if err != nil {
-               return nil, err
-       }
-
-       var res *http.Response
-       outputBody := &RemoteScopesOutput{}
-
-       // list groups part
-       if gid == "" {
-               query.Set("sort", "workspace.slug")
-               query.Set("fields", 
"values.workspace.slug,values.workspace.name,pagelen,page,size")
-               res, err = apiClient.Get("/user/permissions/workspaces", query, 
nil)
-               if err != nil {
-                       return nil, err
-               }
-
-               resBody := &WorkspaceResponse{}
-               err = api.UnmarshalResponse(res, resBody)
-               if err != nil {
-                       return nil, err
-               }
-
-               // append group to output
-               for _, group := range resBody.Values {
-                       child := RemoteScopesChild{
-                               Type: TypeGroup,
-                               Id:   group.Workspace.Slug,
-                               Name: group.Workspace.Name,
-                               // don't need to save group into data
-                               Data: nil,
-                       }
-                       outputBody.Children = append(outputBody.Children, child)
-               }
-
-               // check groups count
-               if resBody.Size < pageData.PerPage {
-                       pageData = nil
-               }
-       } else {
-               query.Set("sort", "name")
-               query.Set("fields", 
"values.name,values.full_name,values.language,values.description,values.owner.username,values.created_on,values.updated_on,values.links.clone,values.links.self,pagelen,page,size")
-               // list projects part
-               res, err = apiClient.Get(fmt.Sprintf("/repositories/%s", gid), 
query, nil)
-               if err != nil {
-                       return nil, err
-               }
-
-               resBody := &ReposResponse{}
-               err = api.UnmarshalResponse(res, resBody)
-               if err != nil {
-                       return nil, err
-               }
-
-               // append repo to output
-               for _, repo := range resBody.Values {
-                       child := RemoteScopesChild{
-                               Type: TypeScope,
-                               Id:   repo.FullName,
-                               Name: repo.Name,
-                               Data: tasks.ConvertApiRepoToScope(&repo, 
connection.ID),
-                       }
-                       child.ParentId = &gid
-                       outputBody.Children = append(outputBody.Children, child)
-               }
-
-               // check repo count
-               if resBody.Size < pageData.PerPage {
-                       pageData = nil
-               }
-       }
-
-       // get the next page token
-       outputBody.NextPageToken = ""
-       if pageData != nil {
-               pageData.Page += 1
-               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
@@ -306,7 +150,7 @@ func SearchRemoteScopes(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutp
        if err != nil {
                return nil, err
        }
-       resBody := &ReposResponse{}
+       resBody := &models.ReposResponse{}
        err = api.UnmarshalResponse(res, &resBody)
        if err != nil {
                return nil, err
@@ -320,7 +164,7 @@ func SearchRemoteScopes(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutp
                        Id:       repo.FullName,
                        ParentId: nil,
                        Name:     repo.Name,
-                       Data:     tasks.ConvertApiRepoToScope(&repo, 
connection.ID),
+                       Data:     repo.ConvertApiScope(),
                }
                outputBody.Children = append(outputBody.Children, child)
        }
@@ -331,40 +175,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,
-                       PerPage: RemoteScopesPerPage,
-               }, 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, errors.Error) {
        query := url.Values{}
        query.Set("page", fmt.Sprintf("%v", pageData.Page))
diff --git a/backend/plugins/bitbucket/api/scope.go 
b/backend/plugins/bitbucket/api/scope.go
index 496def2e9..80f4a49c1 100644
--- a/backend/plugins/bitbucket/api/scope.go
+++ b/backend/plugins/bitbucket/api/scope.go
@@ -22,6 +22,7 @@ import (
        "github.com/apache/incubator-devlake/core/plugin"
        "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
        "github.com/apache/incubator-devlake/plugins/bitbucket/models"
+       "strings"
 )
 
 type ScopeRes struct {
@@ -59,6 +60,7 @@ func PutScope(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput, errors
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bitbucket/connections/{connectionId}/scopes/{scopeId} 
[PATCH]
 func UpdateScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, 
errors.Error) {
+       input.Params["scopeId"] = strings.TrimLeft(input.Params["scopeId"], "/")
        return scopeHelper.Update(input, "bitbucket_id")
 }
 
@@ -88,5 +90,6 @@ func GetScopeList(input *plugin.ApiResourceInput) 
(*plugin.ApiResourceOutput, er
 // @Failure 500  {object} shared.ApiBody "Internal Error"
 // @Router /plugins/bitbucket/connections/{connectionId}/scopes/{scopeId} [GET]
 func GetScope(input *plugin.ApiResourceInput) (*plugin.ApiResourceOutput, 
errors.Error) {
+       input.Params["scopeId"] = strings.TrimLeft(input.Params["scopeId"], "/")
        return scopeHelper.GetScope(input, "bitbucket_id")
 }
diff --git a/backend/plugins/bitbucket/e2e/repo_test.go 
b/backend/plugins/bitbucket/e2e/repo_test.go
index f8fd6f939..dbd30692f 100644
--- a/backend/plugins/bitbucket/e2e/repo_test.go
+++ b/backend/plugins/bitbucket/e2e/repo_test.go
@@ -45,7 +45,7 @@ func TestRepoDataFlow(t *testing.T) {
        // import raw data table
        csvIter, _ := 
pluginhelper.NewCsvFileIterator("./raw_tables/_raw_bitbucket_api_repositories.csv")
        defer csvIter.Close()
-       apiRepo := &tasks.BitbucketApiRepo{}
+       apiRepo := &models.BitbucketApiRepo{}
        // load rows and insert into target table
        for csvIter.HasNext() {
                toInsertValues := csvIter.Fetch()
@@ -57,7 +57,8 @@ func TestRepoDataFlow(t *testing.T) {
 
        // verify extraction
        dataflowTester.FlushTabler(&models.BitbucketRepo{})
-       scope := tasks.ConvertApiRepoToScope(apiRepo, 1)
+       scope := apiRepo.ConvertApiScope().(*models.BitbucketRepo)
+       scope.ConnectionId = 1
        err := dataflowTester.Dal.CreateIfNotExist(scope)
        assert.Nil(t, err)
        dataflowTester.VerifyTable(
diff --git a/backend/plugins/bitbucket/impl/impl.go 
b/backend/plugins/bitbucket/impl/impl.go
index 50b2d19ca..45019017a 100644
--- a/backend/plugins/bitbucket/impl/impl.go
+++ b/backend/plugins/bitbucket/impl/impl.go
@@ -247,13 +247,14 @@ func EnrichOptions(taskCtx plugin.TaskContext,
                }
        } else {
                if taskCtx.GetDal().IsErrorNotFound(err) && op.FullName != "" {
-                       var repo *tasks.BitbucketApiRepo
+                       var repo *models.BitbucketApiRepo
                        repo, err = tasks.GetApiRepo(op, apiClient)
                        if err != nil {
                                return err
                        }
                        logger.Debug(fmt.Sprintf("Current repo: %s", 
repo.FullName))
-                       scope := tasks.ConvertApiRepoToScope(repo, 
op.ConnectionId)
+                       scope := repo.ConvertApiScope().(models.BitbucketRepo)
+                       scope.ConnectionId = op.ConnectionId
                        err = taskCtx.GetDal().CreateIfNotExist(scope)
                        if err != nil {
                                return err
diff --git a/backend/plugins/bitbucket/models/connection.go 
b/backend/plugins/bitbucket/models/connection.go
index fb440aea2..6300a8deb 100644
--- a/backend/plugins/bitbucket/models/connection.go
+++ b/backend/plugins/bitbucket/models/connection.go
@@ -18,21 +18,79 @@ limitations under the License.
 package models
 
 import (
-       helper "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+       "context"
+       "fmt"
+       context2 "github.com/apache/incubator-devlake/core/context"
+       "github.com/apache/incubator-devlake/core/errors"
+       "github.com/apache/incubator-devlake/core/plugin"
+       "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+       "net/http"
+       "net/url"
 )
 
+var _ plugin.ApiConnectionForRemote[GroupResponse, BitbucketApiRepo] = 
(*BitbucketConnection)(nil)
+var _ plugin.ApiGroup = (*GroupResponse)(nil)
+
 // BitbucketConn holds the essential information to connect to the Bitbucket 
API
 type BitbucketConn struct {
-       helper.RestConnection `mapstructure:",squash"`
-       helper.BasicAuth      `mapstructure:",squash"`
+       api.RestConnection `mapstructure:",squash"`
+       api.BasicAuth      `mapstructure:",squash"`
 }
 
 // BitbucketConnection holds BitbucketConn plus ID/Name for database storage
 type BitbucketConnection struct {
-       helper.BaseConnection `mapstructure:",squash"`
-       BitbucketConn         `mapstructure:",squash"`
+       api.BaseConnection `mapstructure:",squash"`
+       BitbucketConn      `mapstructure:",squash"`
 }
 
 func (BitbucketConnection) TableName() string {
        return "_tool_bitbucket_connections"
 }
+
+func (g BitbucketConnection) GetGroup(basicRes context2.BasicRes, gid string, 
query url.Values) ([]GroupResponse, errors.Error) {
+       if gid != "" {
+               return nil, nil
+       }
+       apiClient, err := api.NewApiClientFromConnection(context.TODO(), 
basicRes, &g)
+       if err != nil {
+               return nil, errors.BadInput.Wrap(err, "failed to get create 
apiClient")
+       }
+       var res *http.Response
+       query.Set("sort", "workspace.slug")
+       query.Set("fields", 
"values.workspace.slug,values.workspace.name,pagelen,page,size")
+       res, err = apiClient.Get("/user/permissions/workspaces", query, nil)
+       if err != nil {
+               return nil, err
+       }
+
+       resBody := &WorkspaceResponse{}
+       err = api.UnmarshalResponse(res, resBody)
+       if err != nil {
+               return nil, err
+       }
+
+       return resBody.Values, err
+}
+
+func (g BitbucketConnection) GetScope(basicRes context2.BasicRes, gid string, 
query url.Values) ([]BitbucketApiRepo, errors.Error) {
+       if gid == "" {
+               return nil, nil
+       }
+       apiClient, err := api.NewApiClientFromConnection(context.TODO(), 
basicRes, &g)
+       if err != nil {
+               return nil, errors.BadInput.Wrap(err, "failed to get create 
apiClient")
+       }
+       var res *http.Response
+       query.Set("fields", 
"values.name,values.full_name,values.language,values.description,values.owner.username,values.created_on,values.updated_on,values.links.clone,values.links.self,pagelen,page,size")
+       // list projects part
+       res, err = apiClient.Get(fmt.Sprintf("/repositories/%s", gid), query, 
nil)
+       if err != nil {
+               return nil, err
+       }
+       var resBody ReposResponse
+       err = api.UnmarshalResponse(res, &resBody)
+       if err != nil {
+               return nil, err
+       }
+       return resBody.Values, err
+}
diff --git a/backend/plugins/bitbucket/models/repo.go 
b/backend/plugins/bitbucket/models/repo.go
index 417ebe064..e173a2ced 100644
--- a/backend/plugins/bitbucket/models/repo.go
+++ b/backend/plugins/bitbucket/models/repo.go
@@ -19,9 +19,14 @@ package models
 
 import (
        "github.com/apache/incubator-devlake/core/models/common"
+       "github.com/apache/incubator-devlake/core/plugin"
        "time"
 )
 
+var _ plugin.ToolLayerScope = (*BitbucketRepo)(nil)
+var _ plugin.ApiGroup = (*GroupResponse)(nil)
+var _ plugin.ApiScope = (*BitbucketApiRepo)(nil)
+
 type BitbucketRepo struct {
        ConnectionId         uint64     `json:"connectionId" gorm:"primaryKey" 
validate:"required" mapstructure:"connectionId,omitempty"`
        BitbucketId          string     `json:"bitbucketId" 
gorm:"primaryKey;type:varchar(255)" validate:"required" 
mapstructure:"bitbucketId"`
@@ -40,3 +45,95 @@ type BitbucketRepo struct {
 func (BitbucketRepo) TableName() string {
        return "_tool_bitbucket_repos"
 }
+
+func (p BitbucketRepo) ScopeId() string {
+       return p.BitbucketId
+}
+
+func (p BitbucketRepo) ScopeName() string {
+       return p.Name
+}
+
+type BitbucketApiRepo struct {
+       //Scm         string `json:"scm"`
+       //HasWiki     bool   `json:"has_wiki"`
+       //Uuid        string `json:"uuid"`
+       //Type        string `json:"type"`
+       //HasIssue    bool   `json:"has_issue"`
+       //ForkPolicy  string `json:"fork_policy"`
+       Name        string `json:"name"`
+       FullName    string `json:"full_name"`
+       Language    string `json:"language"`
+       Description string `json:"description"`
+       Owner       struct {
+               Username string `json:"username"`
+       } `json:"owner"`
+       CreatedAt *time.Time `json:"created_on"`
+       UpdatedAt *time.Time `json:"updated_on"`
+       Links     struct {
+               Clone []struct {
+                       Href string `json:"href"`
+                       Name string `json:"name"`
+               } `json:"clone"`
+               Html struct {
+                       Href string `json:"href"`
+               } `json:"html"`
+       } `json:"links"`
+}
+
+func (b BitbucketApiRepo) ConvertApiScope() plugin.ToolLayerScope {
+       scope := &BitbucketRepo{}
+       scope.BitbucketId = b.FullName
+       scope.CreatedDate = b.CreatedAt
+       scope.UpdatedDate = b.UpdatedAt
+       scope.Language = b.Language
+       scope.Description = b.Description
+       scope.Name = b.Name
+       scope.Owner = b.Owner.Username
+       scope.HTMLUrl = b.Links.Html.Href
+
+       scope.CloneUrl = ""
+       for _, u := range b.Links.Clone {
+               if u.Name == "https" {
+                       scope.CloneUrl = u.Href
+               }
+       }
+       return scope
+}
+
+type WorkspaceResponse struct {
+       Pagelen int             `json:"pagelen"`
+       Page    int             `json:"page"`
+       Size    int             `json:"size"`
+       Values  []GroupResponse `json:"values"`
+}
+
+type GroupResponse struct {
+       //Type       string `json:"type"`
+       //Permission string `json:"permission"`
+       //LastAccessed time.Time `json:"last_accessed"`
+       //AddedOn      time.Time `json:"added_on"`
+       Workspace WorkspaceItem `json:"workspace"`
+}
+
+type WorkspaceItem struct {
+       //Type string `json:"type"`
+       //Uuid string `json:"uuid"`
+       Slug string `json:"slug" group:"id"`
+       Name string `json:"name" group:"name"`
+}
+
+func (p GroupResponse) GroupId() string {
+       return p.Workspace.Slug
+}
+
+func (p GroupResponse) GroupName() string {
+       return p.Workspace.Name
+}
+
+type ReposResponse struct {
+       Pagelen int                `json:"pagelen"`
+       Page    int                `json:"page"`
+       Size    int                `json:"size"`
+       Values  []BitbucketApiRepo `json:"values"`
+}
diff --git a/backend/plugins/bitbucket/tasks/pr_extractor.go 
b/backend/plugins/bitbucket/tasks/pr_extractor.go
index 22020672a..913da92b6 100644
--- a/backend/plugins/bitbucket/tasks/pr_extractor.go
+++ b/backend/plugins/bitbucket/tasks/pr_extractor.go
@@ -64,7 +64,7 @@ type BitbucketApiPullRequest struct {
                Commit struct {
                        Hash string `json:"hash"`
                } `json:"commit"`
-               Repo *BitbucketApiRepo `json:"repository"`
+               Repo *models.BitbucketApiRepo `json:"repository"`
        } `json:"destination"`
        HeadRef *struct {
                Branch struct {
@@ -73,7 +73,7 @@ type BitbucketApiPullRequest struct {
                Commit struct {
                        Hash string `json:"hash"`
                } `json:"commit"`
-               Repo *BitbucketApiRepo `json:"repository"`
+               Repo *models.BitbucketApiRepo `json:"repository"`
        } `json:"source"`
        //Reviewers    []BitbucketAccountResponse `json:"reviewers"`
        //Participants []BitbucketAccountResponse `json:"participants"`
diff --git a/backend/plugins/bitbucket/tasks/repo_convertor.go 
b/backend/plugins/bitbucket/tasks/repo_convertor.go
index baf855317..90e6fc9c4 100644
--- a/backend/plugins/bitbucket/tasks/repo_convertor.go
+++ b/backend/plugins/bitbucket/tasks/repo_convertor.go
@@ -34,7 +34,6 @@ import (
        "net/http"
        "path"
        "reflect"
-       "time"
 )
 
 const RAW_REPOSITORIES_TABLE = "bitbucket_api_repositories"
@@ -47,60 +46,12 @@ var ConvertRepoMeta = plugin.SubTaskMeta{
        DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE},
 }
 
-type ApiRepoResponse BitbucketApiRepo
-
-type BitbucketApiRepo struct {
-       //Scm         string `json:"scm"`
-       //HasWiki     bool   `json:"has_wiki"`
-       //Uuid        string `json:"uuid"`
-       //Type        string `json:"type"`
-       //HasIssue    bool   `json:"has_issue"`
-       //ForkPolicy  string `json:"fork_policy"`
-       Name        string `json:"name"`
-       FullName    string `json:"full_name"`
-       Language    string `json:"language"`
-       Description string `json:"description"`
-       Owner       struct {
-               Username string `json:"username"`
-       } `json:"owner"`
-       CreatedAt *time.Time `json:"created_on"`
-       UpdatedAt *time.Time `json:"updated_on"`
-       Links     struct {
-               Clone []struct {
-                       Href string `json:"href"`
-                       Name string `json:"name"`
-               } `json:"clone"`
-               Html struct {
-                       Href string `json:"href"`
-               } `json:"html"`
-       } `json:"links"`
-}
-
-func ConvertApiRepoToScope(repo *BitbucketApiRepo, connectionId uint64) 
*models.BitbucketRepo {
-       var scope models.BitbucketRepo
-       scope.ConnectionId = connectionId
-       scope.BitbucketId = repo.FullName
-       scope.CreatedDate = repo.CreatedAt
-       scope.UpdatedDate = repo.UpdatedAt
-       scope.Language = repo.Language
-       scope.Description = repo.Description
-       scope.Name = repo.Name
-       scope.Owner = repo.Owner.Username
-       scope.HTMLUrl = repo.Links.Html.Href
-
-       scope.CloneUrl = ""
-       for _, u := range repo.Links.Clone {
-               if u.Name == "https" {
-                       scope.CloneUrl = u.Href
-               }
-       }
-       return &scope
-}
+type ApiRepoResponse models.BitbucketApiRepo
 
 func GetApiRepo(
        op *BitbucketOptions,
        apiClient aha.ApiClientAbstract,
-) (*BitbucketApiRepo, errors.Error) {
+) (*models.BitbucketApiRepo, errors.Error) {
        res, err := apiClient.Get(path.Join("repositories", op.FullName), nil, 
nil)
        if err != nil {
                return nil, err
@@ -116,7 +67,7 @@ func GetApiRepo(
        if err != nil {
                return nil, err
        }
-       apiRepo := new(BitbucketApiRepo)
+       apiRepo := new(models.BitbucketApiRepo)
        err = errors.Convert(json.Unmarshal(body, apiRepo))
        if err != nil {
                return nil, err
diff --git a/backend/plugins/gitlab/api/remote.go 
b/backend/plugins/gitlab/api/remote.go
index 609e072f7..69875646b 100644
--- a/backend/plugins/gitlab/api/remote.go
+++ b/backend/plugins/gitlab/api/remote.go
@@ -19,8 +19,6 @@ package api
 
 import (
        "context"
-       "encoding/base64"
-       "encoding/json"
        "fmt"
        "net/http"
        "net/url"
@@ -58,23 +56,6 @@ type PageData struct {
        Tag     string `json:"tag"`
 }
 
-type GroupResponse struct {
-       Id                   int    `json:"id"`
-       WebUrl               string `json:"web_url"`
-       Name                 string `json:"name"`
-       Path                 string `json:"path"`
-       Description          string `json:"description"`
-       Visibility           string `json:"visibility"`
-       LfsEnabled           bool   `json:"lfs_enabled"`
-       AvatarUrl            string `json:"avatar_url"`
-       RequestAccessEnabled bool   `json:"request_access_enabled"`
-       FullName             string `json:"full_name"`
-       FullPath             string `json:"full_path"`
-       ParentId             *int   `json:"parent_id"`
-       LdapCN               string `json:"ldap_cn"`
-       LdapAccess           string `json:"ldap_access"`
-}
-
 const GitlabRemoteScopesPerPage int = 100
 const TypeProject string = "scope"
 const TypeGroup string = "group"
@@ -190,41 +171,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,
-                       PerPage: GitlabRemoteScopesPerPage,
-                       Tag:     "group",
-               }, 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, errors.Error) {
        query := url.Values{}
        query.Set("page", fmt.Sprintf("%v", pageData.Page))

Reply via email to