diff options
-rw-r--r-- | models/release.go | 1 | ||||
-rw-r--r-- | modules/notification/mail/mail.go | 13 | ||||
-rw-r--r-- | services/mailer/mail_release.go | 69 | ||||
-rw-r--r-- | templates/mail/release.tmpl | 56 |
4 files changed, 139 insertions, 0 deletions
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 @@ +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <title>{{.Subject}}</title> + + <style> + blockquote { padding-left: 1em; margin: 1em 0; border-left: 1px solid grey; color: #777} + .footer { font-size:small; color:#666;} + </style> + +</head> + +<body> + <p><b>@{{.Release.Publisher.Name}}</b> released <a href="{{.Release.HTMLURL}}">{{.Release.TagName}}</a> + in <a href="{{AppUrl}}{{.Release.Repo.OwnerName}}/{{.Release.Repo.Name}}">{{.Release.Repo.FullName}} </p> + <h4>Title: {{.Release.Title}}</h4> + <p> + Note: <br> + {{- if eq .Release.RenderedNote ""}} + {{else}} + {{.Release.RenderedNote | Str2html}} + {{end -}} + </p> + <br><br> + <p> + --- + <br> + Downloads: + <ul> + <li> + <a href="{{AppUrl}}{{.Release.Repo.OwnerName}}/{{.Release.Repo.Name}}/archive/{{.Release.TagName | EscapePound}}.zip" rel="nofollow"><strong> Source Code (ZIP)</strong></a> + </li> + <li> + <a href="{{AppUrl}}{{.Release.Repo.OwnerName}}/{{.Release.Repo.Name}}/archive/{{.Release.TagName | EscapePound}}.tar.gz"><strong> Source Code (TAR.GZ)</strong></a> + </li> + {{if .Release.Attachments}} + {{range .Release.Attachments}} + <li> + <a target="_blank" rel="noopener noreferrer" href="{{.DownloadURL}}"> + <strong>{{.Name}} ({{.Size | FileSize}})</strong> + </a> + </li> + {{end}} + {{end}} + </ul> + </p> + <div class="footer"> + <p> + --- + <br> + <a href="{{.Release.HTMLURL}}">View it on {{AppName}}</a>. + </p> + </div> +</body> +</html> |