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

abeizn pushed a commit to branch add-github-request-reviewer
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/add-github-request-reviewer by 
this push:
     new a858fa5bb feat: github add pull request reviewer
a858fa5bb is described below

commit a858fa5bb8bfb5a0866cb8434fb0e06a40b8df55
Author: abeizn <[email protected]>
AuthorDate: Thu Jul 11 12:19:45 2024 +0800

    feat: github add pull request reviewer
---
 .../20240711_restruct_github_reviewers.go          | 65 ++++++++++++++
 .../github/models/migrationscripts/register.go     |  1 +
 backend/plugins/github/models/reviewer.go          |  8 +-
 .../plugins/github/tasks/pr_review_extractor.go    |  4 +-
 backend/plugins/github/tasks/review_convertor.go   | 98 ++++++++++++++++++++++
 backend/plugins/github_graphql/impl/impl.go        |  1 +
 .../plugins/github_graphql/tasks/pr_collector.go   | 27 +++++-
 .../plugins/github_graphql/tasks/pr_extractor.go   |  9 ++
 8 files changed, 208 insertions(+), 5 deletions(-)

diff --git 
a/backend/plugins/github/models/migrationscripts/20240711_restruct_github_reviewers.go
 
b/backend/plugins/github/models/migrationscripts/20240711_restruct_github_reviewers.go
new file mode 100644
index 000000000..af5a95a34
--- /dev/null
+++ 
b/backend/plugins/github/models/migrationscripts/20240711_restruct_github_reviewers.go
@@ -0,0 +1,65 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package migrationscripts
+
+import (
+       "github.com/apache/incubator-devlake/core/context"
+       "github.com/apache/incubator-devlake/core/errors"
+       coreArchived 
"github.com/apache/incubator-devlake/core/models/migrationscripts/archived"
+       "github.com/apache/incubator-devlake/core/plugin"
+       
"github.com/apache/incubator-devlake/plugins/github/models/migrationscripts/archived"
+)
+
+var _ plugin.MigrationScript = (*restructReviewer)(nil)
+
+type reviewer20240711 struct {
+       ConnectionId  uint64 `gorm:"primaryKey"`
+       ReviewerId    int    `gorm:"primaryKey"`
+       PullRequestId int    `gorm:"primaryKey"`
+       Name          string `gorm:"type:varchar(255)"`
+       Username      string `gorm:"type:varchar(255)"`
+       State         string `gorm:"type:varchar(255)"`
+       AvatarUrl     string `gorm:"type:varchar(255)"`
+       WebUrl        string `gorm:"type:varchar(255)"`
+       coreArchived.NoPKModel
+}
+
+func (reviewer20240711) TableName() string {
+       return "_tool_github_reviewers"
+}
+
+type restructReviewer struct{}
+
+func (*restructReviewer) Up(basicRes context.BasicRes) errors.Error {
+       db := basicRes.GetDal()
+       if err := db.DropTables(&archived.GithubReviewer{}); err != nil {
+               return err
+       }
+       if err := db.AutoMigrate(&reviewer20240711{}); err != nil {
+               return err
+       }
+       return nil
+}
+
+func (*restructReviewer) Version() uint64 {
+       return 20240710142104
+}
+
+func (*restructReviewer) Name() string {
+       return "restruct reviewer table"
+}
diff --git a/backend/plugins/github/models/migrationscripts/register.go 
b/backend/plugins/github/models/migrationscripts/register.go
index 35ad1b1dc..4a4b95069 100644
--- a/backend/plugins/github/models/migrationscripts/register.go
+++ b/backend/plugins/github/models/migrationscripts/register.go
@@ -51,5 +51,6 @@ func All() []plugin.MigrationScript {
                new(addReleaseTable),
                new(addReleaseCommitSha),
                new(addMergedByToPr),
+               new(restructReviewer),
        }
 }
diff --git a/backend/plugins/github/models/reviewer.go 
b/backend/plugins/github/models/reviewer.go
index c8af4e181..7d82a88e6 100644
--- a/backend/plugins/github/models/reviewer.go
+++ b/backend/plugins/github/models/reviewer.go
@@ -23,9 +23,13 @@ import (
 
 type GithubReviewer struct {
        ConnectionId  uint64 `gorm:"primaryKey"`
-       GithubId      int    `gorm:"primaryKey"`
-       Login         string `gorm:"type:varchar(255)"`
+       ReviewerId    int    `gorm:"primaryKey"`
        PullRequestId int    `gorm:"primaryKey"`
+       Name          string `gorm:"type:varchar(255)"`
+       Username      string `gorm:"type:varchar(255)"`
+       State         string `gorm:"type:varchar(255)"`
+       AvatarUrl     string `gorm:"type:varchar(255)"`
+       WebUrl        string `gorm:"type:varchar(255)"`
 
        common.NoPKModel
 }
diff --git a/backend/plugins/github/tasks/pr_review_extractor.go 
b/backend/plugins/github/tasks/pr_review_extractor.go
index c14a179e8..2fba9a955 100644
--- a/backend/plugins/github/tasks/pr_review_extractor.go
+++ b/backend/plugins/github/tasks/pr_review_extractor.go
@@ -108,8 +108,8 @@ func ExtractApiPullRequestReviews(taskCtx 
plugin.SubTaskContext) errors.Error {
                        }
 
                        if apiPullRequestReview.User != nil {
-                               githubReviewer.GithubId = 
apiPullRequestReview.User.Id
-                               githubReviewer.Login = 
apiPullRequestReview.User.Login
+                               githubReviewer.ReviewerId = 
apiPullRequestReview.User.Id
+                               githubReviewer.Username = 
apiPullRequestReview.User.Login
 
                                githubPrReview.AuthorUserId = 
apiPullRequestReview.User.Id
                                githubPrReview.AuthorUsername = 
apiPullRequestReview.User.Login
diff --git a/backend/plugins/github/tasks/review_convertor.go 
b/backend/plugins/github/tasks/review_convertor.go
new file mode 100644
index 000000000..d4d101042
--- /dev/null
+++ b/backend/plugins/github/tasks/review_convertor.go
@@ -0,0 +1,98 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package tasks
+
+import (
+       "reflect"
+
+       "github.com/apache/incubator-devlake/core/dal"
+       "github.com/apache/incubator-devlake/core/errors"
+       "github.com/apache/incubator-devlake/core/models/domainlayer/code"
+       "github.com/apache/incubator-devlake/core/models/domainlayer/didgen"
+       "github.com/apache/incubator-devlake/core/plugin"
+       "github.com/apache/incubator-devlake/helpers/pluginhelper/api"
+       "github.com/apache/incubator-devlake/plugins/github/models"
+)
+
+func init() {
+       RegisterSubtaskMeta(&ConvertReviewsMeta)
+}
+
+var ConvertReviewsMeta = plugin.SubTaskMeta{
+       Name:             "Convert Reviews",
+       EntryPoint:       ConvertReviews,
+       EnabledByDefault: true,
+       Description:      "ConvertReviews data from Github api",
+       DomainTypes:      []string{plugin.DOMAIN_TYPE_CODE_REVIEW},
+       DependencyTables: []string{
+               models.GithubReviewer{}.TableName(),    // cursor and id 
generator
+               models.GithubPullRequest{}.TableName(), // cursor and id 
generator
+               models.GithubAccount{}.TableName(),     // id generator
+       },
+       ProductTables: []string{code.PullRequestReviewer{}.TableName()},
+}
+
+func ConvertReviews(taskCtx plugin.SubTaskContext) errors.Error {
+       db := taskCtx.GetDal()
+       data := taskCtx.GetData().(*GithubTaskData)
+       repoId := data.Options.GithubId
+
+       cursor, err := db.Cursor(
+               dal.From(&models.GithubReviewer{}),
+               dal.Join("left join _tool_github_pull_requests "+
+                       "on _tool_github_pull_requests.github_id = 
_tool_github_reviewers.pull_request_id"),
+               dal.Where("repo_id = ? and 
_tool_github_pull_requests.connection_id = ?", repoId, 
data.Options.ConnectionId),
+       )
+       if err != nil {
+               return err
+       }
+       defer cursor.Close()
+
+       prIdGen := didgen.NewDomainIdGenerator(&models.GithubPullRequest{})
+       accountIdGen := didgen.NewDomainIdGenerator(&models.GithubAccount{})
+
+       converter, err := api.NewDataConverter(api.DataConverterArgs{
+               InputRowType: reflect.TypeOf(models.GithubReviewer{}),
+               Input:        cursor,
+               RawDataSubTaskArgs: api.RawDataSubTaskArgs{
+                       Ctx: taskCtx,
+                       Params: GithubApiParams{
+                               ConnectionId: data.Options.ConnectionId,
+                               Name:         data.Options.Name,
+                       },
+                       Table: RAW_PR_REVIEW_TABLE,
+               },
+               Convert: func(inputRow interface{}) ([]interface{}, 
errors.Error) {
+                       githubReview := inputRow.(*models.GithubReviewer)
+                       domainReview := &code.PullRequestReviewer{
+                               PullRequestId: 
prIdGen.Generate(data.Options.ConnectionId, githubReview.PullRequestId),
+                               ReviewerId:    
accountIdGen.Generate(data.Options.ConnectionId, githubReview.ReviewerId),
+                               Name:          githubReview.Name,
+                               UserName:      githubReview.Username,
+                       }
+                       return []interface{}{
+                               domainReview,
+                       }, nil
+               },
+       })
+       if err != nil {
+               return err
+       }
+
+       return converter.Execute()
+}
diff --git a/backend/plugins/github_graphql/impl/impl.go 
b/backend/plugins/github_graphql/impl/impl.go
index 8045cd145..66433699c 100644
--- a/backend/plugins/github_graphql/impl/impl.go
+++ b/backend/plugins/github_graphql/impl/impl.go
@@ -125,6 +125,7 @@ func (p GithubGraphql) SubTaskMetas() []plugin.SubTaskMeta {
                githubTasks.ConvertIssueAssigneeMeta,
                githubTasks.ConvertIssueCommentsMeta,
                githubTasks.ConvertPullRequestCommentsMeta,
+               githubTasks.ConvertReviewsMeta,
                githubTasks.ConvertMilestonesMeta,
                githubTasks.ConvertAccountsMeta,
 
diff --git a/backend/plugins/github_graphql/tasks/pr_collector.go 
b/backend/plugins/github_graphql/tasks/pr_collector.go
index 82e5da69a..2cfdb36a9 100644
--- a/backend/plugins/github_graphql/tasks/pr_collector.go
+++ b/backend/plugins/github_graphql/tasks/pr_collector.go
@@ -18,6 +18,7 @@ limitations under the License.
 package tasks
 
 import (
+       "fmt"
        "strings"
        "time"
 
@@ -85,9 +86,32 @@ type GraphqlQueryPr struct {
                TotalCount graphql.Int
                Nodes      []GraphqlQueryReview `graphql:"nodes"`
        } `graphql:"reviews(first: 100)"`
-       MergedBy *GraphqlInlineAccountQuery
+       MergedBy       *GraphqlInlineAccountQuery
+       ReviewRequests struct {
+               Nodes []ReviewRequestNode `graphql:"nodes"`
+       } `graphql:"reviewRequests(first: 10)"`
 }
 
+type ReviewRequestNode struct {
+       RequestedReviewer RequestedReviewer `graphql:"requestedReviewer"`
+}
+
+type RequestedReviewer struct {
+       User User `graphql:"... on User"`
+       Team Team `graphql:"... on Team"`
+}
+
+type User struct {
+       Id    int    `graphql:"databaseId"`
+       Login string `graphql:"login"`
+       Name  string `graphql:"name"`
+}
+
+type Team struct {
+       Id   int    `graphql:"databaseId"`
+       Name string `graphql:"name"`
+       Slug string `graphql:"slug"`
+}
 type GraphqlQueryReview struct {
        Body       string
        Author     *GraphqlInlineAccountQuery
@@ -161,6 +185,7 @@ func CollectPrs(taskCtx plugin.SubTaskContext) errors.Error 
{
                                "owner":      graphql.String(ownerName[0]),
                                "name":       graphql.String(ownerName[1]),
                        }
+                       fmt.Println(query)
                        return query, variables, nil
                },
                GetPageInfo: func(iQuery interface{}, args 
*api.GraphqlCollectorArgs) (*api.GraphqlQueryPageInfo, error) {
diff --git a/backend/plugins/github_graphql/tasks/pr_extractor.go 
b/backend/plugins/github_graphql/tasks/pr_extractor.go
index 163fa4c84..cc26d0cc9 100644
--- a/backend/plugins/github_graphql/tasks/pr_extractor.go
+++ b/backend/plugins/github_graphql/tasks/pr_extractor.go
@@ -121,6 +121,15 @@ func ExtractPrs(taskCtx plugin.SubTaskContext) 
errors.Error {
                                                results = append(results, 
githubPrReview)
                                        }
                                }
+                               for _, apiReviewRequests := range 
rawL.ReviewRequests.Nodes {
+                                       githubReviewRequests := 
&models.GithubReviewer{
+                                               ConnectionId:  
data.Options.ConnectionId,
+                                               PullRequestId: 
githubPr.GithubId,
+                                               ReviewerId:    
apiReviewRequests.RequestedReviewer.User.Id,
+                                               Username:      
apiReviewRequests.RequestedReviewer.User.Login,
+                                       }
+                                       results = append(results, 
githubReviewRequests)
+                               }
 
                                for _, apiPullRequestCommit := range 
rawL.Commits.Nodes {
                                        githubCommit, err := 
convertPullRequestCommit(apiPullRequestCommit)

Reply via email to