summaryrefslogtreecommitdiffstats
path: root/models/review.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/review.go')
-rw-r--r--models/review.go33
1 files changed, 33 insertions, 0 deletions
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
+}