diff options
Diffstat (limited to '')
-rw-r--r-- | services/mailer/mail_release.go | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/services/mailer/mail_release.go b/services/mailer/mail_release.go new file mode 100644 index 0000000..0b8b97e --- /dev/null +++ b/services/mailer/mail_release.go @@ -0,0 +1,98 @@ +// Copyright 2020 The Gitea Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package mailer + +import ( + "bytes" + "context" + + repo_model "code.gitea.io/gitea/models/repo" + user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/base" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/markup" + "code.gitea.io/gitea/modules/markup/markdown" + "code.gitea.io/gitea/modules/setting" + "code.gitea.io/gitea/modules/translation" +) + +const ( + tplNewReleaseMail base.TplName = "release" +) + +// MailNewRelease send new release notify to all repo watchers. +func MailNewRelease(ctx context.Context, rel *repo_model.Release) { + if setting.MailService == nil { + // No mail service configured + return + } + + watcherIDList, err := repo_model.GetRepoWatchersIDs(ctx, rel.RepoID) + if err != nil { + log.Error("GetRepoWatchersIDs(%d): %v", rel.RepoID, err) + return + } + + recipients, err := user_model.GetMaileableUsersByIDs(ctx, watcherIDList, false) + if err != nil { + log.Error("user_model.GetMaileableUsersByIDs: %v", err) + return + } + + langMap := make(map[string][]*user_model.User) + for _, user := range recipients { + if user.ID != rel.PublisherID { + langMap[user.Language] = append(langMap[user.Language], user) + } + } + + for lang, tos := range langMap { + mailNewRelease(ctx, lang, tos, rel) + } +} + +func mailNewRelease(ctx context.Context, lang string, tos []*user_model.User, rel *repo_model.Release) { + locale := translation.NewLocale(lang) + + var err error + rel.RenderedNote, err = markdown.RenderString(&markup.RenderContext{ + Ctx: ctx, + Links: markup.Links{ + Base: rel.Repo.HTMLURL(), + }, + Metas: rel.Repo.ComposeMetas(ctx), + }, rel.Note) + if err != nil { + log.Error("markdown.RenderString(%d): %v", rel.RepoID, err) + return + } + + subject := locale.TrString("mail.release.new.subject", rel.TagName, rel.Repo.FullName()) + mailMeta := map[string]any{ + "locale": locale, + "Release": rel, + "Subject": subject, + "Language": locale.Language(), + "Link": rel.HTMLURL(), + } + + 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(tos)) + publisherName := fromDisplayName(rel.Publisher) + msgID := createMessageIDForRelease(rel) + for _, to := range tos { + msg := NewMessageFrom(to.EmailTo(), publisherName, setting.MailService.FromEmail, subject, mailBody.String()) + msg.Info = subject + msg.SetHeader("Message-ID", msgID) + msgs = append(msgs, msg) + } + + SendAsync(msgs...) +} |