aboutsummaryrefslogtreecommitdiffstats
path: root/services/webhook/notifier.go
diff options
context:
space:
mode:
Diffstat (limited to 'services/webhook/notifier.go')
-rw-r--r--services/webhook/notifier.go165
1 files changed, 82 insertions, 83 deletions
diff --git a/services/webhook/notifier.go b/services/webhook/notifier.go
index 9e3f21de29..672abd5c95 100644
--- a/services/webhook/notifier.go
+++ b/services/webhook/notifier.go
@@ -5,10 +5,8 @@ package webhook
import (
"context"
- "fmt"
actions_model "code.gitea.io/gitea/models/actions"
- "code.gitea.io/gitea/models/db"
git_model "code.gitea.io/gitea/models/git"
issues_model "code.gitea.io/gitea/models/issues"
"code.gitea.io/gitea/models/organization"
@@ -18,6 +16,7 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/httplib"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/repository"
@@ -295,6 +294,43 @@ func (m *webhookNotifier) NewIssue(ctx context.Context, issue *issues_model.Issu
}
}
+func (m *webhookNotifier) DeleteIssue(ctx context.Context, doer *user_model.User, issue *issues_model.Issue) {
+ permission, _ := access_model.GetUserRepoPermission(ctx, issue.Repo, doer)
+ if issue.IsPull {
+ if err := issue.LoadPullRequest(ctx); err != nil {
+ log.Error("LoadPullRequest: %v", err)
+ return
+ }
+ if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{
+ Action: api.HookIssueDeleted,
+ Index: issue.Index,
+ PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, doer),
+ Repository: convert.ToRepo(ctx, issue.Repo, permission),
+ Sender: convert.ToUser(ctx, doer, nil),
+ }); err != nil {
+ log.Error("PrepareWebhooks: %v", err)
+ }
+ } else {
+ if err := issue.LoadRepo(ctx); err != nil {
+ log.Error("issue.LoadRepo: %v", err)
+ return
+ }
+ if err := issue.LoadPoster(ctx); err != nil {
+ log.Error("issue.LoadPoster: %v", err)
+ return
+ }
+ if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, &api.IssuePayload{
+ Action: api.HookIssueDeleted,
+ Index: issue.Index,
+ Issue: convert.ToAPIIssue(ctx, issue.Poster, issue),
+ Repository: convert.ToRepo(ctx, issue.Repo, permission),
+ Sender: convert.ToUser(ctx, doer, nil),
+ }); err != nil {
+ log.Error("PrepareWebhooks: %v", err)
+ }
+ }
+}
+
func (m *webhookNotifier) NewPullRequest(ctx context.Context, pull *issues_model.PullRequest, mentions []*user_model.User) {
if err := pull.LoadIssue(ctx); err != nil {
log.Error("pull.LoadIssue: %v", err)
@@ -956,72 +992,61 @@ func (*webhookNotifier) WorkflowJobStatusUpdate(ctx context.Context, repo *repo_
org = convert.ToOrganization(ctx, organization.OrgFromUser(repo.Owner))
}
- err := job.LoadAttributes(ctx)
+ status, _ := convert.ToActionsStatus(job.Status)
+
+ convertedJob, err := convert.ToActionWorkflowJob(ctx, repo, task, job)
if err != nil {
- log.Error("Error loading job attributes: %v", err)
+ log.Error("ToActionWorkflowJob: %v", err)
return
}
- jobIndex := 0
- jobs, err := actions_model.GetRunJobsByRunID(ctx, job.RunID)
+ if err := PrepareWebhooks(ctx, source, webhook_module.HookEventWorkflowJob, &api.WorkflowJobPayload{
+ Action: status,
+ WorkflowJob: convertedJob,
+ Organization: org,
+ Repo: convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm.AccessModeOwner}),
+ Sender: convert.ToUser(ctx, sender, nil),
+ }); err != nil {
+ log.Error("PrepareWebhooks: %v", err)
+ }
+}
+
+func (*webhookNotifier) WorkflowRunStatusUpdate(ctx context.Context, repo *repo_model.Repository, sender *user_model.User, run *actions_model.ActionRun) {
+ source := EventSource{
+ Repository: repo,
+ Owner: repo.Owner,
+ }
+
+ var org *api.Organization
+ if repo.Owner.IsOrganization() {
+ org = convert.ToOrganization(ctx, organization.OrgFromUser(repo.Owner))
+ }
+
+ status := convert.ToWorkflowRunAction(run.Status)
+
+ gitRepo, err := gitrepo.OpenRepository(ctx, repo)
if err != nil {
- log.Error("Error loading getting run jobs: %v", err)
+ log.Error("OpenRepository: %v", err)
return
}
- for i, j := range jobs {
- if j.ID == job.ID {
- jobIndex = i
- break
- }
- }
+ defer gitRepo.Close()
- status, conclusion := toActionStatus(job.Status)
- var runnerID int64
- var runnerName string
- var steps []*api.ActionWorkflowStep
+ convertedWorkflow, err := convert.GetActionWorkflow(ctx, gitRepo, repo, run.WorkflowID)
+ if err != nil {
+ log.Error("GetActionWorkflow: %v", err)
+ return
+ }
- if task != nil {
- runnerID = task.RunnerID
- if runner, ok, _ := db.GetByID[actions_model.ActionRunner](ctx, runnerID); ok {
- runnerName = runner.Name
- }
- for i, step := range task.Steps {
- stepStatus, stepConclusion := toActionStatus(job.Status)
- steps = append(steps, &api.ActionWorkflowStep{
- Name: step.Name,
- Number: int64(i),
- Status: stepStatus,
- Conclusion: stepConclusion,
- StartedAt: step.Started.AsTime().UTC(),
- CompletedAt: step.Stopped.AsTime().UTC(),
- })
- }
+ convertedRun, err := convert.ToActionWorkflowRun(ctx, repo, run)
+ if err != nil {
+ log.Error("ToActionWorkflowRun: %v", err)
+ return
}
- if err := PrepareWebhooks(ctx, source, webhook_module.HookEventWorkflowJob, &api.WorkflowJobPayload{
- Action: status,
- WorkflowJob: &api.ActionWorkflowJob{
- ID: job.ID,
- // missing api endpoint for this location
- URL: fmt.Sprintf("%s/actions/runs/%d/jobs/%d", repo.APIURL(), job.RunID, job.ID),
- HTMLURL: fmt.Sprintf("%s/jobs/%d", job.Run.HTMLURL(), jobIndex),
- RunID: job.RunID,
- // Missing api endpoint for this location, artifacts are available under a nested url
- RunURL: fmt.Sprintf("%s/actions/runs/%d", repo.APIURL(), job.RunID),
- Name: job.Name,
- Labels: job.RunsOn,
- RunAttempt: job.Attempt,
- HeadSha: job.Run.CommitSHA,
- HeadBranch: git.RefName(job.Run.Ref).BranchName(),
- Status: status,
- Conclusion: conclusion,
- RunnerID: runnerID,
- RunnerName: runnerName,
- Steps: steps,
- CreatedAt: job.Created.AsTime().UTC(),
- StartedAt: job.Started.AsTime().UTC(),
- CompletedAt: job.Stopped.AsTime().UTC(),
- },
+ if err := PrepareWebhooks(ctx, source, webhook_module.HookEventWorkflowRun, &api.WorkflowRunPayload{
+ Action: status,
+ Workflow: convertedWorkflow,
+ WorkflowRun: convertedRun,
Organization: org,
Repo: convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm.AccessModeOwner}),
Sender: convert.ToUser(ctx, sender, nil),
@@ -1029,29 +1054,3 @@ func (*webhookNotifier) WorkflowJobStatusUpdate(ctx context.Context, repo *repo_
log.Error("PrepareWebhooks: %v", err)
}
}
-
-func toActionStatus(status actions_model.Status) (string, string) {
- var action string
- var conclusion string
- switch status {
- // This is a naming conflict of the webhook between Gitea and GitHub Actions
- case actions_model.StatusWaiting:
- action = "queued"
- case actions_model.StatusBlocked:
- action = "waiting"
- case actions_model.StatusRunning:
- action = "in_progress"
- }
- if status.IsDone() {
- action = "completed"
- switch status {
- case actions_model.StatusSuccess:
- conclusion = "success"
- case actions_model.StatusCancelled:
- conclusion = "cancelled"
- case actions_model.StatusFailure:
- conclusion = "failure"
- }
- }
- return action, conclusion
-}