2016-07-15 19:36:39 +03:00
// 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"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/markdown"
"code.gitea.io/gitea/modules/setting"
2016-07-15 19:36:39 +03:00
)
2016-11-25 11:11:12 +03:00
func ( issue * Issue ) mailSubject ( ) string {
2016-08-14 13:32:24 +03:00
return fmt . Sprintf ( "[%s] %s (#%d)" , issue . Repo . Name , issue . Title , issue . Index )
2016-07-15 19:36:39 +03:00
}
// mailIssueCommentToParticipants can be used for both new issue creation and comment.
2017-03-16 04:34:24 +03:00
// This function sends two list of emails:
// 1. Repository watchers and users who are participated in comments.
// 2. Users who are not in 1. but get mentioned in current issue/comment.
2017-05-25 05:38:56 +03:00
func mailIssueCommentToParticipants ( issue * Issue , doer * User , comment * Comment , mentions [ ] string ) error {
2016-07-15 19:36:39 +03:00
if ! setting . Service . EnableNotifyMail {
return nil
}
watchers , err := GetWatchers ( issue . RepoID )
if err != nil {
2017-03-16 04:34:24 +03:00
return fmt . Errorf ( "GetWatchers [repo_id: %d]: %v" , issue . RepoID , err )
}
participants , err := GetParticipantsByIssueID ( issue . ID )
if err != nil {
return fmt . Errorf ( "GetParticipantsByIssueID [issue_id: %d]: %v" , issue . ID , err )
}
// In case the issue poster is not watching the repository,
// even if we have duplicated in watchers, can be safely filtered out.
if issue . PosterID != doer . ID {
participants = append ( participants , issue . Poster )
2016-07-15 19:36:39 +03:00
}
2017-06-23 16:43:37 +03:00
// Assignee must receive any communications
if issue . Assignee != nil && issue . AssigneeID > 0 && issue . AssigneeID != doer . ID {
participants = append ( participants , issue . Assignee )
}
2016-07-15 19:36:39 +03:00
tos := make ( [ ] string , 0 , len ( watchers ) ) // List of email addresses.
names := make ( [ ] string , 0 , len ( watchers ) )
for i := range watchers {
2016-07-23 20:08:22 +03:00
if watchers [ i ] . UserID == doer . ID {
2016-07-15 19:36:39 +03:00
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 )
}
2017-03-16 04:34:24 +03:00
for i := range participants {
if participants [ i ] . ID == doer . ID {
continue
} else if com . IsSliceContainsStr ( names , participants [ i ] . Name ) {
continue
}
tos = append ( tos , participants [ i ] . Email )
names = append ( names , participants [ i ] . Name )
}
2017-05-25 05:38:56 +03:00
SendIssueCommentMail ( issue , doer , comment , tos )
2016-07-15 19:36:39 +03:00
// 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 ] )
}
2017-05-25 05:38:56 +03:00
SendIssueMentionMail ( issue , doer , comment , GetUserEmailsByNames ( tos ) )
2016-07-15 19:36:39 +03:00
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 )
2016-12-22 12:00:39 +03:00
if err = UpdateIssueMentions ( x , issue . ID , mentions ) ; err != nil {
2016-07-15 19:36:39 +03:00
return fmt . Errorf ( "UpdateIssueMentions [%d]: %v" , issue . ID , err )
}
2017-05-25 05:38:56 +03:00
if err = mailIssueCommentToParticipants ( issue , issue . Poster , nil , mentions ) ; err != nil {
2016-07-15 19:36:39 +03:00
log . Error ( 4 , "mailIssueCommentToParticipants: %v" , err )
}
return nil
}