Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package mail
  5. import (
  6. "fmt"
  7. "code.gitea.io/gitea/models"
  8. user_model "code.gitea.io/gitea/models/user"
  9. "code.gitea.io/gitea/modules/log"
  10. "code.gitea.io/gitea/modules/notification/base"
  11. "code.gitea.io/gitea/services/mailer"
  12. )
  13. type mailNotifier struct {
  14. base.NullNotifier
  15. }
  16. var (
  17. _ base.Notifier = &mailNotifier{}
  18. )
  19. // NewNotifier create a new mailNotifier notifier
  20. func NewNotifier() base.Notifier {
  21. return &mailNotifier{}
  22. }
  23. func (m *mailNotifier) NotifyCreateIssueComment(doer *user_model.User, repo *models.Repository,
  24. issue *models.Issue, comment *models.Comment, mentions []*user_model.User) {
  25. var act models.ActionType
  26. if comment.Type == models.CommentTypeClose {
  27. act = models.ActionCloseIssue
  28. } else if comment.Type == models.CommentTypeReopen {
  29. act = models.ActionReopenIssue
  30. } else if comment.Type == models.CommentTypeComment {
  31. act = models.ActionCommentIssue
  32. } else if comment.Type == models.CommentTypeCode {
  33. act = models.ActionCommentIssue
  34. } else if comment.Type == models.CommentTypePullPush {
  35. act = 0
  36. }
  37. if err := mailer.MailParticipantsComment(comment, act, issue, mentions); err != nil {
  38. log.Error("MailParticipantsComment: %v", err)
  39. }
  40. }
  41. func (m *mailNotifier) NotifyNewIssue(issue *models.Issue, mentions []*user_model.User) {
  42. if err := mailer.MailParticipants(issue, issue.Poster, models.ActionCreateIssue, mentions); err != nil {
  43. log.Error("MailParticipants: %v", err)
  44. }
  45. }
  46. func (m *mailNotifier) NotifyIssueChangeStatus(doer *user_model.User, issue *models.Issue, actionComment *models.Comment, isClosed bool) {
  47. var actionType models.ActionType
  48. if issue.IsPull {
  49. if isClosed {
  50. actionType = models.ActionClosePullRequest
  51. } else {
  52. actionType = models.ActionReopenPullRequest
  53. }
  54. } else {
  55. if isClosed {
  56. actionType = models.ActionCloseIssue
  57. } else {
  58. actionType = models.ActionReopenIssue
  59. }
  60. }
  61. if err := mailer.MailParticipants(issue, doer, actionType, nil); err != nil {
  62. log.Error("MailParticipants: %v", err)
  63. }
  64. }
  65. func (m *mailNotifier) NotifyIssueChangeTitle(doer *user_model.User, issue *models.Issue, oldTitle string) {
  66. if err := issue.LoadPullRequest(); err != nil {
  67. log.Error("issue.LoadPullRequest: %v", err)
  68. return
  69. }
  70. if issue.IsPull && models.HasWorkInProgressPrefix(oldTitle) && !issue.PullRequest.IsWorkInProgress() {
  71. if err := mailer.MailParticipants(issue, doer, models.ActionPullRequestReadyForReview, nil); err != nil {
  72. log.Error("MailParticipants: %v", err)
  73. }
  74. }
  75. }
  76. func (m *mailNotifier) NotifyNewPullRequest(pr *models.PullRequest, mentions []*user_model.User) {
  77. if err := mailer.MailParticipants(pr.Issue, pr.Issue.Poster, models.ActionCreatePullRequest, mentions); err != nil {
  78. log.Error("MailParticipants: %v", err)
  79. }
  80. }
  81. func (m *mailNotifier) NotifyPullRequestReview(pr *models.PullRequest, r *models.Review, comment *models.Comment, mentions []*user_model.User) {
  82. var act models.ActionType
  83. if comment.Type == models.CommentTypeClose {
  84. act = models.ActionCloseIssue
  85. } else if comment.Type == models.CommentTypeReopen {
  86. act = models.ActionReopenIssue
  87. } else if comment.Type == models.CommentTypeComment {
  88. act = models.ActionCommentPull
  89. }
  90. if err := mailer.MailParticipantsComment(comment, act, pr.Issue, mentions); err != nil {
  91. log.Error("MailParticipantsComment: %v", err)
  92. }
  93. }
  94. func (m *mailNotifier) NotifyPullRequestCodeComment(pr *models.PullRequest, comment *models.Comment, mentions []*user_model.User) {
  95. if err := mailer.MailMentionsComment(pr, comment, mentions); err != nil {
  96. log.Error("MailMentionsComment: %v", err)
  97. }
  98. }
  99. func (m *mailNotifier) NotifyIssueChangeAssignee(doer *user_model.User, issue *models.Issue, assignee *user_model.User, removed bool, comment *models.Comment) {
  100. // mail only sent to added assignees and not self-assignee
  101. if !removed && doer.ID != assignee.ID && assignee.EmailNotifications() == user_model.EmailNotificationsEnabled {
  102. ct := fmt.Sprintf("Assigned #%d.", issue.Index)
  103. if err := mailer.SendIssueAssignedMail(issue, doer, ct, comment, []*user_model.User{assignee}); err != nil {
  104. log.Error("Error in SendIssueAssignedMail for issue[%d] to assignee[%d]: %v", issue.ID, assignee.ID, err)
  105. }
  106. }
  107. }
  108. func (m *mailNotifier) NotifyPullReviewRequest(doer *user_model.User, issue *models.Issue, reviewer *user_model.User, isRequest bool, comment *models.Comment) {
  109. if isRequest && doer.ID != reviewer.ID && reviewer.EmailNotifications() == user_model.EmailNotificationsEnabled {
  110. ct := fmt.Sprintf("Requested to review %s.", issue.HTMLURL())
  111. if err := mailer.SendIssueAssignedMail(issue, doer, ct, comment, []*user_model.User{reviewer}); err != nil {
  112. log.Error("Error in SendIssueAssignedMail for issue[%d] to reviewer[%d]: %v", issue.ID, reviewer.ID, err)
  113. }
  114. }
  115. }
  116. func (m *mailNotifier) NotifyMergePullRequest(pr *models.PullRequest, doer *user_model.User) {
  117. if err := pr.LoadIssue(); err != nil {
  118. log.Error("pr.LoadIssue: %v", err)
  119. return
  120. }
  121. if err := mailer.MailParticipants(pr.Issue, doer, models.ActionMergePullRequest, nil); err != nil {
  122. log.Error("MailParticipants: %v", err)
  123. }
  124. }
  125. func (m *mailNotifier) NotifyPullRequestPushCommits(doer *user_model.User, pr *models.PullRequest, comment *models.Comment) {
  126. var err error
  127. if err = comment.LoadIssue(); err != nil {
  128. log.Error("comment.LoadIssue: %v", err)
  129. return
  130. }
  131. if err = comment.Issue.LoadRepo(); err != nil {
  132. log.Error("comment.Issue.LoadRepo: %v", err)
  133. return
  134. }
  135. if err = comment.Issue.LoadPullRequest(); err != nil {
  136. log.Error("comment.Issue.LoadPullRequest: %v", err)
  137. return
  138. }
  139. if err = comment.Issue.PullRequest.LoadBaseRepo(); err != nil {
  140. log.Error("comment.Issue.PullRequest.LoadBaseRepo: %v", err)
  141. return
  142. }
  143. if err := comment.LoadPushCommits(); err != nil {
  144. log.Error("comment.LoadPushCommits: %v", err)
  145. }
  146. m.NotifyCreateIssueComment(doer, comment.Issue.Repo, comment.Issue, comment, nil)
  147. }
  148. func (m *mailNotifier) NotifyPullRevieweDismiss(doer *user_model.User, review *models.Review, comment *models.Comment) {
  149. if err := mailer.MailParticipantsComment(comment, models.ActionPullReviewDismissed, review.Issue, nil); err != nil {
  150. log.Error("MailParticipantsComment: %v", err)
  151. }
  152. }
  153. func (m *mailNotifier) NotifyNewRelease(rel *models.Release) {
  154. if err := rel.LoadAttributes(); err != nil {
  155. log.Error("NotifyNewRelease: %v", err)
  156. return
  157. }
  158. if rel.IsDraft || rel.IsPrerelease {
  159. return
  160. }
  161. mailer.MailNewRelease(rel)
  162. }
  163. func (m *mailNotifier) NotifyRepoPendingTransfer(doer, newOwner *user_model.User, repo *models.Repository) {
  164. if err := mailer.SendRepoTransferNotifyMail(doer, newOwner, repo); err != nil {
  165. log.Error("NotifyRepoPendingTransfer: %v", err)
  166. }
  167. }