Procházet zdrojové kódy

issue_mail: send notifications to participants in comments (#2929)

Unknwon před 8 roky
rodič
revize
23da90e25d
4 změnil soubory, kde provedl 37 přidání a 4 odebrání
  1. 1 1
      gogs.go
  2. 17 0
      models/issue.go
  3. 18 2
      models/issue_mail.go
  4. 1 1
      templates/.VERSION

+ 1 - 1
gogs.go

@@ -16,7 +16,7 @@ import (
 	"github.com/gogits/gogs/modules/setting"
 )
 
-const APP_VER = "0.10.12.0310"
+const APP_VER = "0.10.13.0310"
 
 func init() {
 	setting.AppVer = APP_VER

+ 17 - 0
models/issue.go

@@ -980,6 +980,23 @@ func Issues(opts *IssuesOptions) ([]*Issue, error) {
 	return issues, nil
 }
 
+// GetParticipantsByIssueID returns all users who are participated in comments of an issue.
+func GetParticipantsByIssueID(issueID int64) ([]*User, error) {
+	userIDs := make([]int64, 0, 5)
+	if err := x.Table("comment").Cols("poster_id").
+		Where("issue_id = ?", issueID).
+		Distinct("poster_id").
+		Find(&userIDs); err != nil {
+		return nil, fmt.Errorf("get poster IDs: %v", err)
+	}
+	if len(userIDs) == 0 {
+		return nil, nil
+	}
+
+	users := make([]*User, 0, len(userIDs))
+	return users, x.In("id", userIDs).Find(&users)
+}
+
 // .___                             ____ ___
 // |   | ______ ________ __   ____ |    |   \______ ___________
 // |   |/  ___//  ___/  |  \_/ __ \|    |   /  ___// __ \_  __ \

+ 18 - 2
models/issue_mail.go

@@ -91,15 +91,21 @@ func NewMailerIssue(issue *Issue) mailer.Issue {
 }
 
 // mailIssueCommentToParticipants can be used for both new issue creation and comment.
+// This functions 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.
 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)
+		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)
 	}
 
 	tos := make([]string, 0, len(watchers)) // List of email addresses.
@@ -120,6 +126,16 @@ func mailIssueCommentToParticipants(issue *Issue, doer *User, mentions []string)
 		tos = append(tos, to.Email)
 		names = append(names, to.Name)
 	}
+	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)
+	}
 	mailer.SendIssueCommentMail(NewMailerIssue(issue), NewMailerRepo(issue.Repo), NewMailerUser(doer), tos)
 
 	// Mail mentioned people and exclude watchers.

+ 1 - 1
templates/.VERSION

@@ -1 +1 @@
-0.10.12.0310
+0.10.13.0310