From f7bfdbaf016a74d9242c9acf848e130c741a9efc Mon Sep 17 00:00:00 2001 From: emrebdr Date: Sun, 4 Aug 2024 01:48:25 +0300 Subject: [PATCH 1/4] fix null pull request reviewers from api if reviews assigned to team --- models/issues/pull.go | 18 ++++++++++++++++-- models/issues/review_list.go | 23 ++++++++++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/models/issues/pull.go b/models/issues/pull.go index a4e61476198d7..8a05418b94066 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "io" + "maps" "regexp" "strconv" "strings" @@ -303,9 +304,22 @@ func (pr *PullRequest) LoadRequestedReviewers(ctx context.Context) error { if err = reviews.LoadReviewers(ctx); err != nil { return err } - pr.isRequestedReviewersLoaded = true + + reviewsUserMap := make(map[int64]*user_model.User, 0) for _, review := range reviews { - pr.RequestedReviewers = append(pr.RequestedReviewers, review.Reviewer) + if review.ReviewerID != 0 { + reviewsUserMap[review.ReviewerID] = review.Reviewer + } + } + teamReviewsMembersMap, err := reviews.GetReviewersTeamMembers(ctx) + if err != nil { + return err + } + maps.Copy(reviewsUserMap, teamReviewsMembersMap) + + pr.isRequestedReviewersLoaded = true + for _, user := range reviewsUserMap { + pr.RequestedReviewers = append(pr.RequestedReviewers, user) } return nil diff --git a/models/issues/review_list.go b/models/issues/review_list.go index 7b8c3d319c35a..e8a7c141f13f0 100644 --- a/models/issues/review_list.go +++ b/models/issues/review_list.go @@ -7,10 +7,10 @@ import ( "context" "code.gitea.io/gitea/models/db" + "code.gitea.io/gitea/models/organization" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/optional" - "xorm.io/builder" ) @@ -37,6 +37,27 @@ func (reviews ReviewList) LoadReviewers(ctx context.Context) error { return nil } +// GetReviewersTeamMembers returns team members if reviews reviewer is team +func (reviews ReviewList) GetReviewersTeamMembers(ctx context.Context) (map[int64]*user_model.User, error) { + teamMembersMap := make(map[int64]*user_model.User, 0) + for i := 0; i < len(reviews); i++ { + if reviews[i].ReviewerID == 0 && reviews[i].ReviewerTeamID != 0 { + members, err := organization.GetTeamMembers(ctx, &organization.SearchMembersOptions{ + TeamID: reviews[i].ReviewerTeamID, + }) + if err != nil { + return nil, err + } + + for _, member := range members { + teamMembersMap[member.ID] = member + } + } + } + + return teamMembersMap, nil +} + func (reviews ReviewList) LoadIssues(ctx context.Context) error { issueIDs := container.FilterSlice(reviews, func(review *Review) (int64, bool) { return review.IssueID, true From 536ee2b50a96d07541b65d8bb10bc164112f07be Mon Sep 17 00:00:00 2001 From: Edip Emre Bodur <38386056+emrebdr@users.noreply.github.com> Date: Sun, 4 Aug 2024 02:08:32 +0300 Subject: [PATCH 2/4] fix pipeline --- models/issues/review_list.go | 1 + 1 file changed, 1 insertion(+) diff --git a/models/issues/review_list.go b/models/issues/review_list.go index e8a7c141f13f0..d4eae5dcdd8e4 100644 --- a/models/issues/review_list.go +++ b/models/issues/review_list.go @@ -11,6 +11,7 @@ import ( user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/optional" + "xorm.io/builder" ) From 7a2dd20482c89c6bdb861dca6ea00ad5a07e72de Mon Sep 17 00:00:00 2001 From: emrebdr Date: Sun, 4 Aug 2024 21:47:27 +0300 Subject: [PATCH 3/4] added new response object field for pull requests API --- models/issues/pull.go | 26 +++++++++++++++-------- models/issues/review_list.go | 41 +++++++++++++++++++++--------------- modules/structs/pull.go | 31 ++++++++++++++------------- services/convert/pull.go | 15 +++++++++++++ 4 files changed, 72 insertions(+), 41 deletions(-) diff --git a/models/issues/pull.go b/models/issues/pull.go index 8a05418b94066..5fe95d56cc253 100644 --- a/models/issues/pull.go +++ b/models/issues/pull.go @@ -8,7 +8,6 @@ import ( "context" "fmt" "io" - "maps" "regexp" "strconv" "strings" @@ -166,6 +165,7 @@ type PullRequest struct { Issue *Issue `xorm:"-"` Index int64 RequestedReviewers []*user_model.User `xorm:"-"` + RequestedReviewersTeams []*org_model.Team `xorm:"-"` isRequestedReviewersLoaded bool `xorm:"-"` HeadRepoID int64 `xorm:"INDEX"` @@ -304,22 +304,30 @@ func (pr *PullRequest) LoadRequestedReviewers(ctx context.Context) error { if err = reviews.LoadReviewers(ctx); err != nil { return err } - - reviewsUserMap := make(map[int64]*user_model.User, 0) + pr.isRequestedReviewersLoaded = true for _, review := range reviews { if review.ReviewerID != 0 { - reviewsUserMap[review.ReviewerID] = review.Reviewer + pr.RequestedReviewers = append(pr.RequestedReviewers, review.Reviewer) } } - teamReviewsMembersMap, err := reviews.GetReviewersTeamMembers(ctx) + + return nil +} + +// LoadRequestedReviewersTeams loads the requested reviewers teams. +func (pr *PullRequest) LoadRequestedReviewersTeams(ctx context.Context) error { + reviews, err := GetReviewsByIssueID(ctx, pr.Issue.ID) if err != nil { return err } - maps.Copy(reviewsUserMap, teamReviewsMembersMap) + if err = reviews.LoadReviewersTeams(ctx); err != nil { + return err + } - pr.isRequestedReviewersLoaded = true - for _, user := range reviewsUserMap { - pr.RequestedReviewers = append(pr.RequestedReviewers, user) + for _, review := range reviews { + if review.ReviewerTeamID != 0 { + pr.RequestedReviewersTeams = append(pr.RequestedReviewersTeams, review.ReviewerTeam) + } } return nil diff --git a/models/issues/review_list.go b/models/issues/review_list.go index d4eae5dcdd8e4..0ee28874ec98a 100644 --- a/models/issues/review_list.go +++ b/models/issues/review_list.go @@ -7,7 +7,7 @@ import ( "context" "code.gitea.io/gitea/models/db" - "code.gitea.io/gitea/models/organization" + organization_model "code.gitea.io/gitea/models/organization" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/container" "code.gitea.io/gitea/modules/optional" @@ -38,25 +38,32 @@ func (reviews ReviewList) LoadReviewers(ctx context.Context) error { return nil } -// GetReviewersTeamMembers returns team members if reviews reviewer is team -func (reviews ReviewList) GetReviewersTeamMembers(ctx context.Context) (map[int64]*user_model.User, error) { - teamMembersMap := make(map[int64]*user_model.User, 0) - for i := 0; i < len(reviews); i++ { - if reviews[i].ReviewerID == 0 && reviews[i].ReviewerTeamID != 0 { - members, err := organization.GetTeamMembers(ctx, &organization.SearchMembersOptions{ - TeamID: reviews[i].ReviewerTeamID, - }) - if err != nil { - return nil, err - } - - for _, member := range members { - teamMembersMap[member.ID] = member - } +// LoadReviewersTeams loads reviewers teams +func (reviews ReviewList) LoadReviewersTeams(ctx context.Context) error { + reviewersTeamsIDs := make([]int64, 0) + for _, review := range reviews { + if review.ReviewerTeamID != 0 { + reviewersTeamsIDs = append(reviewersTeamsIDs, review.ReviewerTeamID) + } + } + + teamsMap := make(map[int64]*organization_model.Team, 0) + for _, teamID := range reviewersTeamsIDs { + team, err := organization_model.GetTeamByID(ctx, teamID) + if err != nil { + return err } + + teamsMap[teamID] = team } - return teamMembersMap, nil + for _, review := range reviews { + if review.ReviewerTeamID != 0 { + review.ReviewerTeam = teamsMap[review.ReviewerTeamID] + } + } + + return nil } func (reviews ReviewList) LoadIssues(ctx context.Context) error { diff --git a/modules/structs/pull.go b/modules/structs/pull.go index 525d90c28e5f6..ab627666c94af 100644 --- a/modules/structs/pull.go +++ b/modules/structs/pull.go @@ -9,21 +9,22 @@ import ( // PullRequest represents a pull request type PullRequest struct { - ID int64 `json:"id"` - URL string `json:"url"` - Index int64 `json:"number"` - Poster *User `json:"user"` - Title string `json:"title"` - Body string `json:"body"` - Labels []*Label `json:"labels"` - Milestone *Milestone `json:"milestone"` - Assignee *User `json:"assignee"` - Assignees []*User `json:"assignees"` - RequestedReviewers []*User `json:"requested_reviewers"` - State StateType `json:"state"` - Draft bool `json:"draft"` - IsLocked bool `json:"is_locked"` - Comments int `json:"comments"` + ID int64 `json:"id"` + URL string `json:"url"` + Index int64 `json:"number"` + Poster *User `json:"user"` + Title string `json:"title"` + Body string `json:"body"` + Labels []*Label `json:"labels"` + Milestone *Milestone `json:"milestone"` + Assignee *User `json:"assignee"` + Assignees []*User `json:"assignees"` + RequestedReviewers []*User `json:"requested_reviewers"` + RequestedReviewersTeams []*Team `json:"requested_reviewers_teams"` + State StateType `json:"state"` + Draft bool `json:"draft"` + IsLocked bool `json:"is_locked"` + Comments int `json:"comments"` // number of review comments made on the diff of a PR review (not including comments on commits or issues in a PR) ReviewComments int `json:"review_comments"` Additions int `json:"additions"` diff --git a/services/convert/pull.go b/services/convert/pull.go index c214805ed55d3..4ec24a8276a13 100644 --- a/services/convert/pull.go +++ b/services/convert/pull.go @@ -106,10 +106,25 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u log.Error("LoadRequestedReviewers[%d]: %v", pr.ID, err) return nil } + if err = pr.LoadRequestedReviewersTeams(ctx); err != nil { + log.Error("LoadRequestedReviewersTeams[%d]: %v", pr.ID, err) + return nil + } + for _, reviewer := range pr.RequestedReviewers { apiPullRequest.RequestedReviewers = append(apiPullRequest.RequestedReviewers, ToUser(ctx, reviewer, nil)) } + for _, reviewerTeam := range pr.RequestedReviewersTeams { + convertedTeam, err := ToTeam(ctx, reviewerTeam, true) + if err != nil { + log.Error("LoadRequestedReviewersTeams[%d]: %v", pr.ID, err) + return nil + } + + apiPullRequest.RequestedReviewersTeams = append(apiPullRequest.RequestedReviewersTeams, convertedTeam) + } + if pr.Issue.ClosedUnix != 0 { apiPullRequest.Closed = pr.Issue.ClosedUnix.AsTimePtr() } From 83020fdf0fbd115c9465ca45ea4a035152008ca8 Mon Sep 17 00:00:00 2001 From: emrebdr Date: Sun, 4 Aug 2024 21:54:28 +0300 Subject: [PATCH 4/4] updated swagger template --- templates/swagger/v1_json.tmpl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index bfaa86428c952..18ea4a62b58f4 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -23517,6 +23517,13 @@ }, "x-go-name": "RequestedReviewers" }, + "requested_reviewers_teams": { + "type": "array", + "items": { + "$ref": "#/definitions/Team" + }, + "x-go-name": "RequestedReviewersTeams" + }, "review_comments": { "description": "number of review comments made on the diff of a PR review (not including comments on commits or issues in a PR)", "type": "integer",