diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2018-10-18 19:23:05 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-18 19:23:05 +0800 |
commit | ea619b39b2f2a3c1fb5ad28ebd4a269b2f822111 (patch) | |
tree | ef101ad2b39dc5be1744e4488bcdd5beab16e45d /modules/notification/notification.go | |
parent | dd62ca7ba9b49e799a8bea896cff1b209f813b7e (diff) | |
download | gitea-ea619b39b2f2a3c1fb5ad28ebd4a269b2f822111.tar.gz gitea-ea619b39b2f2a3c1fb5ad28ebd4a269b2f822111.zip |
Add notification interface and refactor UI notifications (#5085)
* add notification interface and refactor UI notifications
* add missing methods on notification interface and notifiy only issue status really changed
* implement NotifyPullRequestReview for ui notification
Diffstat (limited to 'modules/notification/notification.go')
-rw-r--r-- | modules/notification/notification.go | 181 |
1 files changed, 153 insertions, 28 deletions
diff --git a/modules/notification/notification.go b/modules/notification/notification.go index ffe885240b..3f3579394e 100644 --- a/modules/notification/notification.go +++ b/modules/notification/notification.go @@ -1,50 +1,175 @@ -// Copyright 2016 The Gitea Authors. All rights reserved. +// Copyright 2018 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 notification import ( + "code.gitea.io/git" "code.gitea.io/gitea/models" - "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/notification/base" + "code.gitea.io/gitea/modules/notification/ui" ) -type ( - notificationService struct { - issueQueue chan issueNotificationOpts +var ( + notifiers []base.Notifier +) + +// RegisterNotifier providers method to receive notify messages +func RegisterNotifier(notifier base.Notifier) { + go notifier.Run() + notifiers = append(notifiers, notifier) +} + +func init() { + RegisterNotifier(ui.NewNotifier()) +} + +// NotifyCreateIssueComment notifies issue comment related message to notifiers +func NotifyCreateIssueComment(doer *models.User, repo *models.Repository, + issue *models.Issue, comment *models.Comment) { + for _, notifier := range notifiers { + notifier.NotifyCreateIssueComment(doer, repo, issue, comment) } +} - issueNotificationOpts struct { - issue *models.Issue - notificationAuthorID int64 +// NotifyNewIssue notifies new issue to notifiers +func NotifyNewIssue(issue *models.Issue) { + for _, notifier := range notifiers { + notifier.NotifyNewIssue(issue) } -) +} -var ( - // Service is the notification service - Service = ¬ificationService{ - issueQueue: make(chan issueNotificationOpts, 100), +// NotifyIssueChangeStatus notifies close or reopen issue to notifiers +func NotifyIssueChangeStatus(doer *models.User, issue *models.Issue, closeOrReopen bool) { + for _, notifier := range notifiers { + notifier.NotifyIssueChangeStatus(doer, issue, closeOrReopen) } -) +} -func init() { - go Service.Run() +// NotifyMergePullRequest notifies merge pull request to notifiers +func NotifyMergePullRequest(pr *models.PullRequest, doer *models.User, baseGitRepo *git.Repository) { + for _, notifier := range notifiers { + notifier.NotifyMergePullRequest(pr, doer, baseGitRepo) + } +} + +// NotifyNewPullRequest notifies new pull request to notifiers +func NotifyNewPullRequest(pr *models.PullRequest) { + for _, notifier := range notifiers { + notifier.NotifyNewPullRequest(pr) + } +} + +// NotifyPullRequestReview notifies new pull request review +func NotifyPullRequestReview(pr *models.PullRequest, review *models.Review, comment *models.Comment) { + for _, notifier := range notifiers { + notifier.NotifyPullRequestReview(pr, review, comment) + } +} + +// NotifyUpdateComment notifies update comment to notifiers +func NotifyUpdateComment(doer *models.User, c *models.Comment, oldContent string) { + for _, notifier := range notifiers { + notifier.NotifyUpdateComment(doer, c, oldContent) + } +} + +// NotifyDeleteComment notifies delete comment to notifiers +func NotifyDeleteComment(doer *models.User, c *models.Comment) { + for _, notifier := range notifiers { + notifier.NotifyDeleteComment(doer, c) + } +} + +// NotifyDeleteRepository notifies delete repository to notifiers +func NotifyDeleteRepository(doer *models.User, repo *models.Repository) { + for _, notifier := range notifiers { + notifier.NotifyDeleteRepository(doer, repo) + } +} + +// NotifyForkRepository notifies fork repository to notifiers +func NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) { + for _, notifier := range notifiers { + notifier.NotifyForkRepository(doer, oldRepo, repo) + } +} + +// NotifyNewRelease notifies new release to notifiers +func NotifyNewRelease(rel *models.Release) { + for _, notifier := range notifiers { + notifier.NotifyNewRelease(rel) + } +} + +// NotifyUpdateRelease notifies update release to notifiers +func NotifyUpdateRelease(doer *models.User, rel *models.Release) { + for _, notifier := range notifiers { + notifier.NotifyUpdateRelease(doer, rel) + } +} + +// NotifyDeleteRelease notifies delete release to notifiers +func NotifyDeleteRelease(doer *models.User, rel *models.Release) { + for _, notifier := range notifiers { + notifier.NotifyDeleteRelease(doer, rel) + } +} + +// NotifyIssueChangeMilestone notifies change milestone to notifiers +func NotifyIssueChangeMilestone(doer *models.User, issue *models.Issue) { + for _, notifier := range notifiers { + notifier.NotifyIssueChangeMilestone(doer, issue) + } +} + +// NotifyIssueChangeContent notifies change content to notifiers +func NotifyIssueChangeContent(doer *models.User, issue *models.Issue, oldContent string) { + for _, notifier := range notifiers { + notifier.NotifyIssueChangeContent(doer, issue, oldContent) + } +} + +// NotifyIssueChangeAssignee notifies change content to notifiers +func NotifyIssueChangeAssignee(doer *models.User, issue *models.Issue, removed bool) { + for _, notifier := range notifiers { + notifier.NotifyIssueChangeAssignee(doer, issue, removed) + } +} + +// NotifyIssueClearLabels notifies clear labels to notifiers +func NotifyIssueClearLabels(doer *models.User, issue *models.Issue) { + for _, notifier := range notifiers { + notifier.NotifyIssueClearLabels(doer, issue) + } +} + +// NotifyIssueChangeTitle notifies change title to notifiers +func NotifyIssueChangeTitle(doer *models.User, issue *models.Issue, oldTitle string) { + for _, notifier := range notifiers { + notifier.NotifyIssueChangeTitle(doer, issue, oldTitle) + } +} + +// NotifyIssueChangeLabels notifies change labels to notifiers +func NotifyIssueChangeLabels(doer *models.User, issue *models.Issue, + addedLabels []*models.Label, removedLabels []*models.Label) { + for _, notifier := range notifiers { + notifier.NotifyIssueChangeLabels(doer, issue, addedLabels, removedLabels) + } } -func (ns *notificationService) Run() { - for { - select { - case opts := <-ns.issueQueue: - if err := models.CreateOrUpdateIssueNotifications(opts.issue, opts.notificationAuthorID); err != nil { - log.Error(4, "Was unable to create issue notification: %v", err) - } - } +// NotifyCreateRepository notifies create repository to notifiers +func NotifyCreateRepository(doer *models.User, u *models.User, repo *models.Repository) { + for _, notifier := range notifiers { + notifier.NotifyCreateRepository(doer, u, repo) } } -func (ns *notificationService) NotifyIssue(issue *models.Issue, notificationAuthorID int64) { - ns.issueQueue <- issueNotificationOpts{ - issue, - notificationAuthorID, +// NotifyMigrateRepository notifies create repository to notifiers +func NotifyMigrateRepository(doer *models.User, u *models.User, repo *models.Repository) { + for _, notifier := range notifiers { + notifier.NotifyMigrateRepository(doer, u, repo) } } |