From 3eb289262f4759181068d79f9114e691d56072d3 Mon Sep 17 00:00:00 2001 From: kolaente Date: Mon, 2 Mar 2026 09:11:32 +0100 Subject: [PATCH] fix(events): defer task event dispatch until after transaction commit Convert events.Dispatch to events.DispatchOnCommit in Task.Create, updateSingleTask, Task.Delete, and triggerTaskUpdatedEventForTaskID. Events are now dispatched by the handler after s.Commit(), ensuring webhook listeners see committed data. Fixes #2315 --- pkg/models/tasks.go | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/pkg/models/tasks.go b/pkg/models/tasks.go index 084d26399..6eb4f8746 100644 --- a/pkg/models/tasks.go +++ b/pkg/models/tasks.go @@ -961,13 +961,10 @@ func createTask(s *xorm.Session, t *Task, a web.Auth, updateAssignees bool, setB } } - err = events.Dispatch(&TaskCreatedEvent{ + events.DispatchOnCommit(s, &TaskCreatedEvent{ Task: t, Doer: createdBy, }) - if err != nil { - return err - } err = updateProjectLastUpdated(s, &Project{ID: t.ProjectID}) return @@ -1381,13 +1378,10 @@ func (t *Task) updateSingleTask(s *xorm.Session, a web.Auth, fields []string) (e t.Updated = nt.Updated doer, _ := user.GetFromAuth(a) - err = events.Dispatch(&TaskUpdatedEvent{ + events.DispatchOnCommit(s, &TaskUpdatedEvent{ Task: t, Doer: doer, }) - if err != nil { - return err - } return updateProjectLastUpdated(s, &Project{ID: t.ProjectID}) } @@ -1826,13 +1820,10 @@ func (t *Task) Delete(s *xorm.Session, a web.Auth) (err error) { } doer, _ := user.GetFromAuth(a) - err = events.Dispatch(&TaskDeletedEvent{ + events.DispatchOnCommit(s, &TaskDeletedEvent{ Task: fullTask, Doer: doer, }) - if err != nil { - return - } err = updateProjectLastUpdated(s, &Project{ID: t.ProjectID}) return @@ -1897,9 +1888,9 @@ func triggerTaskUpdatedEventForTaskID(s *xorm.Session, auth web.Auth, taskID int } doer, _ := user.GetFromAuth(auth) - err = events.Dispatch(&TaskUpdatedEvent{ + events.DispatchOnCommit(s, &TaskUpdatedEvent{ Task: &t, Doer: doer, }) - return err + return nil }