diff --git a/models/release.go b/models/release.go index 0c76d17f4b..f55341b86b 100644 --- a/models/release.go +++ b/models/release.go @@ -35,6 +35,7 @@ type Release struct { NumCommits int64 NumCommitsBehind int64 `xorm:"-"` Note string `xorm:"TEXT"` + RenderedNote string `xorm:"-"` IsDraft bool `xorm:"NOT NULL DEFAULT false"` IsPrerelease bool `xorm:"NOT NULL DEFAULT false"` IsTag bool `xorm:"NOT NULL DEFAULT false"` diff --git a/modules/notification/mail/mail.go b/modules/notification/mail/mail.go index 795c8af2c8..9b2c27280f 100644 --- a/modules/notification/mail/mail.go +++ b/modules/notification/mail/mail.go @@ -145,3 +145,16 @@ func (m *mailNotifier) NotifyPullRequestPushCommits(doer *models.User, pr *model m.NotifyCreateIssueComment(doer, comment.Issue.Repo, comment.Issue, comment) } + +func (m *mailNotifier) NotifyNewRelease(rel *models.Release) { + if err := rel.LoadAttributes(); err != nil { + log.Error("NotifyNewRelease: %v", err) + return + } + + if rel.IsDraft || rel.IsPrerelease { + return + } + + mailer.MailNewRelease(rel) +} diff --git a/services/mailer/mail_release.go b/services/mailer/mail_release.go new file mode 100644 index 0000000000..55182f55cf --- /dev/null +++ b/services/mailer/mail_release.go @@ -0,0 +1,69 @@ +// Copyright 2020 The Gitea 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 mailer + +import ( + "bytes" + "fmt" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/setting" +) + +const ( + tplNewReleaseMail base.TplName = "release" +) + +// MailNewRelease send new release notify to all all repo watchers. +func MailNewRelease(rel *models.Release) { + watcherIDList, err := models.GetRepoWatchersIDs(rel.RepoID) + if err != nil { + log.Error("GetRepoWatchersIDs(%d): %v", rel.RepoID, err) + return + } + + recipients, err := models.GetMaileableUsersByIDs(watcherIDList) + if err != nil { + log.Error("models.GetMaileableUsersByIDs: %v", err) + return + } + + tos := make([]string, 0, len(recipients)) + for _, to := range recipients { + if to.ID != rel.PublisherID { + tos = append(tos, to.Email) + } + } + + rel.RenderedNote = markdown.RenderString(rel.Note, rel.Repo.Link(), rel.Repo.ComposeMetas()) + subject := fmt.Sprintf("%s in %s released", rel.TagName, rel.Repo.FullName()) + + mailMeta := map[string]interface{}{ + "Release": rel, + "Subject": subject, + } + + var mailBody bytes.Buffer + + if err = bodyTemplates.ExecuteTemplate(&mailBody, string(tplNewReleaseMail), mailMeta); err != nil { + log.Error("ExecuteTemplate [%s]: %v", string(tplNewReleaseMail)+"/body", err) + return + } + + msgs := make([]*Message, 0, len(recipients)) + publisherName := rel.Publisher.DisplayName() + relURL := "<" + rel.HTMLURL() + ">" + for _, to := range tos { + msg := NewMessageFrom([]string{to}, publisherName, setting.MailService.FromEmail, subject, mailBody.String()) + msg.Info = subject + msg.SetHeader("Message-ID", relURL) + msgs = append(msgs, msg) + } + + SendAsyncs(msgs) +} diff --git a/templates/mail/release.tmpl b/templates/mail/release.tmpl new file mode 100644 index 0000000000..bb0eb17a56 --- /dev/null +++ b/templates/mail/release.tmpl @@ -0,0 +1,56 @@ + + + + + {{.Subject}} + + + + + + +

@{{.Release.Publisher.Name}} released {{.Release.TagName}} + in {{.Release.Repo.FullName}}

+

Title: {{.Release.Title}}

+

+ Note:
+ {{- if eq .Release.RenderedNote ""}} + {{else}} + {{.Release.RenderedNote | Str2html}} + {{end -}} +

+

+

+ --- +
+ Downloads: +

+

+ + +