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 | |
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')
-rw-r--r-- | modules/notification/base/base.go | 43 | ||||
-rw-r--r-- | modules/notification/notification.go | 181 | ||||
-rw-r--r-- | modules/notification/ui/ui.go | 134 |
3 files changed, 330 insertions, 28 deletions
diff --git a/modules/notification/base/base.go b/modules/notification/base/base.go new file mode 100644 index 0000000000..bac90f5bb1 --- /dev/null +++ b/modules/notification/base/base.go @@ -0,0 +1,43 @@ +// 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 base + +import ( + "code.gitea.io/git" + "code.gitea.io/gitea/models" +) + +// Notifier defines an interface to notify receiver +type Notifier interface { + Run() + + NotifyCreateRepository(doer *models.User, u *models.User, repo *models.Repository) + NotifyMigrateRepository(doer *models.User, u *models.User, repo *models.Repository) + NotifyDeleteRepository(doer *models.User, repo *models.Repository) + NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) + + NotifyNewIssue(*models.Issue) + NotifyIssueChangeStatus(*models.User, *models.Issue, bool) + NotifyIssueChangeMilestone(doer *models.User, issue *models.Issue) + NotifyIssueChangeAssignee(doer *models.User, issue *models.Issue, removed bool) + NotifyIssueChangeContent(doer *models.User, issue *models.Issue, oldContent string) + NotifyIssueClearLabels(doer *models.User, issue *models.Issue) + NotifyIssueChangeTitle(doer *models.User, issue *models.Issue, oldTitle string) + NotifyIssueChangeLabels(doer *models.User, issue *models.Issue, + addedLabels []*models.Label, removedLabels []*models.Label) + + NotifyNewPullRequest(*models.PullRequest) + NotifyMergePullRequest(*models.PullRequest, *models.User, *git.Repository) + NotifyPullRequestReview(*models.PullRequest, *models.Review, *models.Comment) + + NotifyCreateIssueComment(*models.User, *models.Repository, + *models.Issue, *models.Comment) + NotifyUpdateComment(*models.User, *models.Comment, string) + NotifyDeleteComment(*models.User, *models.Comment) + + NotifyNewRelease(rel *models.Release) + NotifyUpdateRelease(doer *models.User, rel *models.Release) + NotifyDeleteRelease(doer *models.User, rel *models.Release) +} 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) } } diff --git a/modules/notification/ui/ui.go b/modules/notification/ui/ui.go new file mode 100644 index 0000000000..f0d708eb54 --- /dev/null +++ b/modules/notification/ui/ui.go @@ -0,0 +1,134 @@ +// 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 ui + +import ( + "code.gitea.io/git" + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/notification/base" +) + +type ( + notificationService struct { + issueQueue chan issueNotificationOpts + } + + issueNotificationOpts struct { + issue *models.Issue + notificationAuthorID int64 + } +) + +var ( + _ base.Notifier = ¬ificationService{} +) + +// NewNotifier create a new notificationService notifier +func NewNotifier() base.Notifier { + return ¬ificationService{ + issueQueue: make(chan issueNotificationOpts, 100), + } +} + +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) + } + } + } +} + +func (ns *notificationService) NotifyCreateIssueComment(doer *models.User, repo *models.Repository, + issue *models.Issue, comment *models.Comment) { + ns.issueQueue <- issueNotificationOpts{ + issue, + doer.ID, + } +} + +func (ns *notificationService) NotifyNewIssue(issue *models.Issue) { + ns.issueQueue <- issueNotificationOpts{ + issue, + issue.Poster.ID, + } +} + +func (ns *notificationService) NotifyIssueChangeStatus(doer *models.User, issue *models.Issue, isClosed bool) { + ns.issueQueue <- issueNotificationOpts{ + issue, + doer.ID, + } +} + +func (ns *notificationService) NotifyMergePullRequest(pr *models.PullRequest, doer *models.User, gitRepo *git.Repository) { + ns.issueQueue <- issueNotificationOpts{ + pr.Issue, + doer.ID, + } +} + +func (ns *notificationService) NotifyNewPullRequest(pr *models.PullRequest) { + ns.issueQueue <- issueNotificationOpts{ + pr.Issue, + pr.Issue.PosterID, + } +} + +func (ns *notificationService) NotifyPullRequestReview(pr *models.PullRequest, r *models.Review, c *models.Comment) { + ns.issueQueue <- issueNotificationOpts{ + pr.Issue, + r.Reviewer.ID, + } +} + +func (ns *notificationService) NotifyUpdateComment(doer *models.User, c *models.Comment, oldContent string) { +} + +func (ns *notificationService) NotifyDeleteComment(doer *models.User, c *models.Comment) { +} + +func (ns *notificationService) NotifyDeleteRepository(doer *models.User, repo *models.Repository) { +} + +func (ns *notificationService) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) { +} + +func (ns *notificationService) NotifyNewRelease(rel *models.Release) { +} + +func (ns *notificationService) NotifyUpdateRelease(doer *models.User, rel *models.Release) { +} + +func (ns *notificationService) NotifyDeleteRelease(doer *models.User, rel *models.Release) { +} + +func (ns *notificationService) NotifyIssueChangeMilestone(doer *models.User, issue *models.Issue) { +} + +func (ns *notificationService) NotifyIssueChangeContent(doer *models.User, issue *models.Issue, oldContent string) { +} + +func (ns *notificationService) NotifyIssueChangeAssignee(doer *models.User, issue *models.Issue, removed bool) { +} + +func (ns *notificationService) NotifyIssueClearLabels(doer *models.User, issue *models.Issue) { +} + +func (ns *notificationService) NotifyIssueChangeTitle(doer *models.User, issue *models.Issue, oldTitle string) { +} + +func (ns *notificationService) NotifyIssueChangeLabels(doer *models.User, issue *models.Issue, + addedLabels []*models.Label, removedLabels []*models.Label) { +} + +func (ns *notificationService) NotifyCreateRepository(doer *models.User, u *models.User, repo *models.Repository) { +} + +func (ns *notificationService) NotifyMigrateRepository(doer *models.User, u *models.User, repo *models.Repository) { +} |