diff options
author | Unknwon <u@gogs.io> | 2016-07-16 00:36:39 +0800 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2016-07-16 00:36:39 +0800 |
commit | f1b8d52eb3ac230ed5a275f4a844ddb0cf48041e (patch) | |
tree | 51dda05a9fb7a985a4e91f3e1708ffddf3fee19c /models/issue_mail.go | |
parent | 7ca5f8f119593023809e6130db75154597c52426 (diff) | |
download | gitea-f1b8d52eb3ac230ed5a275f4a844ddb0cf48041e.tar.gz gitea-f1b8d52eb3ac230ed5a275f4a844ddb0cf48041e.zip |
#2854 fix no mail notification when issue is closed/reopened
Diffstat (limited to 'models/issue_mail.go')
-rw-r--r-- | models/issue_mail.go | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/models/issue_mail.go b/models/issue_mail.go new file mode 100644 index 0000000000..3260de271c --- /dev/null +++ b/models/issue_mail.go @@ -0,0 +1,81 @@ +// Copyright 2016 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package models + +import ( + "fmt" + + "github.com/Unknwon/com" + + "github.com/gogits/gogs/modules/log" + "github.com/gogits/gogs/modules/markdown" + "github.com/gogits/gogs/modules/setting" +) + +func (issue *Issue) MailSubject() string { + return fmt.Sprintf("[%s] %s (#%d)", issue.Repo.Name, issue.Name, issue.Index) +} + +// mailIssueCommentToParticipants can be used for both new issue creation and comment. +func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string) error { + if !setting.Service.EnableNotifyMail { + return nil + } + + // Mail wahtcers. + watchers, err := GetWatchers(issue.RepoID) + if err != nil { + return fmt.Errorf("GetWatchers [%d]: %v", issue.RepoID, err) + } + + tos := make([]string, 0, len(watchers)) // List of email addresses. + names := make([]string, 0, len(watchers)) + for i := range watchers { + if watchers[i].UserID == doer.Id { + continue + } + + to, err := GetUserByID(watchers[i].UserID) + if err != nil { + return fmt.Errorf("GetUserByID [%d]: %v", watchers[i].UserID, err) + } + if to.IsOrganization() { + continue + } + + tos = append(tos, to.Email) + names = append(names, to.Name) + } + SendIssueCommentMail(issue, doer, tos) + + // Mail mentioned people and exclude watchers. + names = append(names, doer.Name) + tos = make([]string, 0, len(mentions)) // list of user names. + for i := range mentions { + if com.IsSliceContainsStr(names, mentions[i]) { + continue + } + + tos = append(tos, mentions[i]) + } + SendIssueMentionMail(issue, doer, GetUserEmailsByNames(tos)) + + return nil +} + +// MailParticipants sends new issue thread created emails to repository watchers +// and mentioned people. +func (issue *Issue) MailParticipants() (err error) { + mentions := markdown.FindAllMentions(issue.Content) + if err = UpdateIssueMentions(issue.ID, mentions); err != nil { + return fmt.Errorf("UpdateIssueMentions [%d]: %v", issue.ID, err) + } + + if err = mailIssueCommentToParticipants(issue, issue.Poster, mentions); err != nil { + log.Error(4, "mailIssueCommentToParticipants: %v", err) + } + + return nil +} |