2019-01-13 20:12:55 +05:30
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 23:50:29 +05:30
// SPDX-License-Identifier: MIT
2019-01-13 20:12:55 +05:30
2023-09-05 14:56:59 +05:30
package mailer
2019-01-13 20:12:55 +05:30
import (
2022-11-19 13:42:33 +05:30
"context"
2019-10-25 20:16:37 +05:30
"fmt"
2022-08-25 08:01:57 +05:30
activities_model "code.gitea.io/gitea/models/activities"
2022-06-13 15:07:59 +05:30
issues_model "code.gitea.io/gitea/models/issues"
2021-12-10 06:57:50 +05:30
repo_model "code.gitea.io/gitea/models/repo"
2021-11-24 15:19:20 +05:30
user_model "code.gitea.io/gitea/models/user"
2019-01-13 20:12:55 +05:30
"code.gitea.io/gitea/modules/log"
2023-09-06 00:07:47 +05:30
notify_service "code.gitea.io/gitea/services/notify"
2019-01-13 20:12:55 +05:30
)
type mailNotifier struct {
2023-09-06 00:07:47 +05:30
notify_service . NullNotifier
2019-01-13 20:12:55 +05:30
}
2023-09-06 00:07:47 +05:30
var _ notify_service . Notifier = & mailNotifier { }
2019-01-13 20:12:55 +05:30
// NewNotifier create a new mailNotifier notifier
2023-09-06 00:07:47 +05:30
func NewNotifier ( ) notify_service . Notifier {
2019-01-13 20:12:55 +05:30
return & mailNotifier { }
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) CreateIssueComment ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository ,
2022-06-13 15:07:59 +05:30
issue * issues_model . Issue , comment * issues_model . Comment , mentions [ ] * user_model . User ,
2022-02-24 01:46:07 +05:30
) {
2022-08-25 08:01:57 +05:30
var act activities_model . ActionType
2022-06-13 15:07:59 +05:30
if comment . Type == issues_model . CommentTypeClose {
2022-08-25 08:01:57 +05:30
act = activities_model . ActionCloseIssue
2022-06-13 15:07:59 +05:30
} else if comment . Type == issues_model . CommentTypeReopen {
2022-08-25 08:01:57 +05:30
act = activities_model . ActionReopenIssue
2022-06-13 15:07:59 +05:30
} else if comment . Type == issues_model . CommentTypeComment {
2022-08-25 08:01:57 +05:30
act = activities_model . ActionCommentIssue
2022-06-13 15:07:59 +05:30
} else if comment . Type == issues_model . CommentTypeCode {
2022-08-25 08:01:57 +05:30
act = activities_model . ActionCommentIssue
2022-06-13 15:07:59 +05:30
} else if comment . Type == issues_model . CommentTypePullRequestPush {
2020-05-20 18:17:24 +05:30
act = 0
2019-01-13 20:12:55 +05:30
}
2023-09-05 14:56:59 +05:30
if err := MailParticipantsComment ( ctx , comment , act , issue , mentions ) ; err != nil {
2019-11-15 18:29:21 +05:30
log . Error ( "MailParticipantsComment: %v" , err )
2019-01-13 20:12:55 +05:30
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) NewIssue ( ctx context . Context , issue * issues_model . Issue , mentions [ ] * user_model . User ) {
2023-09-05 14:56:59 +05:30
if err := MailParticipants ( ctx , issue , issue . Poster , activities_model . ActionCreateIssue , mentions ) ; err != nil {
2019-04-02 13:18:31 +05:30
log . Error ( "MailParticipants: %v" , err )
2019-01-13 20:12:55 +05:30
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) IssueChangeStatus ( ctx context . Context , doer * user_model . User , commitID string , issue * issues_model . Issue , actionComment * issues_model . Comment , isClosed bool ) {
2022-08-25 08:01:57 +05:30
var actionType activities_model . ActionType
2019-04-12 03:29:01 +05:30
if issue . IsPull {
if isClosed {
2022-08-25 08:01:57 +05:30
actionType = activities_model . ActionClosePullRequest
2019-04-12 03:29:01 +05:30
} else {
2022-08-25 08:01:57 +05:30
actionType = activities_model . ActionReopenPullRequest
2019-04-12 03:29:01 +05:30
}
} else {
if isClosed {
2022-08-25 08:01:57 +05:30
actionType = activities_model . ActionCloseIssue
2019-04-12 03:29:01 +05:30
} else {
2022-08-25 08:01:57 +05:30
actionType = activities_model . ActionReopenIssue
2019-04-12 03:29:01 +05:30
}
}
2023-09-05 14:56:59 +05:30
if err := MailParticipants ( ctx , issue , doer , actionType , nil ) ; err != nil {
2019-04-02 13:18:31 +05:30
log . Error ( "MailParticipants: %v" , err )
2019-01-13 20:12:55 +05:30
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) IssueChangeTitle ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , oldTitle string ) {
2022-11-19 13:42:33 +05:30
if err := issue . LoadPullRequest ( ctx ) ; err != nil {
2021-06-23 09:44:22 +05:30
log . Error ( "issue.LoadPullRequest: %v" , err )
return
}
2023-10-11 09:54:07 +05:30
if issue . IsPull && issues_model . HasWorkInProgressPrefix ( oldTitle ) && ! issue . PullRequest . IsWorkInProgress ( ctx ) {
2023-09-05 14:56:59 +05:30
if err := MailParticipants ( ctx , issue , doer , activities_model . ActionPullRequestReadyForReview , nil ) ; err != nil {
2021-06-23 09:44:22 +05:30
log . Error ( "MailParticipants: %v" , err )
}
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) NewPullRequest ( ctx context . Context , pr * issues_model . PullRequest , mentions [ ] * user_model . User ) {
2023-09-05 14:56:59 +05:30
if err := MailParticipants ( ctx , pr . Issue , pr . Issue . Poster , activities_model . ActionCreatePullRequest , mentions ) ; err != nil {
2019-04-02 13:18:31 +05:30
log . Error ( "MailParticipants: %v" , err )
2019-01-13 20:12:55 +05:30
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) PullRequestReview ( ctx context . Context , pr * issues_model . PullRequest , r * issues_model . Review , comment * issues_model . Comment , mentions [ ] * user_model . User ) {
2022-08-25 08:01:57 +05:30
var act activities_model . ActionType
2022-06-13 15:07:59 +05:30
if comment . Type == issues_model . CommentTypeClose {
2022-08-25 08:01:57 +05:30
act = activities_model . ActionCloseIssue
2022-06-13 15:07:59 +05:30
} else if comment . Type == issues_model . CommentTypeReopen {
2022-08-25 08:01:57 +05:30
act = activities_model . ActionReopenIssue
2022-06-13 15:07:59 +05:30
} else if comment . Type == issues_model . CommentTypeComment {
2022-08-25 08:01:57 +05:30
act = activities_model . ActionCommentPull
2019-01-13 20:12:55 +05:30
}
2023-09-05 14:56:59 +05:30
if err := MailParticipantsComment ( ctx , comment , act , pr . Issue , mentions ) ; err != nil {
2019-11-15 18:29:21 +05:30
log . Error ( "MailParticipantsComment: %v" , err )
2019-01-13 20:12:55 +05:30
}
}
2019-10-25 20:16:37 +05:30
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) PullRequestCodeComment ( ctx context . Context , pr * issues_model . PullRequest , comment * issues_model . Comment , mentions [ ] * user_model . User ) {
2023-09-05 14:56:59 +05:30
if err := MailMentionsComment ( ctx , pr , comment , mentions ) ; err != nil {
2021-01-02 22:34:02 +05:30
log . Error ( "MailMentionsComment: %v" , err )
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) IssueChangeAssignee ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , assignee * user_model . User , removed bool , comment * issues_model . Comment ) {
2019-10-25 20:16:37 +05:30
// mail only sent to added assignees and not self-assignee
2024-02-04 18:59:09 +05:30
if ! removed && doer . ID != assignee . ID && assignee . EmailNotificationsPreference != user_model . EmailNotificationsDisabled {
2019-10-25 20:16:37 +05:30
ct := fmt . Sprintf ( "Assigned #%d." , issue . Index )
2023-09-05 14:56:59 +05:30
if err := SendIssueAssignedMail ( ctx , issue , doer , ct , comment , [ ] * user_model . User { assignee } ) ; err != nil {
2021-04-20 03:55:08 +05:30
log . Error ( "Error in SendIssueAssignedMail for issue[%d] to assignee[%d]: %v" , issue . ID , assignee . ID , err )
}
2019-10-25 20:16:37 +05:30
}
}
2019-11-21 22:38:42 +05:30
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) PullRequestReviewRequest ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , reviewer * user_model . User , isRequest bool , comment * issues_model . Comment ) {
2024-02-04 18:59:09 +05:30
if isRequest && doer . ID != reviewer . ID && reviewer . EmailNotificationsPreference != user_model . EmailNotificationsDisabled {
2020-11-28 16:36:59 +05:30
ct := fmt . Sprintf ( "Requested to review %s." , issue . HTMLURL ( ) )
2023-09-05 14:56:59 +05:30
if err := SendIssueAssignedMail ( ctx , issue , doer , ct , comment , [ ] * user_model . User { reviewer } ) ; err != nil {
2021-04-20 03:55:08 +05:30
log . Error ( "Error in SendIssueAssignedMail for issue[%d] to reviewer[%d]: %v" , issue . ID , reviewer . ID , err )
}
2020-04-06 22:03:34 +05:30
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) MergePullRequest ( ctx context . Context , doer * user_model . User , pr * issues_model . PullRequest ) {
2022-11-19 13:42:33 +05:30
if err := pr . LoadIssue ( ctx ) ; err != nil {
log . Error ( "LoadIssue: %v" , err )
2019-11-21 22:38:42 +05:30
return
}
2023-09-05 14:56:59 +05:30
if err := MailParticipants ( ctx , pr . Issue , doer , activities_model . ActionMergePullRequest , nil ) ; err != nil {
2019-11-21 22:38:42 +05:30
log . Error ( "MailParticipants: %v" , err )
}
}
2020-05-20 18:17:24 +05:30
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) AutoMergePullRequest ( ctx context . Context , doer * user_model . User , pr * issues_model . PullRequest ) {
2022-11-19 13:42:33 +05:30
if err := pr . LoadIssue ( ctx ) ; err != nil {
2022-11-03 21:19:00 +05:30
log . Error ( "pr.LoadIssue: %v" , err )
return
}
2023-09-05 14:56:59 +05:30
if err := MailParticipants ( ctx , pr . Issue , doer , activities_model . ActionAutoMergePullRequest , nil ) ; err != nil {
2022-11-03 21:19:00 +05:30
log . Error ( "MailParticipants: %v" , err )
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) PullRequestPushCommits ( ctx context . Context , doer * user_model . User , pr * issues_model . PullRequest , comment * issues_model . Comment ) {
2020-05-20 18:17:24 +05:30
var err error
2022-11-19 13:42:33 +05:30
if err = comment . LoadIssue ( ctx ) ; err != nil {
2020-05-20 18:17:24 +05:30
log . Error ( "comment.LoadIssue: %v" , err )
return
}
2022-04-08 14:41:15 +05:30
if err = comment . Issue . LoadRepo ( ctx ) ; err != nil {
2020-05-20 18:17:24 +05:30
log . Error ( "comment.Issue.LoadRepo: %v" , err )
return
}
2022-11-19 13:42:33 +05:30
if err = comment . Issue . LoadPullRequest ( ctx ) ; err != nil {
2020-05-20 18:17:24 +05:30
log . Error ( "comment.Issue.LoadPullRequest: %v" , err )
return
}
2022-11-19 13:42:33 +05:30
if err = comment . Issue . PullRequest . LoadBaseRepo ( ctx ) ; err != nil {
2020-05-20 18:17:24 +05:30
log . Error ( "comment.Issue.PullRequest.LoadBaseRepo: %v" , err )
return
}
2022-01-20 04:56:57 +05:30
if err := comment . LoadPushCommits ( ctx ) ; err != nil {
2020-05-20 18:17:24 +05:30
log . Error ( "comment.LoadPushCommits: %v" , err )
}
2023-09-06 00:07:47 +05:30
m . CreateIssueComment ( ctx , doer , comment . Issue . Repo , comment . Issue , comment , nil )
2020-05-20 18:17:24 +05:30
}
2020-08-23 20:33:18 +05:30
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) PullReviewDismiss ( ctx context . Context , doer * user_model . User , review * issues_model . Review , comment * issues_model . Comment ) {
2023-09-14 01:18:36 +05:30
if err := comment . Review . LoadReviewer ( ctx ) ; err != nil {
log . Error ( "Error in PullReviewDismiss while loading reviewer for issue[%d], review[%d] and reviewer[%d]: %v" , review . Issue . ID , comment . Review . ID , comment . Review . ReviewerID , err )
}
2023-09-05 14:56:59 +05:30
if err := MailParticipantsComment ( ctx , comment , activities_model . ActionPullReviewDismissed , review . Issue , nil ) ; err != nil {
2021-02-11 23:02:25 +05:30
log . Error ( "MailParticipantsComment: %v" , err )
}
}
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) NewRelease ( ctx context . Context , rel * repo_model . Release ) {
2022-11-19 13:42:33 +05:30
if err := rel . LoadAttributes ( ctx ) ; err != nil {
log . Error ( "LoadAttributes: %v" , err )
2020-08-23 20:33:18 +05:30
return
}
if rel . IsDraft || rel . IsPrerelease {
return
}
2023-09-05 14:56:59 +05:30
MailNewRelease ( ctx , rel )
2020-08-23 20:33:18 +05:30
}
2021-03-01 06:17:30 +05:30
2023-09-06 00:07:47 +05:30
func ( m * mailNotifier ) RepoPendingTransfer ( ctx context . Context , doer , newOwner * user_model . User , repo * repo_model . Repository ) {
2023-09-05 14:56:59 +05:30
if err := SendRepoTransferNotifyMail ( ctx , doer , newOwner , repo ) ; err != nil {
2022-11-19 13:42:33 +05:30
log . Error ( "SendRepoTransferNotifyMail: %v" , err )
2021-03-01 06:17:30 +05:30
}
}