code.gitea.io/gitea@v1.22.3/services/mailer/mail_repo.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package mailer 5 6 import ( 7 "bytes" 8 "context" 9 "fmt" 10 11 "code.gitea.io/gitea/models/organization" 12 repo_model "code.gitea.io/gitea/models/repo" 13 user_model "code.gitea.io/gitea/models/user" 14 "code.gitea.io/gitea/modules/setting" 15 "code.gitea.io/gitea/modules/translation" 16 ) 17 18 // SendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created 19 func SendRepoTransferNotifyMail(ctx context.Context, doer, newOwner *user_model.User, repo *repo_model.Repository) error { 20 if setting.MailService == nil { 21 // No mail service configured 22 return nil 23 } 24 25 if newOwner.IsOrganization() { 26 users, err := organization.GetUsersWhoCanCreateOrgRepo(ctx, newOwner.ID) 27 if err != nil { 28 return err 29 } 30 31 langMap := make(map[string][]string) 32 for _, user := range users { 33 if !user.IsActive { 34 // don't send emails to inactive users 35 continue 36 } 37 langMap[user.Language] = append(langMap[user.Language], user.Email) 38 } 39 40 for lang, tos := range langMap { 41 if err := sendRepoTransferNotifyMailPerLang(lang, newOwner, doer, tos, repo); err != nil { 42 return err 43 } 44 } 45 46 return nil 47 } 48 49 return sendRepoTransferNotifyMailPerLang(newOwner.Language, newOwner, doer, []string{newOwner.Email}, repo) 50 } 51 52 // sendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created for each language 53 func sendRepoTransferNotifyMailPerLang(lang string, newOwner, doer *user_model.User, emails []string, repo *repo_model.Repository) error { 54 var ( 55 locale = translation.NewLocale(lang) 56 content bytes.Buffer 57 ) 58 59 destination := locale.TrString("mail.repo.transfer.to_you") 60 subject := locale.TrString("mail.repo.transfer.subject_to_you", doer.DisplayName(), repo.FullName()) 61 if newOwner.IsOrganization() { 62 destination = newOwner.DisplayName() 63 subject = locale.TrString("mail.repo.transfer.subject_to", doer.DisplayName(), repo.FullName(), destination) 64 } 65 66 data := map[string]any{ 67 "locale": locale, 68 "Doer": doer, 69 "User": repo.Owner, 70 "Repo": repo.FullName(), 71 "Link": repo.HTMLURL(), 72 "Subject": subject, 73 "Language": locale.Language(), 74 "Destination": destination, 75 } 76 77 if err := bodyTemplates.ExecuteTemplate(&content, string(mailRepoTransferNotify), data); err != nil { 78 return err 79 } 80 81 for _, to := range emails { 82 msg := NewMessage(to, subject, content.String()) 83 msg.Info = fmt.Sprintf("UID: %d, repository pending transfer notification", newOwner.ID) 84 85 SendAsync(msg) 86 } 87 88 return nil 89 }