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.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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/translation"
  13. )
  14. // SendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created
  15. func SendRepoTransferNotifyMail(ctx context.Context, doer, newOwner *user_model.User, repo *repo_model.Repository) error {
  16. if setting.MailService == nil {
  17. // No mail service configured
  18. return nil
  19. }
  20. if newOwner.IsOrganization() {
  21. users, err := organization.GetUsersWhoCanCreateOrgRepo(ctx, newOwner.ID)
  22. if err != nil {
  23. return err
  24. }
  25. langMap := make(map[string][]string)
  26. for _, user := range users {
  27. if !user.IsActive {
  28. // don't send emails to inactive users
  29. continue
  30. }
  31. langMap[user.Language] = append(langMap[user.Language], user.Email)
  32. }
  33. for lang, tos := range langMap {
  34. if err := sendRepoTransferNotifyMailPerLang(lang, newOwner, doer, tos, repo); err != nil {
  35. return err
  36. }
  37. }
  38. return nil
  39. }
  40. return sendRepoTransferNotifyMailPerLang(newOwner.Language, newOwner, doer, []string{newOwner.Email}, repo)
  41. }
  42. // sendRepoTransferNotifyMail triggers a notification e-mail when a pending repository transfer was created for each language
  43. func sendRepoTransferNotifyMailPerLang(lang string, newOwner, doer *user_model.User, emails []string, repo *repo_model.Repository) error {
  44. var (
  45. locale = translation.NewLocale(lang)
  46. content bytes.Buffer
  47. )
  48. destination := locale.Tr("mail.repo.transfer.to_you")
  49. subject := locale.Tr("mail.repo.transfer.subject_to_you", doer.DisplayName(), repo.FullName())
  50. if newOwner.IsOrganization() {
  51. destination = newOwner.DisplayName()
  52. subject = locale.Tr("mail.repo.transfer.subject_to", doer.DisplayName(), repo.FullName(), destination)
  53. }
  54. data := map[string]any{
  55. "locale": locale,
  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. }
  64. if err := bodyTemplates.ExecuteTemplate(&content, string(mailRepoTransferNotify), data); err != nil {
  65. return err
  66. }
  67. for _, to := range emails {
  68. msg := NewMessage(to, subject, content.String())
  69. msg.Info = fmt.Sprintf("UID: %d, repository pending transfer notification", newOwner.ID)
  70. SendAsync(msg)
  71. }
  72. return nil
  73. }