2021-03-01 01:47:30 +01:00
// Copyright 2021 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"
2021-12-10 09:27:50 +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"
2021-08-12 08:26:33 +01:00
"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"
2021-03-01 01:47:30 +01:00
)
// SendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created
2021-12-10 09:27:50 +08:00
func SendRepoTransferNotifyMail ( doer , newOwner * user_model . User , repo * repo_model . Repository ) error {
2021-08-12 08:26:33 +01:00
if setting . MailService == nil {
// No mail service configured
return nil
}
2021-03-01 01:47:30 +01:00
if newOwner . IsOrganization ( ) {
users , err := models . GetUsersWhoCanCreateOrgRepo ( newOwner . ID )
if err != nil {
return err
}
2021-04-02 12:25:13 +02:00
langMap := make ( map [ string ] [ ] string )
for _ , user := range users {
2022-03-19 12:45:44 +00:00
if ! user . IsActive {
// don't send emails to inactive users
continue
}
2021-04-02 12:25:13 +02:00
langMap [ user . Language ] = append ( langMap [ user . Language ] , user . Email )
}
for lang , tos := range langMap {
if err := sendRepoTransferNotifyMailPerLang ( lang , newOwner , doer , tos , repo ) ; err != nil {
return err
}
2021-03-01 01:47:30 +01:00
}
2021-04-02 12:25:13 +02:00
return nil
}
return sendRepoTransferNotifyMailPerLang ( newOwner . Language , newOwner , doer , [ ] string { newOwner . Email } , repo )
}
// sendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created for each language
2021-12-10 09:27:50 +08:00
func sendRepoTransferNotifyMailPerLang ( lang string , newOwner , doer * user_model . User , emails [ ] string , repo * repo_model . Repository ) error {
2021-04-02 12:25:13 +02:00
var (
locale = translation . NewLocale ( lang )
content bytes . Buffer
)
destination := locale . Tr ( "mail.repo.transfer.to_you" )
subject := locale . Tr ( "mail.repo.transfer.subject_to_you" , doer . DisplayName ( ) , repo . FullName ( ) )
if newOwner . IsOrganization ( ) {
2021-03-01 01:47:30 +01:00
destination = newOwner . DisplayName ( )
2021-04-02 12:25:13 +02:00
subject = locale . Tr ( "mail.repo.transfer.subject_to" , doer . DisplayName ( ) , repo . FullName ( ) , destination )
2021-03-01 01:47:30 +01:00
}
data := map [ string ] interface { } {
2021-04-02 12:25:13 +02:00
"Doer" : doer ,
"User" : repo . Owner ,
"Repo" : repo . FullName ( ) ,
"Link" : repo . HTMLURL ( ) ,
"Subject" : subject ,
"Language" : locale . Language ( ) ,
2021-03-01 01:47:30 +01:00
"Destination" : destination ,
2021-06-23 14:33:21 +02:00
// helper
"i18n" : locale ,
"Str2html" : templates . Str2html ,
2021-03-01 01:47:30 +01:00
}
if err := bodyTemplates . ExecuteTemplate ( & content , string ( mailRepoTransferNotify ) , data ) ; err != nil {
return err
}
msg := NewMessage ( emails , subject , content . String ( ) )
msg . Info = fmt . Sprintf ( "UID: %d, repository pending transfer notification" , newOwner . ID )
SendAsync ( msg )
return nil
}