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))