summaryrefslogtreecommitdiffstats
path: root/models/notification.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/notification.go')
-rw-r--r--models/notification.go77
1 files changed, 43 insertions, 34 deletions
diff --git a/models/notification.go b/models/notification.go
index 0cee8616ca..8d74ac129f 100644
--- a/models/notification.go
+++ b/models/notification.go
@@ -118,64 +118,73 @@ func GetNotifications(opts FindNotificationOptions) (NotificationList, error) {
// CreateOrUpdateIssueNotifications creates an issue notification
// for each watcher, or updates it if already exists
-func CreateOrUpdateIssueNotifications(issueID, commentID int64, notificationAuthorID int64) error {
+// receiverID > 0 just send to reciver, else send to all watcher
+func CreateOrUpdateIssueNotifications(issueID, commentID, notificationAuthorID, receiverID int64) error {
sess := x.NewSession()
defer sess.Close()
if err := sess.Begin(); err != nil {
return err
}
- if err := createOrUpdateIssueNotifications(sess, issueID, commentID, notificationAuthorID); err != nil {
+ if err := createOrUpdateIssueNotifications(sess, issueID, commentID, notificationAuthorID, receiverID); err != nil {
return err
}
return sess.Commit()
}
-func createOrUpdateIssueNotifications(e Engine, issueID, commentID int64, notificationAuthorID int64) error {
+func createOrUpdateIssueNotifications(e Engine, issueID, commentID, notificationAuthorID, receiverID int64) error {
// init
- toNotify := make(map[int64]struct{}, 32)
+ var toNotify map[int64]struct{}
notifications, err := getNotificationsByIssueID(e, issueID)
+
if err != nil {
return err
}
+
issue, err := getIssueByID(e, issueID)
if err != nil {
return err
}
- issueWatches, err := getIssueWatchersIDs(e, issueID, true)
- if err != nil {
- return err
- }
- for _, id := range issueWatches {
- toNotify[id] = struct{}{}
- }
+ if receiverID > 0 {
+ toNotify = make(map[int64]struct{}, 1)
+ toNotify[receiverID] = struct{}{}
+ } else {
+ toNotify = make(map[int64]struct{}, 32)
+ issueWatches, err := getIssueWatchersIDs(e, issueID, true)
+ if err != nil {
+ return err
+ }
+ for _, id := range issueWatches {
+ toNotify[id] = struct{}{}
+ }
- repoWatches, err := getRepoWatchersIDs(e, issue.RepoID)
- if err != nil {
- return err
- }
- for _, id := range repoWatches {
- toNotify[id] = struct{}{}
- }
- issueParticipants, err := issue.getParticipantIDsByIssue(e)
- if err != nil {
- return err
- }
- for _, id := range issueParticipants {
- toNotify[id] = struct{}{}
- }
+ repoWatches, err := getRepoWatchersIDs(e, issue.RepoID)
+ if err != nil {
+ return err
+ }
+ for _, id := range repoWatches {
+ toNotify[id] = struct{}{}
+ }
+ issueParticipants, err := issue.getParticipantIDsByIssue(e)
+ if err != nil {
+ return err
+ }
+ for _, id := range issueParticipants {
+ toNotify[id] = struct{}{}
+ }
- // dont notify user who cause notification
- delete(toNotify, notificationAuthorID)
- // explicit unwatch on issue
- issueUnWatches, err := getIssueWatchersIDs(e, issueID, false)
- if err != nil {
- return err
- }
- for _, id := range issueUnWatches {
- delete(toNotify, id)
+ // dont notify user who cause notification
+ delete(toNotify, notificationAuthorID)
+ // explicit unwatch on issue
+ issueUnWatches, err := getIssueWatchersIDs(e, issueID, false)
+ if err != nil {
+ return err
+ }
+ for _, id := range issueUnWatches {
+ delete(toNotify, id)
+ }
}
err = issue.loadRepo(e)