From c50a4e9321cf3e9f702ceb8bdbb367a6372e6a93 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 1 Oct 2019 00:33:04 +0800 Subject: [PATCH 1/3] move clearlabels from models to issue service --- models/issue.go | 34 --------------- modules/notification/notification.go | 2 + modules/notification/webhook/webhook.go | 57 +++++++++++++++++++++++++ routers/api/v1/repo/issue_label.go | 3 +- routers/repo/issue_label.go | 3 +- services/issue/label.go | 27 ++++++++++++ 6 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 modules/notification/webhook/webhook.go create mode 100644 services/issue/label.go diff --git a/models/issue.go b/models/issue.go index da98fac7df367..e9346d87610a2 100644 --- a/models/issue.go +++ b/models/issue.go @@ -595,40 +595,6 @@ func (issue *Issue) ClearLabels(doer *User) (err error) { if err = sess.Commit(); err != nil { return fmt.Errorf("Commit: %v", err) } - sess.Close() - - if err = issue.LoadPoster(); err != nil { - return fmt.Errorf("loadPoster: %v", err) - } - - mode, _ := AccessLevel(issue.Poster, issue.Repo) - if issue.IsPull { - err = issue.PullRequest.LoadIssue() - if err != nil { - log.Error("LoadIssue: %v", err) - return - } - err = PrepareWebhooks(issue.Repo, HookEventPullRequest, &api.PullRequestPayload{ - Action: api.HookIssueLabelCleared, - Index: issue.Index, - PullRequest: issue.PullRequest.APIFormat(), - Repository: issue.Repo.APIFormat(mode), - Sender: doer.APIFormat(), - }) - } else { - err = PrepareWebhooks(issue.Repo, HookEventIssues, &api.IssuePayload{ - Action: api.HookIssueLabelCleared, - Index: issue.Index, - Issue: issue.APIFormat(), - Repository: issue.Repo.APIFormat(mode), - Sender: doer.APIFormat(), - }) - } - if err != nil { - log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) - } else { - go HookQueue.Add(issue.RepoID) - } return nil } diff --git a/modules/notification/notification.go b/modules/notification/notification.go index e0de88346d75f..06220ecb04019 100644 --- a/modules/notification/notification.go +++ b/modules/notification/notification.go @@ -11,6 +11,7 @@ import ( "code.gitea.io/gitea/modules/notification/indexer" "code.gitea.io/gitea/modules/notification/mail" "code.gitea.io/gitea/modules/notification/ui" + "code.gitea.io/gitea/modules/notification/webhook" ) var ( @@ -27,6 +28,7 @@ func init() { RegisterNotifier(ui.NewNotifier()) RegisterNotifier(mail.NewNotifier()) RegisterNotifier(indexer.NewNotifier()) + RegisterNotifier(webhook.NewNotifier()) } // NotifyCreateIssueComment notifies issue comment related message to notifiers diff --git a/modules/notification/webhook/webhook.go b/modules/notification/webhook/webhook.go new file mode 100644 index 0000000000000..fc08ebc3b930e --- /dev/null +++ b/modules/notification/webhook/webhook.go @@ -0,0 +1,57 @@ +// 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 webhook + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/notification/base" + api "code.gitea.io/gitea/modules/structs" +) + +type webhookNotifier struct { + base.NullNotifier +} + +var ( + _ base.Notifier = &webhookNotifier{} +) + +// NewNotifier create a new mailNotifier notifier +func NewNotifier() base.Notifier { + return &webhookNotifier{} +} + +func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *models.Issue) { + mode, _ := models.AccessLevel(issue.Poster, issue.Repo) + var err error + if issue.IsPull { + if err = issue.LoadPullRequest(); err != nil { + log.Error("LoadPullRequest: %v", err) + return + } + + err = models.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ + Action: api.HookIssueLabelCleared, + Index: issue.Index, + PullRequest: issue.PullRequest.APIFormat(), + Repository: issue.Repo.APIFormat(mode), + Sender: doer.APIFormat(), + }) + } else { + err = models.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{ + Action: api.HookIssueLabelCleared, + Index: issue.Index, + Issue: issue.APIFormat(), + Repository: issue.Repo.APIFormat(mode), + Sender: doer.APIFormat(), + }) + } + if err != nil { + log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) + } else { + go models.HookQueue.Add(issue.RepoID) + } +} diff --git a/routers/api/v1/repo/issue_label.go b/routers/api/v1/repo/issue_label.go index e66bc35e90b42..7bd76c24c23cf 100644 --- a/routers/api/v1/repo/issue_label.go +++ b/routers/api/v1/repo/issue_label.go @@ -9,6 +9,7 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/context" api "code.gitea.io/gitea/modules/structs" + issue_service "code.gitea.io/gitea/services/issue" ) // ListIssueLabels list all the labels of an issue @@ -314,7 +315,7 @@ func ClearIssueLabels(ctx *context.APIContext) { return } - if err := issue.ClearLabels(ctx.User); err != nil { + if err := issue_service.ClearLabels(issue, ctx.User); err != nil { ctx.Error(500, "ClearLabels", err) return } diff --git a/routers/repo/issue_label.go b/routers/repo/issue_label.go index 452a0a4c0c3ee..53c37e2e9762f 100644 --- a/routers/repo/issue_label.go +++ b/routers/repo/issue_label.go @@ -10,6 +10,7 @@ import ( "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/log" + issue_service "code.gitea.io/gitea/services/issue" ) const ( @@ -132,7 +133,7 @@ func UpdateIssueLabel(ctx *context.Context) { switch action := ctx.Query("action"); action { case "clear": for _, issue := range issues { - if err := issue.ClearLabels(ctx.User); err != nil { + if err := issue_service.ClearLabels(issue, ctx.User); err != nil { ctx.ServerError("ClearLabels", err) return } diff --git a/services/issue/label.go b/services/issue/label.go new file mode 100644 index 0000000000000..025f192cdcef2 --- /dev/null +++ b/services/issue/label.go @@ -0,0 +1,27 @@ +// 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 issue + +import ( + "fmt" + + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/notification" +) + +// ClearLabels clear an issue's all labels +func ClearLabels(issue *models.Issue, doer *models.User) (err error) { + if err = issue.ClearLabels(doer); err != nil { + return + } + + if err = issue.LoadPoster(); err != nil { + return fmt.Errorf("loadPoster: %v", err) + } + + notification.NotifyIssueClearLabels(doer, issue) + + return nil +} From 9118e16ebe9eab4bdd7e5d93cc5ed1303253c3e9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 1 Oct 2019 00:41:31 +0800 Subject: [PATCH 2/3] improve code --- modules/notification/webhook/webhook.go | 10 ++++++++++ services/issue/label.go | 6 ------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/notification/webhook/webhook.go b/modules/notification/webhook/webhook.go index fc08ebc3b930e..bfd089483ed9d 100644 --- a/modules/notification/webhook/webhook.go +++ b/modules/notification/webhook/webhook.go @@ -25,6 +25,16 @@ func NewNotifier() base.Notifier { } func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *models.Issue) { + if err := issue.LoadPoster(); err != nil { + log.Error("loadPoster: %v", err) + return + } + + if err := issue.LoadRepo(); err != nil { + log.Error("LoadRepo: %v", err) + return + } + mode, _ := models.AccessLevel(issue.Poster, issue.Repo) var err error if issue.IsPull { diff --git a/services/issue/label.go b/services/issue/label.go index 025f192cdcef2..f77ff307fe327 100644 --- a/services/issue/label.go +++ b/services/issue/label.go @@ -5,8 +5,6 @@ package issue import ( - "fmt" - "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/notification" ) @@ -17,10 +15,6 @@ func ClearLabels(issue *models.Issue, doer *models.User) (err error) { return } - if err = issue.LoadPoster(); err != nil { - return fmt.Errorf("loadPoster: %v", err) - } - notification.NotifyIssueClearLabels(doer, issue) return nil From 439aba27c152bb30793fa104df36b4bda39e0789 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 15 Oct 2019 10:00:14 +0800 Subject: [PATCH 3/3] Apply suggestions from code review Co-Authored-By: zeripath --- modules/notification/webhook/webhook.go | 2 +- services/issue/label.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/notification/webhook/webhook.go b/modules/notification/webhook/webhook.go index bfd089483ed9d..33adfaa739ba7 100644 --- a/modules/notification/webhook/webhook.go +++ b/modules/notification/webhook/webhook.go @@ -19,7 +19,7 @@ var ( _ base.Notifier = &webhookNotifier{} ) -// NewNotifier create a new mailNotifier notifier +// NewNotifier create a new webhookNotifier notifier func NewNotifier() base.Notifier { return &webhookNotifier{} } diff --git a/services/issue/label.go b/services/issue/label.go index f77ff307fe327..4af8c2b97e04a 100644 --- a/services/issue/label.go +++ b/services/issue/label.go @@ -9,7 +9,7 @@ import ( "code.gitea.io/gitea/modules/notification" ) -// ClearLabels clear an issue's all labels +// ClearLabels clears all of an issue's labels func ClearLabels(issue *models.Issue, doer *models.User) (err error) { if err = issue.ClearLabels(doer); err != nil { return