diff options
author | 6543 <6543@obermui.de> | 2020-05-02 02:20:51 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-02 03:20:51 +0300 |
commit | c97494a4f4a0e8ba5453e293bcebb76274062b99 (patch) | |
tree | 29511446fbdc0296f77390a6566d4ad1eef4668c /modules/convert | |
parent | 4ed7d2a2bbb421e37cc0bc23a9f997e5606258ea (diff) | |
download | gitea-c97494a4f4a0e8ba5453e293bcebb76274062b99.tar.gz gitea-c97494a4f4a0e8ba5453e293bcebb76274062b99.zip |
API: Add pull review endpoints (#11224)
* API: Added pull review read only endpoints
* Update Structs, move Conversion, Refactor
* refactor
* lint & co
* fix lint + refactor
* add new Review state, rm unessesary, refacotr loadAttributes, convert patch to diff
* add DeletePullReview
* add paggination
* draft1: Create & submit review
* fix lint
* fix lint
* impruve test
* DONT use GhostUser for loadReviewer
* expose comments_count of a PullReview
* infent GetCodeCommentsCount()
* fixes
* fix+impruve
* some nits
* Handle Ghosts :ghost:
* add TEST for GET apis
* complete TESTS
* add HTMLURL to PullReview responce
* code format as per @lafriks
* update swagger definition
* Update routers/api/v1/repo/pull_review.go
Co-authored-by: David Svantesson <davidsvantesson@gmail.com>
* add comments
Co-authored-by: Thomas Berger <loki@lokis-chaos.de>
Co-authored-by: David Svantesson <davidsvantesson@gmail.com>
Diffstat (limited to 'modules/convert')
-rw-r--r-- | modules/convert/pull_review.go | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/modules/convert/pull_review.go b/modules/convert/pull_review.go new file mode 100644 index 0000000000..619f9f070e --- /dev/null +++ b/modules/convert/pull_review.go @@ -0,0 +1,127 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package convert + +import ( + "strings" + + "code.gitea.io/gitea/models" + api "code.gitea.io/gitea/modules/structs" +) + +// ToPullReview convert a review to api format +func ToPullReview(r *models.Review, doer *models.User) (*api.PullReview, error) { + if err := r.LoadAttributes(); err != nil { + if !models.IsErrUserNotExist(err) { + return nil, err + } + r.Reviewer = models.NewGhostUser() + } + + auth := false + if doer != nil { + auth = doer.IsAdmin || doer.ID == r.ReviewerID + } + + result := &api.PullReview{ + ID: r.ID, + Reviewer: ToUser(r.Reviewer, doer != nil, auth), + State: api.ReviewStateUnknown, + Body: r.Content, + CommitID: r.CommitID, + Stale: r.Stale, + Official: r.Official, + CodeCommentsCount: r.GetCodeCommentsCount(), + Submitted: r.CreatedUnix.AsTime(), + HTMLURL: r.HTMLURL(), + HTMLPullURL: r.Issue.HTMLURL(), + } + + switch r.Type { + case models.ReviewTypeApprove: + result.State = api.ReviewStateApproved + case models.ReviewTypeReject: + result.State = api.ReviewStateRequestChanges + case models.ReviewTypeComment: + result.State = api.ReviewStateComment + case models.ReviewTypePending: + result.State = api.ReviewStatePending + case models.ReviewTypeRequest: + result.State = api.ReviewStateRequestReview + } + + return result, nil +} + +// ToPullReviewList convert a list of review to it's api format +func ToPullReviewList(rl []*models.Review, doer *models.User) ([]*api.PullReview, error) { + result := make([]*api.PullReview, 0, len(rl)) + for i := range rl { + // show pending reviews only for the user who created them + if rl[i].Type == models.ReviewTypePending && !(doer.IsAdmin || doer.ID == rl[i].ReviewerID) { + continue + } + r, err := ToPullReview(rl[i], doer) + if err != nil { + return nil, err + } + result = append(result, r) + } + return result, nil +} + +// ToPullReviewCommentList convert the CodeComments of an review to it's api format +func ToPullReviewCommentList(review *models.Review, doer *models.User) ([]*api.PullReviewComment, error) { + if err := review.LoadAttributes(); err != nil { + if !models.IsErrUserNotExist(err) { + return nil, err + } + review.Reviewer = models.NewGhostUser() + } + + apiComments := make([]*api.PullReviewComment, 0, len(review.CodeComments)) + + auth := false + if doer != nil { + auth = doer.IsAdmin || doer.ID == review.ReviewerID + } + + for _, lines := range review.CodeComments { + for _, comments := range lines { + for _, comment := range comments { + apiComment := &api.PullReviewComment{ + ID: comment.ID, + Body: comment.Content, + Reviewer: ToUser(review.Reviewer, doer != nil, auth), + ReviewID: review.ID, + Created: comment.CreatedUnix.AsTime(), + Updated: comment.UpdatedUnix.AsTime(), + Path: comment.TreePath, + CommitID: comment.CommitSHA, + OrigCommitID: comment.OldRef, + DiffHunk: patch2diff(comment.Patch), + HTMLURL: comment.HTMLURL(), + HTMLPullURL: review.Issue.APIURL(), + } + + if comment.Line < 0 { + apiComment.OldLineNum = comment.UnsignedLine() + } else { + apiComment.LineNum = comment.UnsignedLine() + } + apiComments = append(apiComments, apiComment) + } + } + } + return apiComments, nil +} + +func patch2diff(patch string) string { + split := strings.Split(patch, "\n@@") + if len(split) == 2 { + return "@@" + split[1] + } + return "" +} |