diff --git a/models/repo_watch.go b/models/repo_watch.go index cb864fb46..2de4f8b32 100644 --- a/models/repo_watch.go +++ b/models/repo_watch.go @@ -216,6 +216,21 @@ func NotifyWatchers(act *Action) error { return notifyWatchers(x, act) } +// NotifyWatchersActions creates batch of actions for every watcher. +func NotifyWatchersActions(acts []*Action) error { + sess := x.NewSession() + defer sess.Close() + if err := sess.Begin(); err != nil { + return err + } + for _, act := range acts { + if err := notifyWatchers(sess, act); err != nil { + return err + } + } + return sess.Commit() +} + func watchIfAuto(e Engine, userID, repoID int64, isWrite bool) error { if !isWrite || !setting.Service.AutoWatchOnChanges { return nil diff --git a/models/review.go b/models/review.go index 824184550..ede2ebd32 100644 --- a/models/review.go +++ b/models/review.go @@ -226,6 +226,7 @@ func GetCurrentReview(reviewer *User, issue *Issue) (*Review, error) { return getCurrentReview(x, reviewer, issue) } +// ContentEmptyErr represents an content empty error type ContentEmptyErr struct { } @@ -233,6 +234,7 @@ func (ContentEmptyErr) Error() string { return "Review content is empty" } +// IsContentEmptyErr returns true if err is a ContentEmptyErr func IsContentEmptyErr(err error) bool { _, ok := err.(ContentEmptyErr) return ok diff --git a/modules/notification/action/action.go b/modules/notification/action/action.go index 580ea5582..6a81e6af8 100644 --- a/modules/notification/action/action.go +++ b/modules/notification/action/action.go @@ -130,19 +130,26 @@ func (a *actionNotifier) NotifyPullRequestReview(pr *models.PullRequest, review return } + var actions = make([]*models.Action, 0, 10) for _, lines := range review.CodeComments { for _, comments := range lines { - for _, comment := range comments { - // TODO: how to handle??? - /*if err := sendCreateCommentAction(sess, opts, comm); err != nil { - log.Warn("sendCreateCommentAction: %v", err) - }*/ - content += "\n" + comment.Content + for _, comm := range comments { + actions = append(actions, &models.Action{ + ActUserID: review.Reviewer.ID, + ActUser: review.Reviewer, + Content: fmt.Sprintf("%d|%s", review.Issue.Index, strings.Split(content, "\n")[0]), + OpType: models.ActionCommentIssue, + RepoID: review.Issue.RepoID, + Repo: review.Issue.Repo, + IsPrivate: review.Issue.Repo.IsPrivate, + Comment: comm, + CommentID: comm.ID, + }) } } } - if err := models.NotifyWatchers(&models.Action{ + actions = append(actions, &models.Action{ ActUserID: review.Reviewer.ID, ActUser: review.Reviewer, Content: fmt.Sprintf("%d|%s", review.Issue.Index, strings.Split(content, "\n")[0]), @@ -152,7 +159,9 @@ func (a *actionNotifier) NotifyPullRequestReview(pr *models.PullRequest, review IsPrivate: review.Issue.Repo.IsPrivate, Comment: comment, CommentID: comment.ID, - }); err != nil { + }) + + if err := models.NotifyWatchersActions(actions); err != nil { log.Error("notify watchers '%d/%d': %v", review.Reviewer.ID, review.Issue.RepoID, err) } }