code.gitea.io/gitea@v1.22.3/services/mailer/mail_team_invite.go (about)

     1  // Copyright 2022 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  	"net/url"
    11  
    12  	org_model "code.gitea.io/gitea/models/organization"
    13  	user_model "code.gitea.io/gitea/models/user"
    14  	"code.gitea.io/gitea/modules/base"
    15  	"code.gitea.io/gitea/modules/log"
    16  	"code.gitea.io/gitea/modules/setting"
    17  	"code.gitea.io/gitea/modules/translation"
    18  )
    19  
    20  const (
    21  	tplTeamInviteMail base.TplName = "team_invite"
    22  )
    23  
    24  // MailTeamInvite sends team invites
    25  func MailTeamInvite(ctx context.Context, inviter *user_model.User, team *org_model.Team, invite *org_model.TeamInvite) error {
    26  	if setting.MailService == nil {
    27  		return nil
    28  	}
    29  
    30  	org, err := user_model.GetUserByID(ctx, team.OrgID)
    31  	if err != nil {
    32  		return err
    33  	}
    34  
    35  	locale := translation.NewLocale(inviter.Language)
    36  
    37  	// check if a user with this email already exists
    38  	user, err := user_model.GetUserByEmail(ctx, invite.Email)
    39  	if err != nil && !user_model.IsErrUserNotExist(err) {
    40  		return err
    41  	} else if user != nil && user.ProhibitLogin {
    42  		return fmt.Errorf("login is prohibited for the invited user")
    43  	}
    44  
    45  	inviteRedirect := url.QueryEscape(fmt.Sprintf("/org/invite/%s", invite.Token))
    46  	inviteURL := fmt.Sprintf("%suser/sign_up?redirect_to=%s", setting.AppURL, inviteRedirect)
    47  
    48  	if (err == nil && user != nil) || setting.Service.DisableRegistration || setting.Service.AllowOnlyExternalRegistration {
    49  		// user account exists or registration disabled
    50  		inviteURL = fmt.Sprintf("%suser/login?redirect_to=%s", setting.AppURL, inviteRedirect)
    51  	}
    52  
    53  	subject := locale.TrString("mail.team_invite.subject", inviter.DisplayName(), org.DisplayName())
    54  	mailMeta := map[string]any{
    55  		"locale":       locale,
    56  		"Inviter":      inviter,
    57  		"Organization": org,
    58  		"Team":         team,
    59  		"Invite":       invite,
    60  		"Subject":      subject,
    61  		"InviteURL":    inviteURL,
    62  	}
    63  
    64  	var mailBody bytes.Buffer
    65  	if err := bodyTemplates.ExecuteTemplate(&mailBody, string(tplTeamInviteMail), mailMeta); err != nil {
    66  		log.Error("ExecuteTemplate [%s]: %v", string(tplTeamInviteMail)+"/body", err)
    67  		return err
    68  	}
    69  
    70  	msg := NewMessage(invite.Email, subject, mailBody.String())
    71  	msg.Info = subject
    72  
    73  	SendAsync(msg)
    74  
    75  	return nil
    76  }