You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by wa...@apache.org on 2022/06/18 09:24:25 UTC

[incubator-devlake] 07/10: multi-data connections support for gitee

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

warren pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git

commit 8b4c27db61d90c2d5e5791b5078c80a0f2f476c8
Author: Mr.An <42...@users.noreply.github.com>
AuthorDate: Sat Jun 18 16:58:39 2022 +0800

    multi-data connections support for gitee
---
 plugins/gitee/README.md                            |  8 +--
 plugins/gitee/gitee.go                             | 44 ++++++++----
 plugins/gitee/impl/impl.go                         | 79 ++++++++++++++++++++--
 plugins/gitee/models/connection.go                 |  4 ++
 .../{ => migrationscripts/archived}/connection.go  | 40 ++++++++---
 .../gitee/models/migrationscripts/init_schema.go   | 76 ++++++++++++++++++++-
 plugins/gitee/tasks/api_client.go                  | 30 ++++----
 plugins/gitee/tasks/commit_collector.go            |  1 -
 plugins/gitee/tasks/commit_stats_collector.go      |  1 -
 plugins/gitee/tasks/issue_collector.go             |  1 -
 plugins/gitee/tasks/issue_comment_collector.go     |  1 -
 plugins/gitee/tasks/issue_comment_extractor.go     | 16 ++++-
 plugins/gitee/tasks/pr_collector.go                |  1 -
 plugins/gitee/tasks/pr_commit_collector.go         |  1 -
 plugins/gitee/tasks/pr_review_collector.go         |  1 -
 plugins/gitee/tasks/repo_collector.go              |  1 -
 plugins/gitee/tasks/shared.go                      | 12 ----
 plugins/gitee/tasks/task_data.go                   | 13 ++--
 18 files changed, 247 insertions(+), 83 deletions(-)

diff --git a/plugins/gitee/README.md b/plugins/gitee/README.md
index ce1bc6b6..cfb2b925 100644
--- a/plugins/gitee/README.md
+++ b/plugins/gitee/README.md
@@ -57,8 +57,7 @@ In order to collect data, you have to compose a JSON looks like following one, a
       "plugin": "gitee",
       "options": {
         "repo": "lake",
-        "owner": "merico-dev",
-        "token": "xxxx"
+        "owner": "merico-dev"
       }
     }
   ]
@@ -73,8 +72,7 @@ and if you want to perform certain subtasks.
       "subtasks": ["collectXXX", "extractXXX", "convertXXX"],
       "options": {
         "repo": "lake",
-        "owner": "merico-dev",
-        "token": "xxxx"
+        "owner": "merico-dev"
       }
     }
   ]
@@ -94,7 +92,6 @@ curl --location --request POST 'localhost:8080/pipelines' \
         "options": {
             "repo": "lake",
             "owner": "merico-dev"
-            "token": "xxxx"
         }
     }]]
 }
@@ -113,7 +110,6 @@ curl --location --request POST 'localhost:8080/pipelines' \
         "options": {
             "repo": "lake",
             "owner": "merico-dev"
-            "token": "xxxx"
         }
     }]]
 }
diff --git a/plugins/gitee/gitee.go b/plugins/gitee/gitee.go
index c6f19cf9..7c239996 100644
--- a/plugins/gitee/gitee.go
+++ b/plugins/gitee/gitee.go
@@ -26,19 +26,39 @@ import (
 var PluginEntry impl.Gitee //nolint
 
 func main() {
-	giteeCmd := &cobra.Command{Use: "gitee"}
-	owner := giteeCmd.Flags().StringP("owner", "o", "", "gitee owner")
-	repo := giteeCmd.Flags().StringP("repo", "r", "", "gitee repo")
-	token := giteeCmd.Flags().StringP("auth", "a", "", "access token")
-	_ = giteeCmd.MarkFlagRequired("owner")
-	_ = giteeCmd.MarkFlagRequired("repo")
-
-	giteeCmd.Run = func(cmd *cobra.Command, args []string) {
+	cmd := &cobra.Command{Use: "github"}
+	connectionId := cmd.Flags().Uint64P("connectionId", "c", 0, "gitee connection id")
+	owner := cmd.Flags().StringP("owner", "o", "", "gitee owner")
+	repo := cmd.Flags().StringP("repo", "r", "", "gitee repo")
+	_ = cmd.MarkFlagRequired("connectionId")
+	_ = cmd.MarkFlagRequired("owner")
+	_ = cmd.MarkFlagRequired("repo")
+
+	prType := cmd.Flags().String("prType", "type/(.*)$", "pr type")
+	prComponent := cmd.Flags().String("prComponent", "component/(.*)$", "pr component")
+	prBodyClosePattern := cmd.Flags().String("prBodyClosePattern", "(?mi)(fix|close|resolve|fixes|closes|resolves|fixed|closed|resolved)[\\s]*.*(((and )?(#|https:\\/\\/github.com\\/%s\\/%s\\/issues\\/)\\d+[ ]*)+)", "pr body close pattern")
+	issueSeverity := cmd.Flags().String("issueSeverity", "severity/(.*)$", "issue severity")
+	issuePriority := cmd.Flags().String("issuePriority", "^(highest|high|medium|low)$", "issue priority")
+	issueComponent := cmd.Flags().String("issueComponent", "component/(.*)$", "issue component")
+	issueTypeBug := cmd.Flags().String("issueTypeBug", "^(bug|failure|error)$", "issue type bug")
+	issueTypeIncident := cmd.Flags().String("issueTypeIncident", "", "issue type incident")
+	issueTypeRequirement := cmd.Flags().String("issueTypeRequirement", "^(feat|feature|proposal|requirement)$", "issue type requirement")
+
+	cmd.Run = func(cmd *cobra.Command, args []string) {
 		runner.DirectRun(cmd, args, PluginEntry, map[string]interface{}{
-			"owner": *owner,
-			"repo":  *repo,
-			"token": *token,
+			"connectionId":         *connectionId,
+			"owner":                *owner,
+			"repo":                 *repo,
+			"prType":               *prType,
+			"prComponent":          *prComponent,
+			"prBodyClosePattern":   *prBodyClosePattern,
+			"issueSeverity":        *issueSeverity,
+			"issuePriority":        *issuePriority,
+			"issueComponent":       *issueComponent,
+			"issueTypeBug":         *issueTypeBug,
+			"issueTypeIncident":    *issueTypeIncident,
+			"issueTypeRequirement": *issueTypeRequirement,
 		})
 	}
-	runner.RunCmd(giteeCmd)
+	runner.RunCmd(cmd)
 }
diff --git a/plugins/gitee/impl/impl.go b/plugins/gitee/impl/impl.go
index 9cde8eb3..c7589f66 100644
--- a/plugins/gitee/impl/impl.go
+++ b/plugins/gitee/impl/impl.go
@@ -18,11 +18,15 @@ limitations under the License.
 package impl
 
 import (
+	"fmt"
+
 	"github.com/apache/incubator-devlake/migration"
 	"github.com/apache/incubator-devlake/plugins/core"
 	"github.com/apache/incubator-devlake/plugins/gitee/api"
+	"github.com/apache/incubator-devlake/plugins/gitee/models"
 	"github.com/apache/incubator-devlake/plugins/gitee/models/migrationscripts"
 	"github.com/apache/incubator-devlake/plugins/gitee/tasks"
+	"github.com/apache/incubator-devlake/plugins/helper"
 	"github.com/mitchellh/mapstructure"
 	"github.com/spf13/viper"
 	"gorm.io/gorm"
@@ -37,6 +41,7 @@ var _ core.Migratable = (*Gitee)(nil)
 type Gitee string
 
 func (plugin Gitee) Init(config *viper.Viper, logger core.Logger, db *gorm.DB) error {
+	api.Init(config, logger, db)
 	return nil
 }
 
@@ -86,7 +91,67 @@ func (plugin Gitee) PrepareTaskData(taskCtx core.TaskContext, options map[string
 		return nil, err
 	}
 
-	apiClient, err := tasks.NewGiteeApiClient(taskCtx)
+	if op.Owner == "" {
+		return nil, fmt.Errorf("owner is required for Gitee execution")
+	}
+
+	if op.Repo == "" {
+		return nil, fmt.Errorf("repo is required for Gitee execution")
+	}
+
+	if op.PrType == "" {
+		op.PrType = "type/(.*)$"
+	}
+
+	if op.PrComponent == "" {
+		op.PrComponent = "component/(.*)$"
+	}
+
+	if op.IssueSeverity == "" {
+		op.IssueSeverity = "severity/(.*)$"
+	}
+
+	if op.IssuePriority == "" {
+		op.IssuePriority = "^(highest|high|medium|low)$"
+	}
+
+	if op.IssueComponent == "" {
+		op.IssueComponent = "component/(.*)$"
+	}
+
+	if op.IssueTypeBug == "" {
+		op.IssueTypeBug = "^(bug|failure|error)$"
+	}
+
+	if op.IssueTypeIncident == "" {
+		op.IssueTypeIncident = ""
+	}
+
+	if op.IssueTypeRequirement == "" {
+		op.IssueTypeRequirement = "^(feat|feature|proposal|requirement)$"
+	}
+
+	if op.ConnectionId == 0 {
+		return nil, fmt.Errorf("connectionId is invalid")
+	}
+
+	connection := &models.GiteeConnection{}
+	connectionHelper := helper.NewConnectionHelper(
+		taskCtx,
+		nil,
+	)
+
+	if err != nil {
+		return nil, err
+	}
+
+	err = connectionHelper.FirstById(connection, op.ConnectionId)
+
+	if err != nil {
+		return nil, err
+	}
+	apiClient, err := tasks.NewGiteeApiClient(taskCtx, connection)
+
 	if err != nil {
 		return nil, err
 	}
@@ -102,7 +167,9 @@ func (plugin Gitee) RootPkgPath() string {
 }
 
 func (plugin Gitee) MigrationScripts() []migration.Script {
-	return []migration.Script{new(migrationscripts.InitSchemas), new(migrationscripts.InitSchemas)}
+	return []migration.Script{
+		new(migrationscripts.InitSchemas),
+	}
 }
 
 func (plugin Gitee) ApiResources() map[string]map[string]core.ApiResourceHandler {
@@ -111,11 +178,13 @@ func (plugin Gitee) ApiResources() map[string]map[string]core.ApiResourceHandler
 			"POST": api.TestConnection,
 		},
 		"connections": {
-			"GET": api.ListConnections,
+			"POST": api.PostConnections,
+			"GET":  api.ListConnections,
 		},
 		"connections/:connectionId": {
-			"GET":   api.GetConnection,
-			"PATCH": api.PatchConnection,
+			"GET":    api.GetConnection,
+			"PATCH":  api.PatchConnection,
+			"DELETE": api.DeleteConnection,
 		},
 	}
 }
diff --git a/plugins/gitee/models/connection.go b/plugins/gitee/models/connection.go
index f161df73..a5360449 100644
--- a/plugins/gitee/models/connection.go
+++ b/plugins/gitee/models/connection.go
@@ -51,3 +51,7 @@ type Config struct {
 	IssueTypeIncident    string `mapstructure:"issueTypeIncident" env:"GITEE_ISSUE_TYPE_INCIDENT" json:"issueTypeIncident"`
 	IssueTypeRequirement string `mapstructure:"issueTypeRequirement" env:"GITEE_ISSUE_TYPE_REQUIREMENT" json:"issueTypeRequirement"`
 }
+
+func (GiteeConnection) TableName() string {
+	return "_tool_gitee_connections"
+}
diff --git a/plugins/gitee/models/connection.go b/plugins/gitee/models/migrationscripts/archived/connection.go
similarity index 66%
copy from plugins/gitee/models/connection.go
copy to plugins/gitee/models/migrationscripts/archived/connection.go
index f161df73..c1fc5daf 100644
--- a/plugins/gitee/models/connection.go
+++ b/plugins/gitee/models/migrationscripts/archived/connection.go
@@ -15,32 +15,46 @@ See the License for the specific language governing permissions and
 limitations under the License.
 */
 
-package models
+package archived
 
-import "github.com/apache/incubator-devlake/plugins/helper"
+import (
+	"github.com/apache/incubator-devlake/models/migrationscripts/archived"
+)
 
 type GiteeConnection struct {
-	helper.RestConnection `mapstructure:",squash"`
-	helper.AccessToken    `mapstructure:",squash"`
+	RestConnection `mapstructure:",squash"`
+	AccessToken    `mapstructure:",squash"`
 }
 
-type GiteeResponse struct {
+type RestConnection struct {
+	BaseConnection `mapstructure:",squash"`
+	Endpoint       string `mapstructure:"endpoint" validate:"required" json:"endpoint"`
+	Proxy          string `mapstructure:"proxy" json:"proxy"`
+	RateLimit      int    `comment:"api request rate limt per hour" json:"rateLimit"`
+}
+
+type BaseConnection struct {
+	Name string `gorm:"type:varchar(100);uniqueIndex" json:"name" validate:"required"`
+	archived.Model
+}
+
+type AccessToken struct {
+	Token string `mapstructure:"token" validate:"required" json:"token" encrypt:"yes"`
+}
+
+// This object conforms to what the frontend currently expects.
+type GitlabResponse struct {
 	Name string `json:"name"`
 	ID   int    `json:"id"`
 	GiteeConnection
 }
 
+// Using User because it requires authentication.
 type ApiUserResponse struct {
 	Id   int
 	Name string `json:"name"`
 }
 
-type TestConnectionRequest struct {
-	Endpoint           string `json:"endpoint" validate:"required"`
-	Proxy              string `json:"proxy"`
-	helper.AccessToken `mapstructure:",squash"`
-}
-
 type Config struct {
 	PrType               string `mapstructure:"prType" env:"GITEE_PR_TYPE" json:"prType"`
 	PrComponent          string `mapstructure:"prComponent" env:"GITEE_PR_COMPONENT" json:"prComponent"`
@@ -51,3 +65,7 @@ type Config struct {
 	IssueTypeIncident    string `mapstructure:"issueTypeIncident" env:"GITEE_ISSUE_TYPE_INCIDENT" json:"issueTypeIncident"`
 	IssueTypeRequirement string `mapstructure:"issueTypeRequirement" env:"GITEE_ISSUE_TYPE_REQUIREMENT" json:"issueTypeRequirement"`
 }
+
+func (GiteeConnection) TableName() string {
+	return "_tool_gitee_connections"
+}
diff --git a/plugins/gitee/models/migrationscripts/init_schema.go b/plugins/gitee/models/migrationscripts/init_schema.go
index 44e3e33a..305d4702 100644
--- a/plugins/gitee/models/migrationscripts/init_schema.go
+++ b/plugins/gitee/models/migrationscripts/init_schema.go
@@ -19,6 +19,12 @@ package migrationscripts
 
 import (
 	"context"
+	"fmt"
+
+	"github.com/apache/incubator-devlake/config"
+	"gorm.io/gorm/clause"
+
+	"github.com/apache/incubator-devlake/plugins/core"
 
 	"github.com/apache/incubator-devlake/plugins/gitee/models/migrationscripts/archived"
 	"gorm.io/gorm"
@@ -27,7 +33,25 @@ import (
 type InitSchemas struct{}
 
 func (*InitSchemas) Up(ctx context.Context, db *gorm.DB) error {
-	return db.Migrator().AutoMigrate(
+	rawTableList := []string{
+		"_raw_gitee_api_commit",
+		"_raw_gitee_api_issues",
+		"_raw_gitee_api_pull_requests",
+		"_raw_gitee_api_pull_request_commits",
+		"_raw_gitee_api_pull_request_reviews",
+		"_raw_gitee_api_repo",
+		"_raw_gitee_api_comments",
+		"_raw_gitee_api_commits",
+		"_raw_gitee_issue_comments",
+	}
+	for _, v := range rawTableList {
+		err := db.Exec(fmt.Sprintf("DROP TABLE IF EXISTS %s CASCADE", v)).Error
+		if err != nil {
+			return err
+		}
+	}
+
+	err := db.Migrator().DropTable(
 		&archived.GiteeRepo{},
 		&archived.GiteeCommit{},
 		&archived.GiteeRepoCommit{},
@@ -42,11 +66,59 @@ func (*InitSchemas) Up(ctx context.Context, db *gorm.DB) error {
 		&archived.GiteePullRequestCommit{},
 		&archived.GiteePullRequestIssue{},
 		&archived.GiteeReviewer{},
+		&archived.GiteeConnection{},
 	)
+
+	if err != nil {
+		return err
+	}
+
+	err = db.Migrator().AutoMigrate(
+		&archived.GiteeRepo{},
+		&archived.GiteeCommit{},
+		&archived.GiteeRepoCommit{},
+		&archived.GiteePullRequest{},
+		&archived.GiteePullRequestLabel{},
+		&archived.GiteeUser{},
+		&archived.GiteePullRequestComment{},
+		&archived.GiteeIssue{},
+		&archived.GiteeIssueComment{},
+		&archived.GiteeCommitStat{},
+		&archived.GiteeIssueLabel{},
+		&archived.GiteePullRequestCommit{},
+		&archived.GiteePullRequestIssue{},
+		&archived.GiteeReviewer{},
+		&archived.GiteeConnection{},
+	)
+
+	if err != nil {
+		return err
+	}
+
+	conn := &archived.GiteeConnection{}
+	v := config.GetConfig()
+	encKey := v.GetString(core.EncodeKeyEnvStr)
+
+	conn.Name = "init gitee connection"
+	conn.ID = 1
+	conn.Endpoint = v.GetString("GITEE_ENDPOINT")
+	conn.Token, err = core.Encrypt(encKey, v.GetString("GITEE_AUTH"))
+	if err != nil {
+		return err
+	}
+	conn.Proxy = v.GetString("GITEE_PROXY")
+	conn.RateLimit = v.GetInt("GITEE_API_REQUESTS_PER_HOUR")
+
+	err = db.Clauses(clause.OnConflict{DoNothing: true}).Create(conn).Error
+
+	if err != nil {
+		return err
+	}
+	return nil
 }
 
 func (*InitSchemas) Version() uint64 {
-	return 20220617201204
+	return 20220617231243
 }
 
 func (*InitSchemas) Name() string {
diff --git a/plugins/gitee/tasks/api_client.go b/plugins/gitee/tasks/api_client.go
index 94c63256..0f567186 100644
--- a/plugins/gitee/tasks/api_client.go
+++ b/plugins/gitee/tasks/api_client.go
@@ -23,32 +23,26 @@ import (
 	"strconv"
 	"time"
 
+	"github.com/apache/incubator-devlake/plugins/gitee/models"
+
 	"github.com/apache/incubator-devlake/plugins/core"
 	"github.com/apache/incubator-devlake/plugins/helper"
-	"github.com/apache/incubator-devlake/utils"
 )
 
-func NewGiteeApiClient(taskCtx core.TaskContext) (*helper.ApiAsyncClient, error) {
-	endpoint := taskCtx.GetConfig("GITEE_ENDPOINT")
-	if endpoint == "" {
-		return nil, fmt.Errorf("endpint is required")
-	}
-	userRateLimit, err := utils.StrToIntOr(taskCtx.GetConfig("GITEE_API_REQUESTS_PER_HOUR"), 0)
+func NewGiteeApiClient(taskCtx core.TaskContext, connection *models.GiteeConnection) (*helper.ApiAsyncClient, error) {
+
+	apiClient, err := helper.NewApiClient(connection.Endpoint, nil, 0, connection.Proxy, taskCtx.GetContext())
 	if err != nil {
 		return nil, err
 	}
-	auth := taskCtx.GetConfig("GITEE_AUTH")
-	if auth == "" {
-		return nil, fmt.Errorf("GITEE_AUTH is required")
-	}
-	proxy := taskCtx.GetConfig("GITEE_PROXY")
 
-	headers := map[string]string{}
+	apiClient.SetBeforeFunction(func(req *http.Request) error {
+		query := req.URL.Query()
+		query.Set("access_token", connection.Token)
+		req.URL.RawQuery = query.Encode()
+		return nil
+	})
 
-	apiClient, err := helper.NewApiClient(endpoint, headers, 0, proxy, taskCtx.GetContext())
-	if err != nil {
-		return nil, err
-	}
 	apiClient.SetAfterFunction(func(res *http.Response) error {
 		if res.StatusCode == http.StatusUnauthorized {
 			return fmt.Errorf("authentication failed, please check your Basic Auth Token")
@@ -57,7 +51,7 @@ func NewGiteeApiClient(taskCtx core.TaskContext) (*helper.ApiAsyncClient, error)
 	})
 
 	rateLimiter := &helper.ApiRateLimitCalculator{
-		UserRateLimitPerHour: userRateLimit,
+		UserRateLimitPerHour: connection.RateLimit,
 		DynamicRateLimit: func(res *http.Response) (int, time.Duration, error) {
 			rateLimitHeader := res.Header.Get("RateLimit-Limit")
 			if rateLimitHeader == "" {
diff --git a/plugins/gitee/tasks/commit_collector.go b/plugins/gitee/tasks/commit_collector.go
index dc834e53..0d37a632 100644
--- a/plugins/gitee/tasks/commit_collector.go
+++ b/plugins/gitee/tasks/commit_collector.go
@@ -45,7 +45,6 @@ func CollectApiCommits(taskCtx core.SubTaskContext) error {
 		UrlTemplate:        "repos/{{ .Params.Owner }}/{{ .Params.Repo }}/commits",
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
 			query := url.Values{}
-			query.Set("access_token", data.Options.Token)
 			query.Set("with_stats", "true")
 			query.Set("sort", "asc")
 			query.Set("page", strconv.Itoa(reqData.Pager.Page))
diff --git a/plugins/gitee/tasks/commit_stats_collector.go b/plugins/gitee/tasks/commit_stats_collector.go
index cdc23c1d..83902bf4 100644
--- a/plugins/gitee/tasks/commit_stats_collector.go
+++ b/plugins/gitee/tasks/commit_stats_collector.go
@@ -85,7 +85,6 @@ func CollectApiCommitStats(taskCtx core.SubTaskContext) error {
 		*/
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
 			query := url.Values{}
-			query.Set("access_token", data.Options.Token)
 			query.Set("state", "all")
 			query.Set("direction", "asc")
 			query.Set("page", fmt.Sprintf("%v", reqData.Pager.Page))
diff --git a/plugins/gitee/tasks/issue_collector.go b/plugins/gitee/tasks/issue_collector.go
index 4b882233..5b325084 100644
--- a/plugins/gitee/tasks/issue_collector.go
+++ b/plugins/gitee/tasks/issue_collector.go
@@ -67,7 +67,6 @@ func CollectApiIssues(taskCtx core.SubTaskContext) error {
 		UrlTemplate:        "repos/{{ .Params.Owner }}/{{ .Params.Repo }}/issues",
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
 			query := url.Values{}
-			query.Set("access_token", data.Options.Token)
 			query.Set("state", "all")
 			if since != nil {
 				query.Set("since", since.String())
diff --git a/plugins/gitee/tasks/issue_comment_collector.go b/plugins/gitee/tasks/issue_comment_collector.go
index a74b08fb..df0d6364 100644
--- a/plugins/gitee/tasks/issue_comment_collector.go
+++ b/plugins/gitee/tasks/issue_comment_collector.go
@@ -87,7 +87,6 @@ func CollectApiIssueComments(taskCtx core.SubTaskContext) error {
 		UrlTemplate: "repos/{{ .Params.Owner }}/{{ .Params.Repo }}/issues/comments",
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
 			query := url.Values{}
-			query.Set("access_token", data.Options.Token)
 			query.Set("state", "all")
 			if since != nil {
 				query.Set("since", since.String())
diff --git a/plugins/gitee/tasks/issue_comment_extractor.go b/plugins/gitee/tasks/issue_comment_extractor.go
index 8e321b05..2fcfb76c 100644
--- a/plugins/gitee/tasks/issue_comment_extractor.go
+++ b/plugins/gitee/tasks/issue_comment_extractor.go
@@ -36,11 +36,21 @@ var ExtractApiIssueCommentsMeta = core.SubTaskMeta{
 type IssueComment struct {
 	GiteeId int `json:"id"`
 	Body    string
-	User    struct {
+
+	User struct {
 		Login string
 		Id    int
 	}
-	IssueUrl       string             `json:"issue_url"`
+
+	Target struct {
+		Issue struct {
+			Id     int    `json:"id"`
+			Title  string `json:"title"`
+			Number string `json:"number"`
+		}
+		PullRequest string `json:"pull_request"`
+	}
+
 	GiteeCreatedAt helper.Iso8601Time `json:"created_at"`
 	GiteeUpdatedAt helper.Iso8601Time `json:"updated_at"`
 }
@@ -69,7 +79,7 @@ func ExtractApiIssueComments(taskCtx core.SubTaskContext) error {
 				return nil, nil
 			}
 			//If this is a pr, ignore
-			issueINumber, err := GetIssueIdByIssueUrl(apiComment.IssueUrl)
+			issueINumber := apiComment.Target.Issue.Number
 			if err != nil {
 				return nil, err
 			}
diff --git a/plugins/gitee/tasks/pr_collector.go b/plugins/gitee/tasks/pr_collector.go
index 31f80ddc..c20a308d 100644
--- a/plugins/gitee/tasks/pr_collector.go
+++ b/plugins/gitee/tasks/pr_collector.go
@@ -68,7 +68,6 @@ func CollectApiPullRequests(taskCtx core.SubTaskContext) error {
 
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
 			query := url.Values{}
-			query.Set("access_token", data.Options.Token)
 			query.Set("state", "all")
 			if since != nil {
 				query.Set("since", since.String())
diff --git a/plugins/gitee/tasks/pr_commit_collector.go b/plugins/gitee/tasks/pr_commit_collector.go
index 8a5a1388..5cdd8e3e 100644
--- a/plugins/gitee/tasks/pr_commit_collector.go
+++ b/plugins/gitee/tasks/pr_commit_collector.go
@@ -71,7 +71,6 @@ func CollectApiPullRequestCommits(taskCtx core.SubTaskContext) error {
 
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
 			query := url.Values{}
-			query.Set("access_token", data.Options.Token)
 			query.Set("state", "all")
 			query.Set("page", fmt.Sprintf("%v", reqData.Pager.Page))
 			query.Set("direction", "asc")
diff --git a/plugins/gitee/tasks/pr_review_collector.go b/plugins/gitee/tasks/pr_review_collector.go
index 468236f6..bfc21cec 100644
--- a/plugins/gitee/tasks/pr_review_collector.go
+++ b/plugins/gitee/tasks/pr_review_collector.go
@@ -67,7 +67,6 @@ func CollectApiPullRequestReviews(taskCtx core.SubTaskContext) error {
 
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
 			query := url.Values{}
-			query.Set("access_token", data.Options.Token)
 			query.Set("page", fmt.Sprintf("%v", reqData.Pager.Page))
 			query.Set("per_page", fmt.Sprintf("%v", reqData.Pager.Size))
 			query.Set("sort", "asc")
diff --git a/plugins/gitee/tasks/repo_collector.go b/plugins/gitee/tasks/repo_collector.go
index 15111300..ad2670c1 100644
--- a/plugins/gitee/tasks/repo_collector.go
+++ b/plugins/gitee/tasks/repo_collector.go
@@ -47,7 +47,6 @@ func CollectApiRepositories(taskCtx core.SubTaskContext) error {
 		UrlTemplate:        "repos/{{ .Params.Owner }}/{{ .Params.Repo }}",
 		Query: func(reqData *helper.RequestData) (url.Values, error) {
 			query := url.Values{}
-			query.Set("access_token", data.Options.Token)
 			query.Set("state", "all")
 			query.Set("page", fmt.Sprintf("%v", reqData.Pager.Page))
 			query.Set("direction", "asc")
diff --git a/plugins/gitee/tasks/shared.go b/plugins/gitee/tasks/shared.go
index 48238dcb..76b2de18 100644
--- a/plugins/gitee/tasks/shared.go
+++ b/plugins/gitee/tasks/shared.go
@@ -48,7 +48,6 @@ type RateLimitInfo struct {
 type GiteeApiParams struct {
 	Repo  string
 	Owner string
-	Token string
 }
 
 type GiteeInput struct {
@@ -96,7 +95,6 @@ func CreateRawDataSubTaskArgs(taskCtx core.SubTaskContext, Table string) (*helpe
 		Params: GiteeApiParams{
 			Repo:  data.Options.Repo,
 			Owner: data.Options.Owner,
-			Token: data.Options.Token,
 		},
 		Table: Table,
 	}
@@ -194,13 +192,3 @@ func GetPagingFromLinkHeader(link string) (PagingInfo, error) {
 		return result, errors.New("the link string provided is invalid. There is likely no next page of data to fetch")
 	}
 }
-
-func GetIssueIdByIssueUrl(s string) (int, error) {
-	regex := regexp.MustCompile(`.*/issues/(\d+)`)
-	groups := regex.FindStringSubmatch(s)
-	if len(groups) > 0 {
-		return strconv.Atoi(groups[1])
-	} else {
-		return 0, errors.New("invalid issue url")
-	}
-}
diff --git a/plugins/gitee/tasks/task_data.go b/plugins/gitee/tasks/task_data.go
index 76956641..c990378b 100644
--- a/plugins/gitee/tasks/task_data.go
+++ b/plugins/gitee/tasks/task_data.go
@@ -25,12 +25,13 @@ import (
 )
 
 type GiteeOptions struct {
-	Tasks []string `json:"tasks,omitempty"`
-	Since string
-	Owner string
-	Repo  string
-	Token string
-	models.Config
+	ConnectionId  uint64   `json:"connectionId"`
+	Tasks         []string `json:"tasks,omitempty"`
+	Since         string
+	Owner         string
+	Repo          string
+	Token         string
+	models.Config `mapstructure:",squash"`
 }
 
 type GiteeTaskData struct {