aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorkolaente <konrad@kola-entertainments.de>2018-11-22 14:17:36 +0100
committerLauris BH <lauris@nix.lv>2018-11-22 15:17:36 +0200
commit0dcf31ae49707c10c1b14e112e0831e920cb6e16 (patch)
treefae417a40cfad5dc19d625e797628cc5c6ebbb8f /models
parentcef0f12c51cee9edeb636fd2174f8d4eb00ea955 (diff)
downloadgitea-0dcf31ae49707c10c1b14e112e0831e920cb6e16.tar.gz
gitea-0dcf31ae49707c10c1b14e112e0831e920cb6e16.zip
Show review summary in pull requests (#5132)
Diffstat (limited to 'models')
-rw-r--r--models/fixtures/review.yml40
-rw-r--r--models/review.go33
-rw-r--r--models/review_test.go32
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)
+}