You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mail_repo.go 2.7KB

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