2021-03-01 03:47:30 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-03-01 03:47:30 +03:00
package mailer
import (
"bytes"
2022-11-19 11:12:33 +03:00
"context"
2021-03-01 03:47:30 +03:00
"fmt"
2022-03-29 09:29:02 +03:00
"code.gitea.io/gitea/models/organization"
2021-12-10 04:27:50 +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"
2021-08-12 10:26:33 +03:00
"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"
2021-03-01 03:47:30 +03:00
)
// SendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created
2022-11-19 11:12:33 +03:00
func SendRepoTransferNotifyMail ( ctx context . Context , doer , newOwner * user_model . User , repo * repo_model . Repository ) error {
2021-08-12 10:26:33 +03:00
if setting . MailService == nil {
// No mail service configured
return nil
}
2021-03-01 03:47:30 +03:00
if newOwner . IsOrganization ( ) {
2022-11-19 11:12:33 +03:00
users , err := organization . GetUsersWhoCanCreateOrgRepo ( ctx , newOwner . ID )
2021-03-01 03:47:30 +03:00
if err != nil {
return err
}
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 users {
2022-03-19 15:45:44 +03:00
if ! user . IsActive {
// don't send emails to inactive users
continue
}
2024-07-08 11:38:45 +03:00
langMap [ user . Language ] = append ( langMap [ user . Language ] , user )
2021-04-02 13:25:13 +03:00
}
for lang , tos := range langMap {
if err := sendRepoTransferNotifyMailPerLang ( lang , newOwner , doer , tos , repo ) ; err != nil {
return err
}
2021-03-01 03:47:30 +03:00
}
2021-04-02 13:25:13 +03:00
return nil
}
2024-07-08 11:38:45 +03:00
return sendRepoTransferNotifyMailPerLang ( newOwner . Language , newOwner , doer , [ ] * user_model . User { newOwner } , repo )
2021-04-02 13:25:13 +03:00
}
// sendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created for each language
2024-07-08 11:38:45 +03:00
func sendRepoTransferNotifyMailPerLang ( lang string , newOwner , doer * user_model . User , emailTos [ ] * user_model . User , repo * repo_model . Repository ) error {
2021-04-02 13:25:13 +03:00
var (
locale = translation . NewLocale ( lang )
content bytes . Buffer
)
2024-02-15 00:48:45 +03:00
destination := locale . TrString ( "mail.repo.transfer.to_you" )
subject := locale . TrString ( "mail.repo.transfer.subject_to_you" , doer . DisplayName ( ) , repo . FullName ( ) )
2021-04-02 13:25:13 +03:00
if newOwner . IsOrganization ( ) {
2021-03-01 03:47:30 +03:00
destination = newOwner . DisplayName ( )
2024-02-15 00:48:45 +03:00
subject = locale . TrString ( "mail.repo.transfer.subject_to" , doer . DisplayName ( ) , repo . FullName ( ) , destination )
2021-03-01 03:47:30 +03:00
}
2023-07-04 21:36:08 +03:00
data := map [ string ] any {
2023-10-31 17:11:48 +03:00
"locale" : locale ,
2021-04-02 13:25:13 +03:00
"Doer" : doer ,
"User" : repo . Owner ,
"Repo" : repo . FullName ( ) ,
"Link" : repo . HTMLURL ( ) ,
"Subject" : subject ,
"Language" : locale . Language ( ) ,
2021-03-01 03:47:30 +03:00
"Destination" : destination ,
}
if err := bodyTemplates . ExecuteTemplate ( & content , string ( mailRepoTransferNotify ) , data ) ; err != nil {
return err
}
2024-07-08 11:38:45 +03:00
for _ , to := range emailTos {
2024-11-30 04:15:41 +03:00
msg := sender_service . NewMessageFrom ( to . EmailTo ( ) , fromDisplayName ( doer ) , setting . MailService . FromEmail , subject , content . String ( ) )
2023-01-22 17:23:52 +03:00
msg . Info = fmt . Sprintf ( "UID: %d, repository pending transfer notification" , newOwner . ID )
SendAsync ( msg )
}
2021-03-01 03:47:30 +03:00
return nil
}