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  }