From ae9b382963701aeb0f266c07d2dea65f76fd64e0 Mon Sep 17 00:00:00 2001 From: kolaente Date: Sat, 27 Jan 2024 00:16:17 +0100 Subject: [PATCH] fix(webhooks): make sure all events with tasks have the full task Resolves https://kolaente.dev/vikunja/api/issues/1676 --- pkg/models/listeners.go | 31 ++++++++++++++----------------- pkg/models/task_assignees.go | 7 ++++++- pkg/models/task_attachment.go | 14 ++++++++++++-- pkg/models/task_comments.go | 7 ++++++- pkg/models/task_relation.go | 14 ++++++++++++-- 5 files changed, 50 insertions(+), 23 deletions(-) diff --git a/pkg/models/listeners.go b/pkg/models/listeners.go index 445cf44ff3..7419dd6183 100644 --- a/pkg/models/listeners.go +++ b/pkg/models/listeners.go @@ -470,9 +470,9 @@ func (s *HandleTaskUpdateLastUpdated) Handle(msg *message.Message) (err error) { return err } - task, is := event["Task"].(map[string]interface{}) + task, is := event["task"].(map[string]interface{}) if !is { - log.Errorf("Event payload does not contain task ID") + log.Errorf("Event payload does not contain task") return } @@ -677,30 +677,28 @@ type WebhookPayload struct { Data interface{} `json:"data"` } +func getIDAsInt64(id interface{}) int64 { + switch v := id.(type) { + case int64: + return v + case float64: + return int64(v) + } + return id.(int64) +} + func getProjectIDFromAnyEvent(eventPayload map[string]interface{}) int64 { if task, has := eventPayload["task"]; has { t := task.(map[string]interface{}) if projectID, has := t["project_id"]; has { - switch v := projectID.(type) { - case int64: - return v - case float64: - return int64(v) - } - return projectID.(int64) + return getIDAsInt64(projectID) } } if project, has := eventPayload["project"]; has { t := project.(map[string]interface{}) if projectID, has := t["id"]; has { - switch v := projectID.(type) { - case int64: - return v - case float64: - return int64(v) - } - return projectID.(int64) + return getIDAsInt64(projectID) } } @@ -739,7 +737,6 @@ func (wl *WebhookListener) Handle(msg *message.Message) (err error) { break } } - } if webhook == nil { diff --git a/pkg/models/task_assignees.go b/pkg/models/task_assignees.go index 9b0f931339..a688c11e38 100644 --- a/pkg/models/task_assignees.go +++ b/pkg/models/task_assignees.go @@ -184,8 +184,13 @@ func (la *TaskAssginee) Delete(s *xorm.Session, a web.Auth) (err error) { } doer, _ := user.GetFromAuth(a) + task, err := GetTaskByIDSimple(s, la.TaskID) + if err != nil { + return err + } + return events.Dispatch(&TaskAssigneeDeletedEvent{ - Task: &Task{ID: la.TaskID}, + Task: &task, Assignee: &user.User{ID: la.UserID}, Doer: doer, }) diff --git a/pkg/models/task_attachment.go b/pkg/models/task_attachment.go index e587655eed..c069b207cd 100644 --- a/pkg/models/task_attachment.go +++ b/pkg/models/task_attachment.go @@ -86,8 +86,13 @@ func (ta *TaskAttachment) NewAttachment(s *xorm.Session, f io.ReadCloser, realna return err } + task, err := GetTaskByIDSimple(s, ta.TaskID) + if err != nil { + return err + } + return events.Dispatch(&TaskAttachmentCreatedEvent{ - Task: &Task{ID: ta.TaskID}, + Task: &task, Attachment: ta, Doer: ta.CreatedBy, }) @@ -220,8 +225,13 @@ func (ta *TaskAttachment) Delete(s *xorm.Session, a web.Auth) error { } doer, _ := user.GetFromAuth(a) + task, err := GetTaskByIDSimple(s, ta.TaskID) + if err != nil { + return err + } + return events.Dispatch(&TaskAttachmentDeletedEvent{ - Task: &Task{ID: ta.TaskID}, + Task: &task, Attachment: ta, Doer: doer, }) diff --git a/pkg/models/task_comments.go b/pkg/models/task_comments.go index b234b0d758..6c219a86ab 100644 --- a/pkg/models/task_comments.go +++ b/pkg/models/task_comments.go @@ -114,8 +114,13 @@ func (tc *TaskComment) Delete(s *xorm.Session, _ web.Auth) error { return err } + task, err := GetTaskByIDSimple(s, tc.TaskID) + if err != nil { + return err + } + return events.Dispatch(&TaskCommentDeletedEvent{ - Task: &Task{ID: tc.TaskID}, + Task: &task, Comment: tc, Doer: tc.Author, }) diff --git a/pkg/models/task_relation.go b/pkg/models/task_relation.go index 2715d15eeb..ff8973509c 100644 --- a/pkg/models/task_relation.go +++ b/pkg/models/task_relation.go @@ -201,8 +201,13 @@ func (rel *TaskRelation) Create(s *xorm.Session, a web.Auth) error { } doer, _ := user.GetFromAuth(a) + task, err := GetTaskByIDSimple(s, rel.TaskID) + if err != nil { + return err + } + return events.Dispatch(&TaskRelationCreatedEvent{ - Task: &Task{ID: rel.TaskID}, + Task: &task, Relation: rel, Doer: doer, }) @@ -261,8 +266,13 @@ func (rel *TaskRelation) Delete(s *xorm.Session, a web.Auth) error { } doer, _ := user.GetFromAuth(a) + task, err := GetTaskByIDSimple(s, rel.TaskID) + if err != nil { + return err + } + return events.Dispatch(&TaskRelationDeletedEvent{ - Task: &Task{ID: rel.TaskID}, + Task: &task, Relation: rel, Doer: doer, })