diff --git a/app/api/controller/pullreq/reviewer_add.go b/app/api/controller/pullreq/reviewer_add.go index f16aee9a0..b8653026e 100644 --- a/app/api/controller/pullreq/reviewer_add.go +++ b/app/api/controller/pullreq/reviewer_add.go @@ -98,6 +98,7 @@ func (c *Controller) ReviewerAdd( } var reviewer *types.PullReqReviewer + var added bool err = c.tx.WithTx(ctx, func(ctx context.Context) error { reviewer, err = c.reviewerStore.Find(ctx, pr.ID, in.ReviewerID) @@ -110,6 +111,7 @@ func (c *Controller) ReviewerAdd( } reviewer = newPullReqReviewer(session, pr, repo, reviewerInfo, addedByInfo, reviewerType, in) + added = true return c.reviewerStore.Create(ctx, reviewer) }) @@ -117,8 +119,38 @@ func (c *Controller) ReviewerAdd( return nil, fmt.Errorf("failed to create pull request reviewer: %w", err) } + if !added { + return reviewer, nil + } + + err = func() error { + payload := &types.PullRequestActivityPayloadReviewerAdd{ + PrincipalID: reviewer.PrincipalID, + ReviewerType: reviewerType, + } + + metadata := &types.PullReqActivityMetadata{ + Mentions: &types.PullReqActivityMentionsMetadata{IDs: []int64{reviewer.PrincipalID}}, + } + + if pr, err = c.pullreqStore.UpdateActivitySeq(ctx, pr); err != nil { + return fmt.Errorf("failed to increment pull request activity sequence: %w", err) + } + + _, err = c.activityStore.CreateWithPayload(ctx, pr, session.Principal.ID, payload, metadata) + if err != nil { + return fmt.Errorf("failed to create pull request activity: %w", err) + } + + return nil + }() + if err != nil { + log.Ctx(ctx).Err(err).Msg("failed to write pull request activity after adding a reviewer") + } + c.reportReviewerAddition(ctx, session, pr, reviewer) - return reviewer, err + + return reviewer, nil } func (c *Controller) reportReviewerAddition( @@ -134,9 +166,11 @@ func (c *Controller) reportReviewerAddition( } // newPullReqReviewer creates new pull request reviewer object. -func newPullReqReviewer(session *auth.Session, pullReq *types.PullReq, +func newPullReqReviewer( + session *auth.Session, pullReq *types.PullReq, repo *types.Repository, reviewerInfo, addedByInfo *types.PrincipalInfo, - reviewerType enum.PullReqReviewerType, in *ReviewerAddInput) *types.PullReqReviewer { + reviewerType enum.PullReqReviewerType, in *ReviewerAddInput, +) *types.PullReqReviewer { now := time.Now().UnixMilli() return &types.PullReqReviewer{ PullReqID: pullReq.ID, diff --git a/app/api/controller/pullreq/reviewer_delete.go b/app/api/controller/pullreq/reviewer_delete.go index be6cdfe15..202add6e7 100644 --- a/app/api/controller/pullreq/reviewer_delete.go +++ b/app/api/controller/pullreq/reviewer_delete.go @@ -74,27 +74,22 @@ func (c *Controller) ReviewerDelete( return fmt.Errorf("failed to delete reviewer: %w", err) } - if reviewer.ReviewDecision == enum.PullReqReviewDecisionPending { - // We create a pull request activity entry only if a review has actually been submitted. - return nil - } - - activityPayload := &types.PullRequestActivityPayloadReviewerDelete{ - CommitSHA: reviewer.SHA, - Decision: reviewer.ReviewDecision, - PrincipalID: reviewer.PrincipalID, - } - - metadata := &types.PullReqActivityMetadata{ - Mentions: &types.PullReqActivityMentionsMetadata{IDs: []int64{reviewer.PrincipalID}}, - } - err = func() error { + payload := &types.PullRequestActivityPayloadReviewerDelete{ + CommitSHA: reviewer.SHA, + Decision: reviewer.ReviewDecision, + PrincipalID: reviewer.PrincipalID, + } + + metadata := &types.PullReqActivityMetadata{ + Mentions: &types.PullReqActivityMentionsMetadata{IDs: []int64{reviewer.PrincipalID}}, + } + if pr, err = c.pullreqStore.UpdateActivitySeq(ctx, pr); err != nil { return fmt.Errorf("failed to increment pull request activity sequence: %w", err) } - _, err = c.activityStore.CreateWithPayload(ctx, pr, session.Principal.ID, activityPayload, metadata) + _, err = c.activityStore.CreateWithPayload(ctx, pr, session.Principal.ID, payload, metadata) if err != nil { return fmt.Errorf("failed to create pull request activity: %w", err) } @@ -103,7 +98,7 @@ func (c *Controller) ReviewerDelete( }() if err != nil { // non-critical error - log.Ctx(ctx).Err(err).Msgf("failed to write pull request activity after reviewer removal") + log.Ctx(ctx).Err(err).Msg("failed to write pull request activity after reviewer removal") } return nil diff --git a/types/enum/pullreq.go b/types/enum/pullreq.go index e59685dd4..d3b4d9b0c 100644 --- a/types/enum/pullreq.go +++ b/types/enum/pullreq.go @@ -83,6 +83,7 @@ const ( PullReqActivityTypeTitleChange PullReqActivityType = "title-change" PullReqActivityTypeStateChange PullReqActivityType = "state-change" PullReqActivityTypeReviewSubmit PullReqActivityType = "review-submit" + PullReqActivityTypeReviewerAdd PullReqActivityType = "reviewer-add" PullReqActivityTypeReviewerDelete PullReqActivityType = "reviewer-delete" PullReqActivityTypeBranchUpdate PullReqActivityType = "branch-update" PullReqActivityTypeBranchDelete PullReqActivityType = "branch-delete" diff --git a/types/pullreq_activity_payload.go b/types/pullreq_activity_payload.go index c843f4428..b104c26fd 100644 --- a/types/pullreq_activity_payload.go +++ b/types/pullreq_activity_payload.go @@ -130,6 +130,15 @@ func (a *PullRequestActivityPayloadReviewSubmit) ActivityType() enum.PullReqActi return enum.PullReqActivityTypeReviewSubmit } +type PullRequestActivityPayloadReviewerAdd struct { + PrincipalID int64 `json:"principal_id"` + ReviewerType enum.PullReqReviewerType `json:"reviewer_type"` +} + +func (a *PullRequestActivityPayloadReviewerAdd) ActivityType() enum.PullReqActivityType { + return enum.PullReqActivityTypeReviewerAdd +} + type PullRequestActivityPayloadReviewerDelete struct { CommitSHA string `json:"commit_sha"` Decision enum.PullReqReviewDecision `json:"decision"`