diff --git a/models/user.go b/models/user.go index 2e5d6473bbd..c7b3f0981e0 100644 --- a/models/user.go +++ b/models/user.go @@ -1419,11 +1419,21 @@ func getUserEmailsByNames(e Engine, names []string) []string { } // GetMaileableUsersByIDs gets users from ids, but only if they can receive mails -func GetMaileableUsersByIDs(ids []int64) ([]*User, error) { +func GetMaileableUsersByIDs(ids []int64, isMention bool) ([]*User, error) { if len(ids) == 0 { return nil, nil } ous := make([]*User, 0, len(ids)) + + if isMention { + return ous, x.In("id", ids). + Where("`type` = ?", UserTypeIndividual). + And("`prohibit_login` = ?", false). + And("`is_active` = ?", true). + And("`email_notifications_preference` IN ( ?, ?)", EmailNotificationsEnabled, EmailNotificationsOnMention). + Find(&ous) + } + return ous, x.In("id", ids). Where("`type` = ?", UserTypeIndividual). And("`prohibit_login` = ?", false). diff --git a/models/user_test.go b/models/user_test.go index 220823ee027..d03ef4fad4d 100644 --- a/models/user_test.go +++ b/models/user_test.go @@ -389,3 +389,20 @@ func TestGetUserIDsByNames(t *testing.T) { assert.Error(t, err) assert.Equal(t, []int64(nil), IDs) } + +func TestGetMaileableUsersByIDs(t *testing.T) { + results, err := GetMaileableUsersByIDs([]int64{1, 4}, false) + assert.NoError(t, err) + assert.Equal(t, 1, len(results)) + if len(results) > 1 { + assert.Equal(t, results[0].ID, 1) + } + + results, err = GetMaileableUsersByIDs([]int64{1, 4}, true) + assert.NoError(t, err) + assert.Equal(t, 2, len(results)) + if len(results) > 2 { + assert.Equal(t, results[0].ID, 1) + assert.Equal(t, results[1].ID, 4) + } +} diff --git a/services/mailer/mail_issue.go b/services/mailer/mail_issue.go index 1030a9548e6..01c198984b5 100644 --- a/services/mailer/mail_issue.go +++ b/services/mailer/mail_issue.go @@ -118,7 +118,7 @@ func mailIssueCommentBatch(ctx *mailCommentContext, ids []int64, visited map[int visited[id] = true } } - recipients, err := models.GetMaileableUsersByIDs(unique) + recipients, err := models.GetMaileableUsersByIDs(unique, fromMention) if err != nil { return err } diff --git a/services/mailer/mail_release.go b/services/mailer/mail_release.go index 55182f55cf5..f278c853aeb 100644 --- a/services/mailer/mail_release.go +++ b/services/mailer/mail_release.go @@ -27,7 +27,7 @@ func MailNewRelease(rel *models.Release) { return } - recipients, err := models.GetMaileableUsersByIDs(watcherIDList) + recipients, err := models.GetMaileableUsersByIDs(watcherIDList, false) if err != nil { log.Error("models.GetMaileableUsersByIDs: %v", err) return