Consider issue_watchers while sending notifications

This commit is contained in:
Andrey Nering 2017-03-29 20:54:57 -03:00
parent b674460748
commit aa6e949b3d
2 changed files with 43 additions and 9 deletions

View File

@ -58,3 +58,13 @@ func getIssueWatch(e Engine, userID, issueID int64) (iw *IssueWatch, exists bool
Get(iw) Get(iw)
return return
} }
func GetIssueWatchers(issueID int64) ([]*IssueWatch, error) {
return getIssueWatchers(x, issueID)
}
func getIssueWatchers(e Engine, issueID int64) (watches []*IssueWatch, err error) {
err = e.
Where("issue_id = ?", issueID).
Find(&watches)
return
}

View File

@ -96,6 +96,11 @@ func CreateOrUpdateIssueNotifications(issue *Issue, notificationAuthorID int64)
} }
func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthorID int64) error { 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) watches, err := getWatchers(e, issue.RepoID)
if err != nil { if err != nil {
return err return err
@ -106,23 +111,42 @@ func createOrUpdateIssueNotifications(e Engine, issue *Issue, notificationAuthor
return err 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 // do not send notification for the own issuer/commenter
if watch.UserID == notificationAuthorID { if userID == notificationAuthorID {
return nil
}
if _, ok := alreadyNotified[userID]; ok {
return nil
}
alreadyNotified[userID] = struct{}{}
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 continue
} }
if notificationExists(notifications, issue.ID, watch.UserID) { if err := notifyUser(issueWatch.UserID); err != nil {
err = updateIssueNotification(e, watch.UserID, issue.ID, notificationAuthorID)
} else {
err = createIssueNotification(e, watch.UserID, issue, notificationAuthorID)
}
if err != nil {
return err return err
} }
} }
for _, watch := range watches {
if err := notifyUser(watch.UserID); err != nil {
return err
}
}
return nil return nil
} }