From c97494a4f4a0e8ba5453e293bcebb76274062b99 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Sat, 2 May 2020 02:20:51 +0200 Subject: 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 * add comments Co-authored-by: Thomas Berger Co-authored-by: David Svantesson --- modules/convert/pull_review.go | 127 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 modules/convert/pull_review.go (limited to 'modules/convert') 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 "" +} -- cgit v1.2.3