You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

webhook.go 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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 webhook
  5. import (
  6. "code.gitea.io/gitea/models"
  7. "code.gitea.io/gitea/modules/log"
  8. "code.gitea.io/gitea/modules/notification/base"
  9. api "code.gitea.io/gitea/modules/structs"
  10. )
  11. type webhookNotifier struct {
  12. base.NullNotifier
  13. }
  14. var (
  15. _ base.Notifier = &webhookNotifier{}
  16. )
  17. // NewNotifier create a new webhookNotifier notifier
  18. func NewNotifier() base.Notifier {
  19. return &webhookNotifier{}
  20. }
  21. func (m *webhookNotifier) NotifyIssueClearLabels(doer *models.User, issue *models.Issue) {
  22. if err := issue.LoadPoster(); err != nil {
  23. log.Error("loadPoster: %v", err)
  24. return
  25. }
  26. if err := issue.LoadRepo(); err != nil {
  27. log.Error("LoadRepo: %v", err)
  28. return
  29. }
  30. mode, _ := models.AccessLevel(issue.Poster, issue.Repo)
  31. var err error
  32. if issue.IsPull {
  33. if err = issue.LoadPullRequest(); err != nil {
  34. log.Error("LoadPullRequest: %v", err)
  35. return
  36. }
  37. err = models.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{
  38. Action: api.HookIssueLabelCleared,
  39. Index: issue.Index,
  40. PullRequest: issue.PullRequest.APIFormat(),
  41. Repository: issue.Repo.APIFormat(mode),
  42. Sender: doer.APIFormat(),
  43. })
  44. } else {
  45. err = models.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{
  46. Action: api.HookIssueLabelCleared,
  47. Index: issue.Index,
  48. Issue: issue.APIFormat(),
  49. Repository: issue.Repo.APIFormat(mode),
  50. Sender: doer.APIFormat(),
  51. })
  52. }
  53. if err != nil {
  54. log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err)
  55. } else {
  56. go models.HookQueue.Add(issue.RepoID)
  57. }
  58. }
  59. func (m *webhookNotifier) NotifyForkRepository(doer *models.User, oldRepo, repo *models.Repository) {
  60. oldMode, _ := models.AccessLevel(doer, oldRepo)
  61. mode, _ := models.AccessLevel(doer, repo)
  62. // forked webhook
  63. if err := models.PrepareWebhooks(oldRepo, models.HookEventFork, &api.ForkPayload{
  64. Forkee: oldRepo.APIFormat(oldMode),
  65. Repo: repo.APIFormat(mode),
  66. Sender: doer.APIFormat(),
  67. }); err != nil {
  68. log.Error("PrepareWebhooks [repo_id: %d]: %v", oldRepo.ID, err)
  69. } else {
  70. go models.HookQueue.Add(oldRepo.ID)
  71. }
  72. u := repo.MustOwner()
  73. // Add to hook queue for created repo after session commit.
  74. if u.IsOrganization() {
  75. if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
  76. Action: api.HookRepoCreated,
  77. Repository: repo.APIFormat(models.AccessModeOwner),
  78. Organization: u.APIFormat(),
  79. Sender: doer.APIFormat(),
  80. }); err != nil {
  81. log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
  82. } else {
  83. go models.HookQueue.Add(repo.ID)
  84. }
  85. }
  86. }
  87. func (m *webhookNotifier) NotifyCreateRepository(doer *models.User, u *models.User, repo *models.Repository) {
  88. // Add to hook queue for created repo after session commit.
  89. if u.IsOrganization() {
  90. if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
  91. Action: api.HookRepoCreated,
  92. Repository: repo.APIFormat(models.AccessModeOwner),
  93. Organization: u.APIFormat(),
  94. Sender: doer.APIFormat(),
  95. }); err != nil {
  96. log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
  97. } else {
  98. go models.HookQueue.Add(repo.ID)
  99. }
  100. }
  101. }
  102. func (m *webhookNotifier) NotifyDeleteRepository(doer *models.User, repo *models.Repository) {
  103. u := repo.MustOwner()
  104. if u.IsOrganization() {
  105. if err := models.PrepareWebhooks(repo, models.HookEventRepository, &api.RepositoryPayload{
  106. Action: api.HookRepoDeleted,
  107. Repository: repo.APIFormat(models.AccessModeOwner),
  108. Organization: u.APIFormat(),
  109. Sender: doer.APIFormat(),
  110. }); err != nil {
  111. log.Error("PrepareWebhooks [repo_id: %d]: %v", repo.ID, err)
  112. }
  113. go models.HookQueue.Add(repo.ID)
  114. }
  115. }