| @@ -0,0 +1,77 @@ | |||
| // 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 action | |||
| import ( | |||
| "fmt" | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/notification/base" | |||
| ) | |||
| type actionNotifier struct { | |||
| base.NullNotifier | |||
| } | |||
| var ( | |||
| _ base.Notifier = &actionNotifier{} | |||
| ) | |||
| // NewNotifier create a new webhookNotifier notifier | |||
| func NewNotifier() base.Notifier { | |||
| return &actionNotifier{} | |||
| } | |||
| func (a *actionNotifier) NotifyNewIssue(issue *models.Issue) { | |||
| if err := issue.LoadPoster(); err != nil { | |||
| log.Error("issue.LoadPoster: %v", err) | |||
| return | |||
| } | |||
| if err := issue.LoadRepo(); err != nil { | |||
| log.Error("issue.LoadRepo: %v", err) | |||
| return | |||
| } | |||
| repo := issue.Repo | |||
| if err := models.NotifyWatchers(&models.Action{ | |||
| ActUserID: issue.Poster.ID, | |||
| ActUser: issue.Poster, | |||
| OpType: models.ActionCreateIssue, | |||
| Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title), | |||
| RepoID: repo.ID, | |||
| Repo: repo, | |||
| IsPrivate: repo.IsPrivate, | |||
| }); err != nil { | |||
| log.Error("NotifyWatchers: %v", err) | |||
| } | |||
| } | |||
| func (a *actionNotifier) NotifyNewPullRequest(pull *models.PullRequest) { | |||
| if err := pull.LoadIssue(); err != nil { | |||
| log.Error("pull.LoadIssue: %v", err) | |||
| return | |||
| } | |||
| if err := pull.Issue.LoadRepo(); err != nil { | |||
| log.Error("pull.Issue.LoadRepo: %v", err) | |||
| return | |||
| } | |||
| if err := pull.Issue.LoadPoster(); err != nil { | |||
| log.Error("pull.Issue.LoadPoster: %v", err) | |||
| return | |||
| } | |||
| if err := models.NotifyWatchers(&models.Action{ | |||
| ActUserID: pull.Issue.Poster.ID, | |||
| ActUser: pull.Issue.Poster, | |||
| OpType: models.ActionCreatePullRequest, | |||
| Content: fmt.Sprintf("%d|%s", pull.Issue.Index, pull.Issue.Title), | |||
| RepoID: pull.Issue.Repo.ID, | |||
| Repo: pull.Issue.Repo, | |||
| IsPrivate: pull.Issue.Repo.IsPrivate, | |||
| }); err != nil { | |||
| log.Error("NotifyWatchers: %v", err) | |||
| } | |||
| } | |||
| @@ -7,6 +7,7 @@ package notification | |||
| import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/git" | |||
| "code.gitea.io/gitea/modules/notification/action" | |||
| "code.gitea.io/gitea/modules/notification/base" | |||
| "code.gitea.io/gitea/modules/notification/indexer" | |||
| "code.gitea.io/gitea/modules/notification/mail" | |||
| @@ -33,6 +34,7 @@ func NewContext() { | |||
| } | |||
| RegisterNotifier(indexer.NewNotifier()) | |||
| RegisterNotifier(webhook.NewNotifier()) | |||
| RegisterNotifier(action.NewNotifier()) | |||
| } | |||
| // NotifyCreateIssueComment notifies issue comment related message to notifiers | |||
| @@ -10,6 +10,7 @@ import ( | |||
| "code.gitea.io/gitea/modules/notification/base" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| api "code.gitea.io/gitea/modules/structs" | |||
| "code.gitea.io/gitea/modules/webhook" | |||
| webhook_module "code.gitea.io/gitea/modules/webhook" | |||
| ) | |||
| @@ -251,6 +252,15 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(doer *models.User, issue *mode | |||
| } | |||
| func (m *webhookNotifier) NotifyNewIssue(issue *models.Issue) { | |||
| if err := issue.LoadRepo(); err != nil { | |||
| log.Error("issue.LoadRepo: %v", err) | |||
| return | |||
| } | |||
| if err := issue.LoadPoster(); err != nil { | |||
| log.Error("issue.LoadPoster: %v", err) | |||
| return | |||
| } | |||
| mode, _ := models.AccessLevel(issue.Poster, issue.Repo) | |||
| if err := webhook_module.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{ | |||
| Action: api.HookIssueOpened, | |||
| @@ -263,6 +273,32 @@ func (m *webhookNotifier) NotifyNewIssue(issue *models.Issue) { | |||
| } | |||
| } | |||
| func (m *webhookNotifier) NotifyNewPullRequest(pull *models.PullRequest) { | |||
| if err := pull.LoadIssue(); err != nil { | |||
| log.Error("pull.LoadIssue: %v", err) | |||
| return | |||
| } | |||
| if err := pull.Issue.LoadRepo(); err != nil { | |||
| log.Error("pull.Issue.LoadRepo: %v", err) | |||
| return | |||
| } | |||
| if err := pull.Issue.LoadPoster(); err != nil { | |||
| log.Error("pull.Issue.LoadPoster: %v", err) | |||
| return | |||
| } | |||
| mode, _ := models.AccessLevel(pull.Issue.Poster, pull.Issue.Repo) | |||
| if err := webhook.PrepareWebhooks(pull.Issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ | |||
| Action: api.HookIssueOpened, | |||
| Index: pull.Issue.Index, | |||
| PullRequest: pull.APIFormat(), | |||
| Repository: pull.Issue.Repo.APIFormat(mode), | |||
| Sender: pull.Issue.Poster.APIFormat(), | |||
| }); err != nil { | |||
| log.Error("PrepareWebhooks: %v", err) | |||
| } | |||
| } | |||
| func (m *webhookNotifier) NotifyIssueChangeContent(doer *models.User, issue *models.Issue, oldContent string) { | |||
| mode, _ := models.AccessLevel(issue.Poster, issue.Repo) | |||
| var err error | |||
| @@ -5,10 +5,7 @@ | |||
| package issue | |||
| import ( | |||
| "fmt" | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/notification" | |||
| ) | |||
| @@ -24,18 +21,6 @@ func NewIssue(repo *models.Repository, issue *models.Issue, labelIDs []int64, uu | |||
| } | |||
| } | |||
| if err := models.NotifyWatchers(&models.Action{ | |||
| ActUserID: issue.Poster.ID, | |||
| ActUser: issue.Poster, | |||
| OpType: models.ActionCreateIssue, | |||
| Content: fmt.Sprintf("%d|%s", issue.Index, issue.Title), | |||
| RepoID: repo.ID, | |||
| Repo: repo, | |||
| IsPrivate: repo.IsPrivate, | |||
| }); err != nil { | |||
| log.Error("NotifyWatchers: %v", err) | |||
| } | |||
| notification.NotifyNewIssue(issue) | |||
| return nil | |||
| @@ -10,6 +10,7 @@ import ( | |||
| "code.gitea.io/gitea/models" | |||
| "code.gitea.io/gitea/modules/git" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/notification" | |||
| api "code.gitea.io/gitea/modules/structs" | |||
| "code.gitea.io/gitea/modules/webhook" | |||
| issue_service "code.gitea.io/gitea/services/issue" | |||
| @@ -27,30 +28,10 @@ func NewPullRequest(repo *models.Repository, pull *models.Issue, labelIDs []int6 | |||
| } | |||
| } | |||
| if err := models.NotifyWatchers(&models.Action{ | |||
| ActUserID: pull.Poster.ID, | |||
| ActUser: pull.Poster, | |||
| OpType: models.ActionCreatePullRequest, | |||
| Content: fmt.Sprintf("%d|%s", pull.Index, pull.Title), | |||
| RepoID: repo.ID, | |||
| Repo: repo, | |||
| IsPrivate: repo.IsPrivate, | |||
| }); err != nil { | |||
| log.Error("NotifyWatchers: %v", err) | |||
| } | |||
| pr.Issue = pull | |||
| pull.PullRequest = pr | |||
| mode, _ := models.AccessLevel(pull.Poster, repo) | |||
| if err := webhook.PrepareWebhooks(repo, models.HookEventPullRequest, &api.PullRequestPayload{ | |||
| Action: api.HookIssueOpened, | |||
| Index: pull.Index, | |||
| PullRequest: pr.APIFormat(), | |||
| Repository: repo.APIFormat(mode), | |||
| Sender: pull.Poster.APIFormat(), | |||
| }); err != nil { | |||
| log.Error("PrepareWebhooks: %v", err) | |||
| } | |||
| notification.NotifyNewPullRequest(pr) | |||
| return nil | |||
| } | |||