2020-08-23 18:03:18 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2020-08-23 18:03:18 +03:00
package mailer
import (
"bytes"
2022-01-20 02:26:57 +03:00
"context"
2020-08-23 18:03:18 +03:00
2024-11-24 11:18:57 +03:00
"code.gitea.io/gitea/models/renderhelper"
2021-12-12 18:48:20 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2020-08-23 18:03:18 +03:00
"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"
2021-04-02 13:25:13 +03:00
"code.gitea.io/gitea/modules/translation"
2024-11-30 04:15:41 +03:00
sender_service "code.gitea.io/gitea/services/mailer/sender"
2020-08-23 18:03:18 +03:00
)
const (
tplNewReleaseMail base . TplName = "release"
)
2022-10-19 15:40:28 +03:00
// MailNewRelease send new release notify to all repo watchers.
2022-08-25 05:31:57 +03:00
func MailNewRelease ( ctx context . Context , rel * repo_model . Release ) {
2021-08-12 10:26:33 +03:00
if setting . MailService == nil {
// No mail service configured
return
}
2022-03-22 18:22:54 +03:00
watcherIDList , err := repo_model . GetRepoWatchersIDs ( ctx , rel . RepoID )
2020-08-23 18:03:18 +03:00
if err != nil {
log . Error ( "GetRepoWatchersIDs(%d): %v" , rel . RepoID , err )
return
}
2022-11-19 11:12:33 +03:00
recipients , err := user_model . GetMaileableUsersByIDs ( ctx , watcherIDList , false )
2020-08-23 18:03:18 +03:00
if err != nil {
2021-11-24 12:49:20 +03:00
log . Error ( "user_model.GetMaileableUsersByIDs: %v" , err )
2020-08-23 18:03:18 +03:00
return
}
2024-07-08 11:38:45 +03:00
langMap := make ( map [ string ] [ ] * user_model . User )
2021-04-02 13:25:13 +03:00
for _ , user := range recipients {
if user . ID != rel . PublisherID {
2024-07-08 11:38:45 +03:00
langMap [ user . Language ] = append ( langMap [ user . Language ] , user )
2020-08-23 18:03:18 +03:00
}
}
2021-04-02 13:25:13 +03:00
for lang , tos := range langMap {
2022-01-20 02:26:57 +03:00
mailNewRelease ( ctx , lang , tos , rel )
2021-04-02 13:25:13 +03:00
}
}
2024-07-08 11:38:45 +03:00
func mailNewRelease ( ctx context . Context , lang string , tos [ ] * user_model . User , rel * repo_model . Release ) {
2021-04-02 13:25:13 +03:00
locale := translation . NewLocale ( lang )
2021-04-20 01:25:08 +03:00
var err error
2024-11-24 11:18:57 +03:00
rctx := renderhelper . NewRenderContextRepoComment ( ctx , rel . Repo ) . WithUseAbsoluteLink ( true )
rel . RenderedNote , err = markdown . RenderString ( rctx ,
2024-11-22 08:48:09 +03:00
rel . Note )
2021-04-20 01:25:08 +03:00
if err != nil {
log . Error ( "markdown.RenderString(%d): %v" , rel . RepoID , err )
return
}
2020-08-23 18:03:18 +03:00
2024-02-15 00:48:45 +03:00
subject := locale . TrString ( "mail.release.new.subject" , rel . TagName , rel . Repo . FullName ( ) )
2023-07-04 21:36:08 +03:00
mailMeta := map [ string ] any {
2023-10-31 17:11:48 +03:00
"locale" : locale ,
2021-04-02 13:25:13 +03:00
"Release" : rel ,
"Subject" : subject ,
"Language" : locale . Language ( ) ,
2024-02-08 06:09:15 +03:00
"Link" : rel . HTMLURL ( ) ,
2020-08-23 18:03:18 +03:00
}
var mailBody bytes . Buffer
2021-04-02 13:25:13 +03:00
if err := bodyTemplates . ExecuteTemplate ( & mailBody , string ( tplNewReleaseMail ) , mailMeta ) ; err != nil {
2020-08-23 18:03:18 +03:00
log . Error ( "ExecuteTemplate [%s]: %v" , string ( tplNewReleaseMail ) + "/body" , err )
return
}
2024-11-30 04:15:41 +03:00
msgs := make ( [ ] * sender_service . Message , 0 , len ( tos ) )
2024-07-15 00:27:00 +03:00
publisherName := fromDisplayName ( rel . Publisher )
2024-05-02 18:24:21 +03:00
msgID := generateMessageIDForRelease ( rel )
2020-08-23 18:03:18 +03:00
for _ , to := range tos {
2024-11-30 04:15:41 +03:00
msg := sender_service . NewMessageFrom ( to . EmailTo ( ) , publisherName , setting . MailService . FromEmail , subject , mailBody . String ( ) )
2020-08-23 18:03:18 +03:00
msg . Info = subject
2024-05-02 18:24:21 +03:00
msg . SetHeader ( "Message-ID" , msgID )
2020-08-23 18:03:18 +03:00
msgs = append ( msgs , msg )
}
2023-10-31 17:11:48 +03:00
SendAsync ( msgs ... )
2020-08-23 18:03:18 +03:00
}