2019-01-13 17:42:55 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package mail
import (
2019-10-25 17:46:37 +03:00
"fmt"
2019-01-13 17:42:55 +03:00
"code.gitea.io/gitea/models"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 12:49:20 +03:00
user_model "code.gitea.io/gitea/models/user"
2022-01-20 02:26:57 +03:00
"code.gitea.io/gitea/modules/graceful"
2019-01-13 17:42:55 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/notification/base"
2022-01-20 02:26:57 +03:00
"code.gitea.io/gitea/modules/process"
2019-09-24 08:02:49 +03:00
"code.gitea.io/gitea/services/mailer"
2019-01-13 17:42:55 +03:00
)
type mailNotifier struct {
base . NullNotifier
}
2022-01-20 20:46:10 +03:00
var _ base . Notifier = & mailNotifier { }
2019-01-13 17:42:55 +03:00
// NewNotifier create a new mailNotifier notifier
func NewNotifier ( ) base . Notifier {
return & mailNotifier { }
}
2021-12-10 04:27:50 +03:00
func ( m * mailNotifier ) NotifyCreateIssueComment ( doer * user_model . User , repo * repo_model . Repository ,
2022-02-23 23:16:07 +03:00
issue * models . Issue , comment * models . Comment , mentions [ ] * user_model . User ,
) {
2022-01-20 02:26:57 +03:00
ctx , _ , finished := process . GetManager ( ) . AddContext ( graceful . GetManager ( ) . HammerContext ( ) , fmt . Sprintf ( "mailNotifier.NotifyCreateIssueComment Issue[%d] #%d in [%d]" , issue . ID , issue . Index , issue . RepoID ) )
defer finished ( )
2019-01-13 17:42:55 +03:00
var act models . ActionType
if comment . Type == models . CommentTypeClose {
act = models . ActionCloseIssue
} else if comment . Type == models . CommentTypeReopen {
act = models . ActionReopenIssue
} else if comment . Type == models . CommentTypeComment {
act = models . ActionCommentIssue
} else if comment . Type == models . CommentTypeCode {
act = models . ActionCommentIssue
2022-01-21 20:59:26 +03:00
} else if comment . Type == models . CommentTypePullRequestPush {
2020-05-20 15:47:24 +03:00
act = 0
2019-01-13 17:42:55 +03:00
}
2022-01-20 02:26:57 +03:00
if err := mailer . MailParticipantsComment ( ctx , comment , act , issue , mentions ) ; err != nil {
2019-11-15 15:59:21 +03:00
log . Error ( "MailParticipantsComment: %v" , err )
2019-01-13 17:42:55 +03:00
}
}
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyNewIssue ( issue * models . Issue , mentions [ ] * user_model . User ) {
2021-01-02 20:04:02 +03:00
if err := mailer . MailParticipants ( issue , issue . Poster , models . ActionCreateIssue , mentions ) ; err != nil {
2019-04-02 10:48:31 +03:00
log . Error ( "MailParticipants: %v" , err )
2019-01-13 17:42:55 +03:00
}
}
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyIssueChangeStatus ( doer * user_model . User , issue * models . Issue , actionComment * models . Comment , isClosed bool ) {
2019-04-12 00:59:01 +03:00
var actionType models . ActionType
if issue . IsPull {
if isClosed {
actionType = models . ActionClosePullRequest
} else {
actionType = models . ActionReopenPullRequest
}
} else {
if isClosed {
actionType = models . ActionCloseIssue
} else {
actionType = models . ActionReopenIssue
}
}
2021-01-02 20:04:02 +03:00
if err := mailer . MailParticipants ( issue , doer , actionType , nil ) ; err != nil {
2019-04-02 10:48:31 +03:00
log . Error ( "MailParticipants: %v" , err )
2019-01-13 17:42:55 +03:00
}
}
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyIssueChangeTitle ( doer * user_model . User , issue * models . Issue , oldTitle string ) {
2021-06-23 07:14:22 +03:00
if err := issue . LoadPullRequest ( ) ; err != nil {
log . Error ( "issue.LoadPullRequest: %v" , err )
return
}
if issue . IsPull && models . HasWorkInProgressPrefix ( oldTitle ) && ! issue . PullRequest . IsWorkInProgress ( ) {
if err := mailer . MailParticipants ( issue , doer , models . ActionPullRequestReadyForReview , nil ) ; err != nil {
log . Error ( "MailParticipants: %v" , err )
}
}
}
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyNewPullRequest ( pr * models . PullRequest , mentions [ ] * user_model . User ) {
2021-01-02 20:04:02 +03:00
if err := mailer . MailParticipants ( pr . Issue , pr . Issue . Poster , models . ActionCreatePullRequest , mentions ) ; err != nil {
2019-04-02 10:48:31 +03:00
log . Error ( "MailParticipants: %v" , err )
2019-01-13 17:42:55 +03:00
}
}
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyPullRequestReview ( pr * models . PullRequest , r * models . Review , comment * models . Comment , mentions [ ] * user_model . User ) {
2022-01-20 02:26:57 +03:00
ctx , _ , finished := process . GetManager ( ) . AddContext ( graceful . GetManager ( ) . HammerContext ( ) , fmt . Sprintf ( "mailNotifier.NotifyPullRequestReview Pull[%d] #%d in [%d]" , pr . ID , pr . Index , pr . BaseRepoID ) )
defer finished ( )
2019-01-13 17:42:55 +03:00
var act models . ActionType
if comment . Type == models . CommentTypeClose {
act = models . ActionCloseIssue
} else if comment . Type == models . CommentTypeReopen {
act = models . ActionReopenIssue
} else if comment . Type == models . CommentTypeComment {
2019-12-22 11:29:26 +03:00
act = models . ActionCommentPull
2019-01-13 17:42:55 +03:00
}
2022-01-20 02:26:57 +03:00
if err := mailer . MailParticipantsComment ( ctx , comment , act , pr . Issue , mentions ) ; err != nil {
2019-11-15 15:59:21 +03:00
log . Error ( "MailParticipantsComment: %v" , err )
2019-01-13 17:42:55 +03:00
}
}
2019-10-25 17:46:37 +03:00
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyPullRequestCodeComment ( pr * models . PullRequest , comment * models . Comment , mentions [ ] * user_model . User ) {
2022-01-20 02:26:57 +03:00
ctx , _ , finished := process . GetManager ( ) . AddContext ( graceful . GetManager ( ) . HammerContext ( ) , fmt . Sprintf ( "mailNotifier.NotifyPullRequestCodeComment Pull[%d] #%d in [%d]" , pr . ID , pr . Index , pr . BaseRepoID ) )
defer finished ( )
if err := mailer . MailMentionsComment ( ctx , pr , comment , mentions ) ; err != nil {
2021-01-02 20:04:02 +03:00
log . Error ( "MailMentionsComment: %v" , err )
}
}
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyIssueChangeAssignee ( doer * user_model . User , issue * models . Issue , assignee * user_model . User , removed bool , comment * models . Comment ) {
2019-10-25 17:46:37 +03:00
// mail only sent to added assignees and not self-assignee
2022-02-12 10:17:34 +03:00
if ! removed && doer . ID != assignee . ID && ( assignee . EmailNotifications ( ) == user_model . EmailNotificationsEnabled || assignee . EmailNotifications ( ) == user_model . EmailNotificationsOnMention ) {
2019-10-25 17:46:37 +03:00
ct := fmt . Sprintf ( "Assigned #%d." , issue . Index )
2021-11-24 12:49:20 +03:00
if err := mailer . SendIssueAssignedMail ( issue , doer , ct , comment , [ ] * user_model . User { assignee } ) ; err != nil {
2021-04-20 01:25:08 +03:00
log . Error ( "Error in SendIssueAssignedMail for issue[%d] to assignee[%d]: %v" , issue . ID , assignee . ID , err )
}
2019-10-25 17:46:37 +03:00
}
}
2019-11-21 20:08:42 +03:00
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyPullReviewRequest ( doer * user_model . User , issue * models . Issue , reviewer * user_model . User , isRequest bool , comment * models . Comment ) {
2022-02-12 10:17:34 +03:00
if isRequest && doer . ID != reviewer . ID && ( reviewer . EmailNotifications ( ) == user_model . EmailNotificationsEnabled || reviewer . EmailNotifications ( ) == user_model . EmailNotificationsOnMention ) {
2020-11-28 14:06:59 +03:00
ct := fmt . Sprintf ( "Requested to review %s." , issue . HTMLURL ( ) )
2021-11-24 12:49:20 +03:00
if err := mailer . SendIssueAssignedMail ( issue , doer , ct , comment , [ ] * user_model . User { reviewer } ) ; err != nil {
2021-04-20 01:25:08 +03:00
log . Error ( "Error in SendIssueAssignedMail for issue[%d] to reviewer[%d]: %v" , issue . ID , reviewer . ID , err )
}
2020-04-06 19:33:34 +03:00
}
}
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyMergePullRequest ( pr * models . PullRequest , doer * user_model . User ) {
2019-11-21 20:08:42 +03:00
if err := pr . LoadIssue ( ) ; err != nil {
log . Error ( "pr.LoadIssue: %v" , err )
return
}
2021-01-02 20:04:02 +03:00
if err := mailer . MailParticipants ( pr . Issue , doer , models . ActionMergePullRequest , nil ) ; err != nil {
2019-11-21 20:08:42 +03:00
log . Error ( "MailParticipants: %v" , err )
}
}
2020-05-20 15:47:24 +03:00
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyPullRequestPushCommits ( doer * user_model . User , pr * models . PullRequest , comment * models . Comment ) {
2022-01-20 02:26:57 +03:00
ctx , _ , finished := process . GetManager ( ) . AddContext ( graceful . GetManager ( ) . HammerContext ( ) , fmt . Sprintf ( "mailNotifier.NotifyPullRequestPushCommits Pull[%d] #%d in [%d]" , pr . ID , pr . Index , pr . BaseRepoID ) )
defer finished ( )
2020-05-20 15:47:24 +03:00
var err error
if err = comment . LoadIssue ( ) ; err != nil {
log . Error ( "comment.LoadIssue: %v" , err )
return
}
if err = comment . Issue . LoadRepo ( ) ; err != nil {
log . Error ( "comment.Issue.LoadRepo: %v" , err )
return
}
if err = comment . Issue . LoadPullRequest ( ) ; err != nil {
log . Error ( "comment.Issue.LoadPullRequest: %v" , err )
return
}
if err = comment . Issue . PullRequest . LoadBaseRepo ( ) ; err != nil {
log . Error ( "comment.Issue.PullRequest.LoadBaseRepo: %v" , err )
return
}
2022-01-20 02:26:57 +03:00
if err := comment . LoadPushCommits ( ctx ) ; err != nil {
2020-05-20 15:47:24 +03:00
log . Error ( "comment.LoadPushCommits: %v" , err )
}
2021-01-02 20:04:02 +03:00
m . NotifyCreateIssueComment ( doer , comment . Issue . Repo , comment . Issue , comment , nil )
2020-05-20 15:47:24 +03:00
}
2020-08-23 18:03:18 +03:00
2021-11-24 12:49:20 +03:00
func ( m * mailNotifier ) NotifyPullRevieweDismiss ( doer * user_model . User , review * models . Review , comment * models . Comment ) {
2022-01-20 02:26:57 +03:00
ctx , _ , finished := process . GetManager ( ) . AddContext ( graceful . GetManager ( ) . HammerContext ( ) , fmt . Sprintf ( "mailNotifier.NotifyPullRevieweDismiss Review[%d] in Issue[%d]" , review . ID , review . IssueID ) )
defer finished ( )
if err := mailer . MailParticipantsComment ( ctx , comment , models . ActionPullReviewDismissed , review . Issue , nil ) ; err != nil {
2021-02-11 20:32:25 +03:00
log . Error ( "MailParticipantsComment: %v" , err )
}
}
2020-08-23 18:03:18 +03:00
func ( m * mailNotifier ) NotifyNewRelease ( rel * models . Release ) {
2022-01-20 02:26:57 +03:00
ctx , _ , finished := process . GetManager ( ) . AddContext ( graceful . GetManager ( ) . HammerContext ( ) , fmt . Sprintf ( "mailNotifier.NotifyNewRelease rel[%d]%s in [%d]" , rel . ID , rel . Title , rel . RepoID ) )
defer finished ( )
2020-08-23 18:03:18 +03:00
if err := rel . LoadAttributes ( ) ; err != nil {
log . Error ( "NotifyNewRelease: %v" , err )
return
}
if rel . IsDraft || rel . IsPrerelease {
return
}
2022-01-20 02:26:57 +03:00
mailer . MailNewRelease ( ctx , rel )
2020-08-23 18:03:18 +03:00
}
2021-03-01 03:47:30 +03:00
2021-12-10 04:27:50 +03:00
func ( m * mailNotifier ) NotifyRepoPendingTransfer ( doer , newOwner * user_model . User , repo * repo_model . Repository ) {
2021-03-01 03:47:30 +03:00
if err := mailer . SendRepoTransferNotifyMail ( doer , newOwner , repo ) ; err != nil {
log . Error ( "NotifyRepoPendingTransfer: %v" , err )
}
}