From c1a3d4fefbbbf332cd1cedda66e93bf40cc9713d Mon Sep 17 00:00:00 2001
From: Unknown <joe2010xtmf@163.com>
Date: Tue, 25 Mar 2014 21:37:18 -0400
Subject: [PATCH] Add mail notify for creating issue

---
 gogs.go                  |  2 +-
 models/issue.go          |  1 -
 modules/mailer/mail.go   | 40 ++++++++++++++++++++++++++++++++++++++--
 modules/mailer/mailer.go |  2 +-
 routers/repo/issue.go    |  9 +++++++++
 5 files changed, 49 insertions(+), 5 deletions(-)

diff --git a/gogs.go b/gogs.go
index b62580f8fd..f5a328add9 100644
--- a/gogs.go
+++ b/gogs.go
@@ -19,7 +19,7 @@ import (
 // Test that go1.2 tag above is included in builds. main.go refers to this definition.
 const go12tag = true
 
-const APP_VER = "0.1.7.0325"
+const APP_VER = "0.1.8.0325"
 
 func init() {
 	base.AppVer = APP_VER
diff --git a/models/issue.go b/models/issue.go
index 2bdd083d90..2de6568589 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -59,7 +59,6 @@ func CreateIssue(userId, repoId, milestoneId, assigneeId int64, name, labels, co
 		Content:     content,
 	}
 	_, err = orm.Insert(issue)
-	// TODO: newIssueAction
 	return issue, err
 }
 
diff --git a/modules/mailer/mail.go b/modules/mailer/mail.go
index 92acd20efb..d0decbe068 100644
--- a/modules/mailer/mail.go
+++ b/modules/mailer/mail.go
@@ -6,6 +6,7 @@ package mailer
 
 import (
 	"encoding/hex"
+	"errors"
 	"fmt"
 
 	"github.com/gogits/gogs/models"
@@ -15,12 +16,17 @@ import (
 )
 
 // Create New mail message use MailFrom and MailUser
-func NewMailMessage(To []string, subject, body string) Message {
-	msg := NewHtmlMessage(To, base.MailService.User, subject, body)
+func NewMailMessageFrom(To []string, from, subject, body string) Message {
+	msg := NewHtmlMessage(To, from, subject, body)
 	msg.User = base.MailService.User
 	return msg
 }
 
+// Create New mail message use MailFrom and MailUser
+func NewMailMessage(To []string, subject, body string) Message {
+	return NewMailMessageFrom(To, base.MailService.User, subject, body)
+}
+
 func GetMailTmplData(user *models.User) map[interface{}]interface{} {
 	data := make(map[interface{}]interface{}, 10)
 	data["AppName"] = base.AppName
@@ -84,3 +90,33 @@ func SendActiveMail(r *middleware.Render, user *models.User) {
 
 	SendAsync(&msg)
 }
+
+// SendNotifyMail sends mail notification of all watchers.
+func SendNotifyMail(userId, repoId int64, userName, repoName, subject, content string) error {
+	watches, err := models.GetWatches(repoId)
+	if err != nil {
+		return errors.New("mail.NotifyWatchers(get watches): " + err.Error())
+	}
+
+	tos := make([]string, 0, len(watches))
+	for i := range watches {
+		uid := watches[i].UserId
+		if userId == uid {
+			continue
+		}
+		u, err := models.GetUserById(uid)
+		if err != nil {
+			return errors.New("mail.NotifyWatchers(get user): " + err.Error())
+		}
+		tos = append(tos, u.Email)
+	}
+
+	if len(tos) == 0 {
+		return nil
+	}
+
+	msg := NewMailMessageFrom(tos, userName, subject, content)
+	msg.Info = fmt.Sprintf("Subject: %s, send notify emails", subject)
+	SendAsync(&msg)
+	return nil
+}
diff --git a/modules/mailer/mailer.go b/modules/mailer/mailer.go
index da63e01d2a..63861d870e 100644
--- a/modules/mailer/mailer.go
+++ b/modules/mailer/mailer.go
@@ -33,7 +33,7 @@ func (m Message) Content() string {
 	}
 
 	// create mail content
-	content := "From: " + m.User + "<" + m.From +
+	content := "From: " + m.From + "<" + m.User +
 		">\r\nSubject: " + m.Subject + "\r\nContent-Type: " + contentType + "\r\n\r\n" + m.Body
 	return content
 }
diff --git a/routers/repo/issue.go b/routers/repo/issue.go
index fc5bb98643..242593ff29 100644
--- a/routers/repo/issue.go
+++ b/routers/repo/issue.go
@@ -13,6 +13,7 @@ import (
 	"github.com/gogits/gogs/modules/auth"
 	"github.com/gogits/gogs/modules/base"
 	"github.com/gogits/gogs/modules/log"
+	"github.com/gogits/gogs/modules/mailer"
 	"github.com/gogits/gogs/modules/middleware"
 )
 
@@ -86,6 +87,14 @@ func CreateIssue(ctx *middleware.Context, params martini.Params, form auth.Creat
 		return
 	}
 
+	// Mail watchers.
+	if base.Service.NotifyMail {
+		if err = mailer.SendNotifyMail(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.Name, ctx.Repo.Repository.Name, issue.Name, issue.Content); err != nil {
+			ctx.Handle(200, "issue.CreateIssue", err)
+			return
+		}
+	}
+
 	log.Trace("%d Issue created: %d", ctx.Repo.Repository.Id, issue.Id)
 	ctx.Redirect(fmt.Sprintf("/%s/%s/issues/%d", params["username"], params["reponame"], issue.Index))
 }