From c0f5111fea0b742a60113e1bda81bf39607d6ca8 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 19 Jul 2022 15:20:28 +0200 Subject: [PATCH] Dismiss prior pull reviews if done via web in review dismiss (#20197) --- models/issues/review.go | 30 ++++++++++++++++++++++++++++++ modules/structs/pull_review.go | 1 + routers/api/v1/repo/pull_review.go | 8 ++++---- routers/web/repo/pull_review.go | 2 +- services/pull/review.go | 19 ++++++++++++++++++- templates/swagger/v1_json.tmpl | 4 ++++ 6 files changed, 58 insertions(+), 6 deletions(-) diff --git a/models/issues/review.go b/models/issues/review.go index 1cb99dc337..5835900801 100644 --- a/models/issues/review.go +++ b/models/issues/review.go @@ -19,6 +19,7 @@ import ( "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/structs" "code.gitea.io/gitea/modules/timeutil" + "code.gitea.io/gitea/modules/util" "xorm.io/builder" ) @@ -474,6 +475,35 @@ func SubmitReview(doer *user_model.User, issue *Issue, reviewType ReviewType, co return review, comm, committer.Commit() } +// GetReviewOptions represent filter options for GetReviews +type GetReviewOptions struct { + IssueID int64 + ReviewerID int64 + Dismissed util.OptionalBool +} + +// GetReviews return reviews based on GetReviewOptions +func GetReviews(ctx context.Context, opts *GetReviewOptions) ([]*Review, error) { + if opts == nil { + return nil, fmt.Errorf("opts are nil") + } + + sess := db.GetEngine(ctx) + + if opts.IssueID != 0 { + sess = sess.Where("issue_id=?", opts.IssueID) + } + if opts.ReviewerID != 0 { + sess = sess.Where("reviewer_id=?", opts.ReviewerID) + } + if !opts.Dismissed.IsNone() { + sess = sess.Where("dismissed=?", opts.Dismissed.IsTrue()) + } + + reviews := make([]*Review, 0, 4) + return reviews, sess.Find(&reviews) +} + // GetReviewersByIssueID gets the latest review of each reviewer for a pull request func GetReviewersByIssueID(issueID int64) ([]*Review, error) { reviews := make([]*Review, 0, 10) diff --git a/modules/structs/pull_review.go b/modules/structs/pull_review.go index 6544604acb..7c9360a0c2 100644 --- a/modules/structs/pull_review.go +++ b/modules/structs/pull_review.go @@ -97,6 +97,7 @@ type SubmitPullReviewOptions struct { // DismissPullReviewOptions are options to dismiss a pull review type DismissPullReviewOptions struct { Message string `json:"message"` + Priors bool `json:"priors"` } // PullReviewRequestOptions are options to add or remove pull review requests diff --git a/routers/api/v1/repo/pull_review.go b/routers/api/v1/repo/pull_review.go index 1b61a40222..f36d0586ab 100644 --- a/routers/api/v1/repo/pull_review.go +++ b/routers/api/v1/repo/pull_review.go @@ -823,7 +823,7 @@ func DismissPullReview(ctx *context.APIContext) { // "422": // "$ref": "#/responses/validationError" opts := web.GetForm(ctx).(*api.DismissPullReviewOptions) - dismissReview(ctx, opts.Message, true) + dismissReview(ctx, opts.Message, true, opts.Priors) } // UnDismissPullReview cancel to dismiss a review for a pull request @@ -863,10 +863,10 @@ func UnDismissPullReview(ctx *context.APIContext) { // "$ref": "#/responses/forbidden" // "422": // "$ref": "#/responses/validationError" - dismissReview(ctx, "", false) + dismissReview(ctx, "", false, false) } -func dismissReview(ctx *context.APIContext, msg string, isDismiss bool) { +func dismissReview(ctx *context.APIContext, msg string, isDismiss, dismissPriors bool) { if !ctx.Repo.IsAdmin() { ctx.Error(http.StatusForbidden, "", "Must be repo admin") return @@ -886,7 +886,7 @@ func dismissReview(ctx *context.APIContext, msg string, isDismiss bool) { return } - _, err := pull_service.DismissReview(ctx, review.ID, ctx.Repo.Repository.ID, msg, ctx.Doer, isDismiss) + _, err := pull_service.DismissReview(ctx, review.ID, ctx.Repo.Repository.ID, msg, ctx.Doer, isDismiss, dismissPriors) if err != nil { ctx.Error(http.StatusInternalServerError, "pull_service.DismissReview", err) return diff --git a/routers/web/repo/pull_review.go b/routers/web/repo/pull_review.go index 5a9f7a8138..bc64f35472 100644 --- a/routers/web/repo/pull_review.go +++ b/routers/web/repo/pull_review.go @@ -242,7 +242,7 @@ func SubmitReview(ctx *context.Context) { // DismissReview dismissing stale review by repo admin func DismissReview(ctx *context.Context) { form := web.GetForm(ctx).(*forms.DismissReviewForm) - comm, err := pull_service.DismissReview(ctx, form.ReviewID, ctx.Repo.Repository.ID, form.Message, ctx.Doer, true) + comm, err := pull_service.DismissReview(ctx, form.ReviewID, ctx.Repo.Repository.ID, form.Message, ctx.Doer, true, true) if err != nil { ctx.ServerError("pull_service.DismissReview", err) return diff --git a/services/pull/review.go b/services/pull/review.go index 22e0ae9853..8d8903c6a9 100644 --- a/services/pull/review.go +++ b/services/pull/review.go @@ -20,6 +20,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/notification" "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/util" ) // CreateCodeComment creates a comment on the code line @@ -271,7 +272,7 @@ func SubmitReview(ctx context.Context, doer *user_model.User, gitRepo *git.Repos } // DismissReview dismissing stale review by repo admin -func DismissReview(ctx context.Context, reviewID, repoID int64, message string, doer *user_model.User, isDismiss bool) (comment *issues_model.Comment, err error) { +func DismissReview(ctx context.Context, reviewID, repoID int64, message string, doer *user_model.User, isDismiss, dismissPriors bool) (comment *issues_model.Comment, err error) { review, err := issues_model.GetReviewByID(ctx, reviewID) if err != nil { return @@ -295,6 +296,22 @@ func DismissReview(ctx context.Context, reviewID, repoID int64, message string, return } + if dismissPriors { + reviews, err := issues_model.GetReviews(ctx, &issues_model.GetReviewOptions{ + IssueID: review.IssueID, + ReviewerID: review.ReviewerID, + Dismissed: util.OptionalBoolFalse, + }) + if err != nil { + return nil, err + } + for _, oldReview := range reviews { + if err = issues_model.DismissReview(oldReview, true); err != nil { + return nil, err + } + } + } + if !isDismiss { return nil, nil } diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index a3bb904845..ff0b4c6468 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -14864,6 +14864,10 @@ "message": { "type": "string", "x-go-name": "Message" + }, + "priors": { + "type": "boolean", + "x-go-name": "Priors" } }, "x-go-package": "code.gitea.io/gitea/modules/structs"