2020-08-23 23:03:18 +08:00
// 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"
2022-01-19 23:26:57 +00:00
"context"
2020-08-23 23:03:18 +08:00
"code.gitea.io/gitea/models"
2021-12-12 23:48:20 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 17:49:20 +08:00
user_model "code.gitea.io/gitea/models/user"
2020-08-23 23:03:18 +08:00
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/log"
2021-04-20 06:25:08 +08:00
"code.gitea.io/gitea/modules/markup"
2020-08-23 23:03:18 +08:00
"code.gitea.io/gitea/modules/markup/markdown"
"code.gitea.io/gitea/modules/setting"
2021-06-23 14:33:21 +02:00
"code.gitea.io/gitea/modules/templates"
2021-04-02 12:25:13 +02:00
"code.gitea.io/gitea/modules/translation"
2020-08-23 23:03:18 +08:00
)
const (
tplNewReleaseMail base . TplName = "release"
)
// MailNewRelease send new release notify to all all repo watchers.
2022-01-19 23:26:57 +00:00
func MailNewRelease ( ctx context . Context , rel * models . Release ) {
2021-08-12 08:26:33 +01:00
if setting . MailService == nil {
// No mail service configured
return
}
2022-03-22 23:22:54 +08:00
watcherIDList , err := repo_model . GetRepoWatchersIDs ( ctx , rel . RepoID )
2020-08-23 23:03:18 +08:00
if err != nil {
log . Error ( "GetRepoWatchersIDs(%d): %v" , rel . RepoID , err )
return
}
2021-11-24 17:49:20 +08:00
recipients , err := user_model . GetMaileableUsersByIDs ( watcherIDList , false )
2020-08-23 23:03:18 +08:00
if err != nil {
2021-11-24 17:49:20 +08:00
log . Error ( "user_model.GetMaileableUsersByIDs: %v" , err )
2020-08-23 23:03:18 +08:00
return
}
2021-04-02 12:25:13 +02:00
langMap := make ( map [ string ] [ ] string )
for _ , user := range recipients {
if user . ID != rel . PublisherID {
langMap [ user . Language ] = append ( langMap [ user . Language ] , user . Email )
2020-08-23 23:03:18 +08:00
}
}
2021-04-02 12:25:13 +02:00
for lang , tos := range langMap {
2022-01-19 23:26:57 +00:00
mailNewRelease ( ctx , lang , tos , rel )
2021-04-02 12:25:13 +02:00
}
}
2022-01-19 23:26:57 +00:00
func mailNewRelease ( ctx context . Context , lang string , tos [ ] string , rel * models . Release ) {
2021-04-02 12:25:13 +02:00
locale := translation . NewLocale ( lang )
2021-04-20 06:25:08 +08:00
var err error
rel . RenderedNote , err = markdown . RenderString ( & markup . RenderContext {
2022-01-19 23:26:57 +00:00
Ctx : ctx ,
2021-04-20 06:25:08 +08:00
URLPrefix : rel . Repo . Link ( ) ,
Metas : rel . Repo . ComposeMetas ( ) ,
} , rel . Note )
if err != nil {
log . Error ( "markdown.RenderString(%d): %v" , rel . RepoID , err )
return
}
2020-08-23 23:03:18 +08:00
2021-04-02 12:25:13 +02:00
subject := locale . Tr ( "mail.release.new.subject" , rel . TagName , rel . Repo . FullName ( ) )
2020-08-23 23:03:18 +08:00
mailMeta := map [ string ] interface { } {
2021-04-02 12:25:13 +02:00
"Release" : rel ,
"Subject" : subject ,
"Language" : locale . Language ( ) ,
2021-06-23 14:33:21 +02:00
// helper
2022-06-27 22:58:46 +02:00
"locale" : locale ,
2022-03-23 12:34:20 +00:00
"Str2html" : templates . Str2html ,
"DotEscape" : templates . DotEscape ,
2020-08-23 23:03:18 +08:00
}
var mailBody bytes . Buffer
2021-04-02 12:25:13 +02:00
if err := bodyTemplates . ExecuteTemplate ( & mailBody , string ( tplNewReleaseMail ) , mailMeta ) ; err != nil {
2020-08-23 23:03:18 +08:00
log . Error ( "ExecuteTemplate [%s]: %v" , string ( tplNewReleaseMail ) + "/body" , err )
return
}
2021-04-02 12:25:13 +02:00
msgs := make ( [ ] * Message , 0 , len ( tos ) )
2020-08-23 23:03:18 +08:00
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 )
}