summaryrefslogtreecommitdiffstats
path: root/models/notification.go
diff options
context:
space:
mode:
authorAndrey Nering <andrey.nering@gmail.com>2017-03-29 20:54:57 -0300
committerAndrey Nering <andrey.nering@gmail.com>2017-03-29 20:54:57 -0300
commitaa6e949b3de11e675311e54b59e027cd82a230f4 (patch)
treeb56c680bdcef1ea367742a437d114c422394aa84 /models/notification.go
parentb6744607484008826d18f129326664105b9d7bfc (diff)
downloadgitea-aa6e949b3de11e675311e54b59e027cd82a230f4.tar.gz
gitea-aa6e949b3de11e675311e54b59e027cd82a230f4.zip
Consider issue_watchers while sending notifications
Diffstat (limited to 'models/notification.go')
-rw-r--r--models/notification.go40
1 files changed, 32 insertions, 8 deletions
diff --git a/models/notification.go b/models/notification.go
index bba662c06c..a59c6f1401 100644
--- a/models/notification.go
+++ b/models/notification.go
@@ -96,6 +96,11 @@ func CreateOrUpdateIssueNotifications(issue *Issue, notificationAuthorID int64)
}
func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthorID int64) error {
+ issueWatches, err := getIssueWatchers(e, issue.ID)
+ if err != nil {
+ return err
+ }
+
watches, err := getWatchers(e, issue.RepoID)
if err != nil {
return err
@@ -106,23 +111,42 @@ func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthor
return err
}
- for _, watch := range watches {
+ alreadyNotified := make(map[int64]struct{}, len(issueWatches)+len(watches))
+
+ notifyUser := func(userID int64) error {
// do not send notification for the own issuer/commenter
- if watch.UserID == notificationAuthorID {
- continue
+ if userID == notificationAuthorID {
+ return nil
}
- if notificationExists(notifications, issue.ID, watch.UserID) {
- err = updateIssueNotification(e, watch.UserID, issue.ID, notificationAuthorID)
- } else {
- err = createIssueNotification(e, watch.UserID, issue, notificationAuthorID)
+ if _, ok := alreadyNotified[userID]; ok {
+ return nil
}
+ alreadyNotified[userID] = struct{}{}
- if err != nil {
+ if notificationExists(notifications, issue.ID, userID) {
+ return updateIssueNotification(e, userID, issue.ID, notificationAuthorID)
+ }
+ return createIssueNotification(e, userID, issue, notificationAuthorID)
+ }
+
+ for _, issueWatch := range issueWatches {
+ // ignore if user unwatched the issue
+ if !issueWatch.IsWatching {
+ alreadyNotified[issueWatch.UserID] = struct{}{}
+ continue
+ }
+
+ if err := notifyUser(issueWatch.UserID); err != nil {
return err
}
}
+ for _, watch := range watches {
+ if err := notifyUser(watch.UserID); err != nil {
+ return err
+ }
+ }
return nil
}