diff options
author | kolaente <konrad@kola-entertainments.de> | 2018-11-22 14:17:36 +0100 |
---|---|---|
committer | Lauris BH <lauris@nix.lv> | 2018-11-22 15:17:36 +0200 |
commit | 0dcf31ae49707c10c1b14e112e0831e920cb6e16 (patch) | |
tree | fae417a40cfad5dc19d625e797628cc5c6ebbb8f /models | |
parent | cef0f12c51cee9edeb636fd2174f8d4eb00ea955 (diff) | |
download | gitea-0dcf31ae49707c10c1b14e112e0831e920cb6e16.tar.gz gitea-0dcf31ae49707c10c1b14e112e0831e920cb6e16.zip |
Show review summary in pull requests (#5132)
Diffstat (limited to 'models')
-rw-r--r-- | models/fixtures/review.yml | 40 | ||||
-rw-r--r-- | models/review.go | 33 | ||||
-rw-r--r-- | models/review_test.go | 32 |
3 files changed, 104 insertions, 1 deletions
diff --git a/models/fixtures/review.yml b/models/fixtures/review.yml index 17defd1b3a..515f0d77f8 100644 --- a/models/fixtures/review.yml +++ b/models/fixtures/review.yml @@ -30,3 +30,43 @@ content: "Pending Review" updated_unix: 946684810 created_unix: 946684810 +- + id: 5 + type: 2 + reviewer_id: 1 + issue_id: 3 + content: "New review 1" + updated_unix: 946684810 + created_unix: 946684810 +- + id: 6 + type: 0 + reviewer_id: 2 + issue_id: 3 + content: "New review 3" + updated_unix: 946684810 + created_unix: 946684810 +- + id: 7 + type: 3 + reviewer_id: 3 + issue_id: 3 + content: "New review 4" + updated_unix: 946684810 + created_unix: 946684810 +- + id: 8 + type: 1 + reviewer_id: 4 + issue_id: 3 + content: "New review 5" + updated_unix: 946684810 + created_unix: 946684810 +- + id: 9 + type: 3 + reviewer_id: 2 + issue_id: 3 + content: "New review 3 rejected" + updated_unix: 946684810 + created_unix: 946684810 diff --git a/models/review.go b/models/review.go index f58d3f90cb..7eabb93746 100644 --- a/models/review.go +++ b/models/review.go @@ -255,3 +255,36 @@ func UpdateReview(r *Review) error { } return nil } + +// PullReviewersWithType represents the type used to display a review overview +type PullReviewersWithType struct { + User `xorm:"extends"` + Type ReviewType + ReviewUpdatedUnix util.TimeStamp `xorm:"review_updated_unix"` +} + +// GetReviewersByPullID gets all reviewers for a pull request with the statuses +func GetReviewersByPullID(pullID int64) (issueReviewers []*PullReviewersWithType, err error) { + irs := []*PullReviewersWithType{} + err = x.Select("`user`.*, review.type, max(review.updated_unix) as review_updated_unix"). + Table("review"). + Join("INNER", "`user`", "review.reviewer_id = `user`.id"). + Where("review.issue_id = ? AND (review.type = ? OR review.type = ?)", pullID, ReviewTypeApprove, ReviewTypeReject). + GroupBy("`user`.id, review.type"). + OrderBy("review_updated_unix DESC"). + Find(&irs) + + // We need to group our results by user id _and_ review type, otherwise the query fails when using postgresql. + // But becaus we're doing this, we need to manually filter out multiple reviews of different types by the + // same person because we only want to show the newest review grouped by user. Thats why we're using a map here. + issueReviewers = []*PullReviewersWithType{} + usersInArray := make(map[int64]bool) + for _, ir := range irs { + if !usersInArray[ir.ID] { + issueReviewers = append(issueReviewers, ir) + usersInArray[ir.ID] = true + } + } + + return +} diff --git a/models/review_test.go b/models/review_test.go index 3c0444e7a3..f8e8086dca 100644 --- a/models/review_test.go +++ b/models/review_test.go @@ -74,7 +74,7 @@ func TestGetCurrentReview(t *testing.T) { assert.Equal(t, ReviewTypePending, review.Type) assert.Equal(t, "Pending Review", review.Content) - user2 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) + user2 := AssertExistsAndLoadBean(t, &User{ID: 7}).(*User) review2, err := GetCurrentReview(user2, issue) assert.Error(t, err) assert.True(t, IsErrReviewNotExist(err)) @@ -105,3 +105,33 @@ func TestUpdateReview(t *testing.T) { assert.NoError(t, UpdateReview(review)) AssertExistsAndLoadBean(t, &Review{ID: 1, Content: "Updated Review"}) } + +func TestGetReviewersByPullID(t *testing.T) { + assert.NoError(t, PrepareTestDatabase()) + + issue := AssertExistsAndLoadBean(t, &Issue{ID: 3}).(*Issue) + user2 := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User) + user3 := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User) + user4 := AssertExistsAndLoadBean(t, &User{ID: 4}).(*User) + + expectedReviews := []*PullReviewersWithType{} + expectedReviews = append(expectedReviews, &PullReviewersWithType{ + User: *user2, + Type: ReviewTypeReject, + ReviewUpdatedUnix: 946684810, + }, + &PullReviewersWithType{ + User: *user3, + Type: ReviewTypeReject, + ReviewUpdatedUnix: 946684810, + }, + &PullReviewersWithType{ + User: *user4, + Type: ReviewTypeApprove, + ReviewUpdatedUnix: 946684810, + }) + + allReviews, err := GetReviewersByPullID(issue.ID) + assert.NoError(t, err) + assert.Equal(t, expectedReviews, allReviews) +} |